700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【图像处理】OpenCV系列五 --- 图像对比度 亮度值调整

【图像处理】OpenCV系列五 --- 图像对比度 亮度值调整

时间:2021-12-20 18:36:08

相关推荐

【图像处理】OpenCV系列五 --- 图像对比度 亮度值调整

今天呢,我们一起学习一下,如何调整图像的对比度以及亮度。

一、原理

调整图像亮度与对比度所用的公式

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对图像进行处理,如果大家对相关领域感兴趣的话,可以关注我,我这边会为大家进行解答哦!如果大家需要相关学习资料的话,可以私聊我哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。