open cv对比度与亮度调节
图像变换可以看作如下
像素变换-点操作
调整图像亮度和对比度属于像素变换-点操作
邻域操作-区域 图像卷积 梯度计算
g(i,j)=a*f(i,j)+b其中a>0,b是增益变量
重要的API
Mat new image = Mat:zeros( image,size(), image.type(); 创
建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
saturate_ cast<uchar(value)确保值大小范围为0^255之间
Mat.at(y,x)[index]=value 给每个通道的每个像素点赋值
亮度是图片的明亮程度 超过80%图像开始发白
对比度是颜色之间的对比程度 对比度越大 个颜色之间的分别越明显特别是黑白之间
超过85%过于艳丽
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat dst;
Mat src = imread("D:/实验台/机器视觉/测试图片/白人女.png");
imshow("原图",src);
if (!src.data)
{
cout << "加载失败" << endl;
return -1;
}
//像素点 位操作
char input_win[] = "input image";// 设置一个名为input image的字符串 来做src的窗口显示
namedWindow(input_win,CV_WINDOW_AUTOSIZE);
imshow(input_win,src);//直接显示这条字符串到src窗口
int height = src.rows;
int width = src.cols;
dst = Mat::zeros(src.size(), src.type());
float alpha = 1;//第一通道赋值 越低越暗 越高越亮 对比度调节
float beta = 30;//第二通道赋值 越低越暗 越高越亮 亮度调节
/*
α > 1会扩大两个像素值之间的差值,从而提高了图像的对比度,
反之降低图像对比度;β \betaβ值可以用来增大图片的亮度,
值越大,图片亮度增加越明显。
*/
Mat m1;
//若想进一步提高精度,可以使使读取的像素的数据类型都为float类型,
//即Vec3f,这里需要一个转换函数
src.convertTo(m1, CV_32F);//转换为32位浮点型的矩阵 对比度亮度调节精度更大
// cvtColor(src,dst,CV_BGR2GRAY);
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (dst.channels() == 3) //RGB图
{
float r = m1.at<Vec3f>(row, col)[2];//获取图片各个像素值
float g = m1.at<Vec3f>(row, col)[1];
float b = m1.at<Vec3f>(row, col)[0];
// 数据溢出保护 对各个像素值进行处理
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);
}
else if (dst.channels() == 1) //灰度图
{
int v = dst.at<uchar>(row,col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v + alpha + beta);
}
}
}
char output_tittle[] = "output and brightness change demo";
namedWindow(output_tittle,CV_WINDOW_AUTOSIZE);
imshow(output_tittle, dst);
waitKey(0);
return 0;
}