1. C/C++

OpenCV-第七话-调整图像亮度与对比度

一.写在前面

图像变换可以看作如下:

 像素变换 点操作

 邻域操作 区域

调整图像亮度和对比度属于像素变换点操作

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;
}