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)修改后的图像:
还可以改变β的值 观察显示效果