1.理論基礎
兩個參數 和
一般稱作 增益 和 偏置 參數。我們往往用這兩個參數來分別控制 對比度 和 亮度 。
你可以把 看成源圖像像素,把
看成輸出圖像像素。這樣一來,上面的式子就能寫得更清楚些:
其中, 和
表示像素位於 第i行 和 第j列 。
其中,α可以調整圖像的對比度,β可以調整圖像的亮度。
2.代碼如下:
1 #include<iostream> 2 #include<opencv2/opencv.hpp> 3 4 using namespace std; 5 using namespace cv; 6 7 int main(int argc, char **argv) 8 { 9 Mat src = imread("D:/meinv.jpg"); 10 if (!src.data) 11 { 12 printf("Couldn't load the image......"); 13 return -1; 14 } 15 namedWindow("源圖像", CV_WINDOW_AUTOSIZE); 16 imshow("源圖像", src); 17 18 int height = src.rows; 19 int width = src.cols; 20 int channels = src.channels(); 21 22 Mat dst = Mat::zeros(src.size(),src.type()); //創建一個和原圖像大小相同,類型相同,像素值為0的圖像。 23 float alpha = 1.5; //設置參數 24 float beta = 0; 25 26 //對每個像素點的操作 27 for (int i = 0; i < height; i++) 28 { 29 for (int j = 0; j < width; j++) 30 { 31 if (channels == 3) //如果是彩色圖像 32 { 33 dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[0]) + beta); 34 dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[1]) + beta); 35 dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[2]) + beta); 36 } 37 else if (channels == 1) //灰度圖像 38 { 39 dst.at<uchar>(i,j) = saturate_cast<uchar>(alpha*(src.at<uchar>(i, j)) + beta); 40 41 } 42 } 43 } 44 imshow("dst_image", dst); 45 waitKey(0); 46 return 0; 47 48 }
3.顯示效果:
(1)原圖:
(2)修改后的圖像:
還可以改變β的值 觀察顯示效果