初学OpenCV图像遍历at(i,j)

今天终于可以坐下好好写个博客,看到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范围内。

后面就是点运算: g(i,j) = \alpha \cdot f(i,j) + \beta  

其中f(i,j)表示源图像,g(i,j)表示变换后的 图像,

两个参数 \alpha > 0 和 \beta 一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。

至于对比度那里为什么要乘以0.01呢? 我们看两者的对比效果,先看下没有乘以0.01的效果图

下面是对比度乘以0.01的效果

可以看到,没有乘以0.01时,刚运行出来是一片白,越往后调节更是看不到,只有当对比度和亮度都很小的时候,假定为3时,才看的到全貌,而下面图中乘以0.01后,有用的调节范围变大了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章