|
对比度比较简单,大概的意思就是,把A图像的像素值经过变换后变成B的图像的像素值,这种变换有一个公式,公式就是上面的,公式有两个运算,一个乘法,一个加法。乘法就是扩大像素值,这个就是对比度。加法就是让像素值趋向于250白色。也就是亮度。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src1,dst;
src1 = imread("C:/daima practice/opencv/mat1/mat1/image6.jpg");
if (!src1.data)
{
printf("could not load image3...\n");
return -1;
}
//新的创建窗口的方法
char input_win[] = "input image";
namedWindow(input_win,CV_WINDOW_AUTOSIZE);
imshow(input_win,src1);
//对比度与亮度的改变
int height = src1.rows;
int width = src1.cols;
dst = Mat::zeros(src1.size(),src1.type());
float alpha = 1.5;//调整对比度
float beta = 50;//调整亮度
//cvtColor(src1,src1,CV_BGR2GRAY); //转变为灰度图
///////读取每一行,每一列的像素
for(int row = 0;row < height; row++)
{
for(int col = 0;col < width;col++)
{
if(src1.channels() == 3)//3通道运算
{
float b = src1.at<Vec3b>(row,col)[0];//blue蓝色
float g = src1.at<Vec3b>(row,col)[1];//green绿色
float r= src1.at<Vec3b>(row,col)[2];//red红色
//开始操作像素
dst.at<Vec3b>(row,col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row,col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row,col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if(src1.channels() == 1)//单通道运算
{
float v = src1.at<uchar>(row,col);
dst.at<uchar>(row,col) = saturate_cast<uchar>(v*alpha+beta);
}
}
}
char output_title[] = "contrast and brightness change demo";
namedWindow(output_title,CV_WINDOW_AUTOSIZE);
imshow(output_title,dst);
waitKey(0);
return 0;
}