opencv学习7 图像的亮度及对比度调节
图像的亮度及对比度调节
有些时候我们得到的图像颜色过暗不利于后续的图像处理,需要先对图像进行亮度提高。在OpenCV中实际上就是对其进行点操作。
其原理为将原来图像的像素f(x)乘上一个增益参数α来控制图像对比度,在加上一个偏置参数β控制图像的亮度。公式如下:
g(x)= α×f(x)+β
将原图像经过处理后可以在很大程度上消除背景噪声带来的影响,又可以保留对象的特征。
代码如下
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
static void ContrastAndBright(int, void *);
void ShowHelpText();
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage, g_dstImage;
int main()
{
g_srcImage = imread("hehua.jpg");
if (!g_srcImage.data) { printf("Oh,no,读取g_srcImage图片错误~! \n"); return false; }
g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());
g_nContrastValue = 80;
g_nBrightValue = 80;
namedWindow("[效果图窗口]", 1);
createTrackbar("对比度:", "[效果图窗口]", &g_nContrastValue, 300, ContrastAndBright);
createTrackbar("亮 度:", "[效果图窗口]", &g_nBrightValue, 200, ContrastAndBright);
ContrastAndBright(g_nContrastValue, 0);
ContrastAndBright(g_nBrightValue, 0);
while (char(waitKey(1)) != 'q') {}
return 0;
}
static void ContrastAndBright(int, void *)
{
namedWindow("[原始图窗口]", 1);
for (int y = 0; y < g_srcImage.rows; y++)
{
for (int x = 0; x < g_srcImage.cols; x++)
{
for (int c = 0; c < 3; c++)
{
g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
}
}
}
imshow("[原始图窗口]", g_srcImage);
imshow("[效果图窗口]", g_dstImage);
}
通过该运算我们可以手动调整图像的亮度值和对比度,在图像处理中是非常重要的一环。
运行结果
1674971