今天終於可以坐下好好寫個博客,看到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後,有用的調節範圍變大了。