调整图像亮度和对比度的操作属于像素操作–点操作:
g(i,j)=αf(i,j)+β,其中α>0,β是增益变量g(i,j)=αf(i,j)+β,其中α>0,β是增益变量
代码如下:
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/vcprojects/images/test.png");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char input_win[] = "input image";
cvtColor(src, src, CV_BGR2GRAY);
imshow(input_win, src);
// contrast and brigthtness changes
int height = src.rows;
int width = src.cols;
dst = Mat::zeros(src.size(), src.type());
float alpha = 1.2;
float beta = 30;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (src.channels() == 3) {
int b = src.at<Vec3b>(i, j)[0];
int g = src.at<Vec3b>(i, j)[1];
int r = src.at<Vec3b>(i, j)[2];
dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if (src.channels() == 1) {
float v = src.at<uchar>(i, j);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}
char output_title[] = "contrast and brightness change demo";
imshow(output_title, dst);
waitKey(0);
return 0;
}
注意:int 改为float时候
float b = src.at<Vec3f>(i,j)[0];
float g = src.at<Vec3f>(i,j)[1];
float r = src.at<Vec3f>(i,j)[2];
需要把图片改为float
src.convertTo(src,CV_32F);