天天看點

初學OpenCV圖像周遊at<typename>(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範圍内。

後面就是點運算: 

初學OpenCV圖像周遊at&lt;typename&gt;(i,j)

其中f(i,j)表示源圖像,g(i,j)表示變換後的 圖像,

兩個參數 

初學OpenCV圖像周遊at&lt;typename&gt;(i,j)

 和 

初學OpenCV圖像周遊at&lt;typename&gt;(i,j)

 一般稱作 增益 和 偏置 參數。我們往往用這兩個參數來分别控制 對比度 和 亮度 。

至于對比度那裡為什麼要乘以0.01呢? 我們看兩者的對比效果,先看下沒有乘以0.01的效果圖

初學OpenCV圖像周遊at&lt;typename&gt;(i,j)

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

初學OpenCV圖像周遊at&lt;typename&gt;(i,j)

可以看到,沒有乘以0.01時,剛運作出來是一片白,越往後調節更是看不到,隻有當對比度和亮度都很小的時候,假定為3時,才看的到全貌,而下面圖中乘以0.01後,有用的調節範圍變大了。