初學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後,有用的調節範圍變大了。

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