一.写在前面
图像变换可以看作如下:
– 像素变换 – 点操作
– 邻域操作 – 区域
调整图像亮度和对比度属于像素变换–点操作
g(i,j)=αf(i,j)+β其中α>0, β是增益变量
注意:f(i.j)可以看做某个像素点,其中改变a值即会改变图像对比度;改变b值即改变图像的亮度。
二.几个重要方法
@Mat new_image = Mat::zeros( image.size(), image.type() ); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
@saturate_cast<uchar>(value)确保值大小范围为0~255之间
@Mat.at<Vec3b>(y,x)[index]=value 给每个像素点每个通道赋值
三.代码实现
/*
OpenCV 调整图像亮度与对比度学习
Michael Jiang<sencom1997@outlook.com>
2019年7月24日13:21:28
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
//读取图像
Mat src = imread("D:/go.png", IMREAD_COLOR);
//判断读取是否成功
if (src.empty()) {
printf("pic load failed!\n");
return -1;
}
//定义显示窗口
namedWindow("src", WINDOW_AUTOSIZE);
namedWindow("dst", WINDOW_AUTOSIZE);
//定义输出图像
Mat dst = Mat::zeros(src.size(), src.type());
//调节亮度和对比度
double alpha = 1.2;
double beta = 20;
int height = src.rows;
int width = src.cols;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(alpha*src.at<Vec3b>(i, j)[0] + beta);
dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(alpha*src.at<Vec3b>(i, j)[1] + beta);
dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(alpha*src.at<Vec3b>(i, j)[2] + beta);
}
}
imshow("src", src);
imshow("dst", dst);
waitKey(0);
return 0;
}