一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像。
图像亮度和对比度的调整操作,其实属于图像处理变换中比较简单的一种——点操作。点操作有一个特点,仅仅根据输入像素值(有时可加上某些全局信息或参数),来计算相应的输出像素值。这类算子包括亮度(brightness)和对比度(contrast)调整,以及颜色校正(colorcorrection)和变换(transformations)。最简单的式子表示图像的对比度和亮度变换可表示如下:
参数:
1.f(x)表示原图像,既输入图像;g(x)表示变换输出的图像。
2.a可用来控制图像f(x)对比度。
3.b可用来控制图像f(x)亮度
实现以上操作需要设计图像像素点的访问,因此进一步改写该式子为:
G(x )= a*F(i,j) + b;
图像像素点遍历算法如下:
//遍历像素点并执行g=a*f+b操作
for (int y = 0;y < image.rows;y++) {
for (int x = 0;x < image.cols;x++) {
for (int c = 0;c < 3;c++) {
new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
((a*0.01)*(image.at<Vec3b>(y, x)[c]) + b);
}
}
}
其中访问RGB图像顺序位GBR,(x,y,c)代表第x行,第y列,第c通道
整体代码如下:
#include"stdafx.h"
#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void listPixel_Operate(int, void*);
// 定义全局变量
int a, b;
Mat image, new_image;
int main() {
//读取图片
image = imread("E:\\pictures\\For_Project\\New_opencv\\Sceen\\12.jpg");
//创建新的和原图片一样大小的空白图片用于接收对比度和亮度变换
new_image = Mat::zeros(image.size(), image.type());
//变换系数初值
a = 100;
b = 100;
namedWindow("【效果图窗口】", 1);
//创建滑动条
createTrackbar("对比度", "【效果图窗口】", &a, 300, listPixel_Operate);
createTrackbar("亮 度", "【效果图窗口】", &b, 300, listPixel_Operate);
//调用回调函数
listPixel_Operate(a, 0);
listPixel_Operate(b, 0);
//等待键盘按键‘q’退出
while (char(waitKey(1)) != 'q') {}
return 0;
}
void listPixel_Operate(int,void*) {
namedWindow("【原图窗口】", 1);
//遍历像素点并执行g=a*f+b操作
for (int y = 0;y < image.rows;y++) {
for (int x = 0;x < image.cols;x++) {
for (int c = 0;c < 3;c++) {
new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
((a*0.01)*(image.at<Vec3b>(y, x)[c]) + b);
}
}
}
imshow("【原图】", image);
imshow("【效果图窗口】", new_image);
}
效果图: