今天呢,我们一起学习一下,如何调整图像的对比度以及亮度。
一、原理
调整图像亮度与对比度所用的公式
g(i,j) = a * f(i,j) + b
其中,i 和 j 表示像素位于第i行 和 第j列 。
参数f(i,j)表示源图像像素。
参数g(i,j) 表示输出图像像素。
参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度。
参数b通常被称为偏置(bias),常常被用来控制图像的亮度。
二、访问图像像素的方式
1、通过指针进行遍历
//使用ptr遍历Mat 变量mat是一幅图像for (int row = 0; row < mat.rows; row++){for (int col = 0; col < mat.cols; col++){Vec3b *c = mat.ptr<Vec3b>(row, col);c->val[0] = 0;//Bc->val[1] = 255; //Gc->val[2] = 0;//R}}
2、通过at方法遍历
try{//使用at来遍历for (int row = 0; row < mat.rows; row++){for (int col = 0; col < mat.cols; col++){Vec3b &m = mat.at<Vec3b>(row, col);m[0] = 100;m[1] = 100;m[2] = 100;}}}catch (Exception &ex){cout << ex.what() << endl;}
3、通过迭代器遍历
auto it = mat.begin<Vec3b>();auto it_end = mat.end<Vec3b>();for (; it != it_end; it++){(*it).val[0] = 0; //B(*it).val[1] = 0; //G(*it).val[2] = 255; //R}
为了访问图像的每一个像素,我们使用这样的语法: mat.at<Vec3b>(row,col)[c]
其中,row是像素所在的行, col是像素所在的列, c是R、G、B(对应0、1、2)其中之一。
二、图像对比度亮度调整实例
/改变图像的对比度和亮度////@para a float 对比度 1.0~3.0///@para b int 亮度 0~100void ChangeGain(Mat &src, Mat &des, float a, int b){//g(r,c) = a*f(r,c) + bdes.create(src.rows, src.cols, src.type());for (int r = 0; r < src.rows; r++){for (int c = 0; c < src.cols; c++){for (int i = 0; i < 3; i++){des.at<Vec3b>(r, c)[i] = saturate_cast<uchar>(a * src.at<Vec3b>(r, c)[i] + b);}}}}
因为我们的运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),所以我们要用saturate_cast对结果进行转换,以确保它为有效值。
实例:
头文件、变量、函数声明
调整图像对比度与亮度
好了,今天的OpenCV学到这里就结束了,喜欢的朋友可以给我点个赞哦!!!
我是奕双,现在已经毕业将近两年了,从大学开始学编程,期间学习了C语言编程,C++语言编程,Win32编程,MFC编程,毕业之后进入一家图像处理相关领域的公司,掌握了用OpenCV对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!