1 、基本知识介绍
图像变换可以看作如下:
-像素变换 – 点操作
-邻域操作 – 区域
调整图像亮度和对比度属于像素变换-点操作
2 、公式介绍
- α 调节对比度 , β 调节亮度。 f(i,j)是(i,j)点的像素值,
- α 调节对比度,像素值同时乘以一个系数会使像素(RGB)大的值和小的值之间的差值变大,由此增加了对比度。
β 调节亮度,所有像素加减的值一样,所以只能看出亮度变化,各个像素之间的差值不变,所以这是调节亮度而不是调节对比度。
3 、整体代码测试
saturate_cast<uchar> 确保像素值在0 到 255之间,避免越界
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
#include <opencv2/core/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst,dst1;
src = imread("D:\\imageTest.jpg");
dst = imread("D:\\9.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
//addWeighted(src,0.2,dst,0.8,1, dst);
//uchar* ptr = dst.ptr<uchar>(0);
double a = 0.4;
double b = 55;
int col = dst.cols;
int row = dst.rows;
//int channel = dst.channels();
dst1 = Mat::zeros(dst.size(),dst.type());
//uchar* ptr = dst1.ptr<uchar>(0);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
dst1.at<Vec3b>(i, j).val[0] = saturate_cast<uchar>(a*dst.at<Vec3b>(i, j).val[0] + b);
dst1.at<Vec3b>(i, j).val[1] = saturate_cast<uchar>(a*dst.at<Vec3b>(i, j).val[1] + b);
dst1.at<Vec3b>(i, j).val[2] = saturate_cast<uchar>(a*dst.at<Vec3b>(i, j).val[2] + b);
}
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", dst);
namedWindow("input image1", CV_WINDOW_AUTOSIZE);
imshow("input image1", dst1);
waitKey();
return 0;
}