今天终于可以坐下好好写个博客,看到csdn各类博文都觉得亲切,^_^哈哈~
在学习OpenCV的core模块——改变图像的对比度和亮度
代码源自博主langb2014 的博文: https://blog.csdn.net/langb2014/article/details/50924565
其中有段三个for循环的代码不太懂
for (int i =0;i<srcImage.rows;i++)
{
for (int j=0;j<srcImage.cols;j++)
{
for (int c=0;c<3;c++)
{
dstImage.at<Vec3b>(i,j)[c] = saturate_cast<uchar>((nContrastValue*0.01)*(srcImage.at<Vec3b>(i,j)[c])+nBrightValue);
}
}
}
google之后,从 https://www.cnblogs.com/ronny/p/opencv_road_2.html 了解到
at<typename>(i,j) 是opencv中图像遍历函数,它是一个模板函数,可以取到任何类型的图像上的点。
image.at<Vec3b>(i,j)[k]:是指取出彩色图像中i行j列第k通道的颜色点。
其中Vec3b是图像像素值的类型,如果还不太明白,可以选中右键转到其定义: typedef Vec<uchar, 3> Vec3b; 是通过typedef Vec<T,N>来定义的,N代表元素的个数,T代表类型,unchar是类型,3是元素的个数。
saturate_cast<typename> 是一个类型转换函数,是为了确保运算结果还在uchar范围内。
后面就是点运算:
其中f(i,j)表示源图像,g(i,j)表示变换后的 图像,
两个参数 和 一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。
至于对比度那里为什么要乘以0.01呢? 我们看两者的对比效果,先看下没有乘以0.01的效果图
下面是对比度乘以0.01的效果
可以看到,没有乘以0.01时,刚运行出来是一片白,越往后调节更是看不到,只有当对比度和亮度都很小的时候,假定为3时,才看的到全貌,而下面图中乘以0.01后,有用的调节范围变大了。