2020.10.30 使用OpenCV进行图像对比度及亮度修改 【OpenCV C++】
源代码:
// testOpencv06.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
//std::cout << "Hello World!\n";
Mat src = imread("E:/imageSources/3.jpg");
//转化为灰度图像
cvtColor(src, src, COLOR_BGR2GRAY);
if (!src.data) {
printf("can not load image");
return -1;
}
char inputWindowName[] = "input window";
namedWindow(inputWindowName,WINDOW_AUTOSIZE);
imshow(inputWindowName,src);
Mat dst = Mat::zeros(src.size(), src.type());
//将图像格式转化为float类型的,才可以后面取float类型的数据进行计算
Mat m1;
src.convertTo(m1,CV_32F);
int imageHeight = m1.rows;
int imageWidth = m1.cols;
int imageChannels = m1.channels();
//调节对比度以及亮度参数
float alpha = 1.5;//调节对比度
float beta = -100;//调节亮度
for (int row = 0; row < imageHeight; row++){
for (int col = 0; col < imageWidth; col++)
{
//判断图像通道数,通道不同处理方式不同
if (imageChannels == 1) {
//float gray = src.at<uchar>(row, col);
float gray = m1.at<float>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha * gray + beta);
}
else if (imageChannels == 3) {
//float b = src.at<Vec3b>(row, col)[0];
//float g = src.at<Vec3b>(row, col)[1];
//float r = src.at<Vec3b>(row, col)[2];
//dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha * b + beta);
//dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha * g + beta);
//dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha * r + beta);
//测试float数据
float b = m1.at<Vec3f>(row, col)[0];
float g = m1.at<Vec3f>(row, col)[1];
float r = m1.at<Vec3f>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha * b + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha * g + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha * r + beta);
}
}
}
//输出处理后的图像
char outputWindowName[] = "output window";
namedWindow(outputWindowName, WINDOW_AUTOSIZE);
imshow(outputWindowName, dst);
waitKey(0);
return 0;
}
处理结果对比图:
三通道彩色图像处理结果:
灰度图像处理结果: