📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处
调整图像的亮度与对比度就是对图像像素值进行更改。
为了防止增加像素之后而超过255这个值,需要用到opencv里面的一个API-saturate_cast,对其进行抑制。
一、API-saturate_cast
该函数的原理如下:
if(data<0) data=0;
else if(data>255) data=255;
二、全部代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("D:/images/gaoyy.png");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
imshow("before", src);
// 获取图像src的高和宽
int height = src.rows;
int width = src.cols;
//定义图像dst尺寸、类型都和src相同
dst = Mat::zeros(src.size(), src.type());
float alpha = 1.1; // 用于控制图像的对比度
float beta = 1; // beta偏置,用于控制图像的亮度
Mat m1;
src.convertTo(m1, CV_32F);//问题:为何此处要复制三通道的画布src给m1?
for (int row = 0; row < height; row++) {//定义图像的高
for (int col = 0; col < width; col++) {//定义图像的宽
if (src.channels() == 3) {//确定图像的通道数
float b = m1.at<Vec3f>(row, col)[0];// 定义浮点数变量b为绿色通道的所有像素
float g = m1.at<Vec3f>(row, col)[1]; // 定义浮点数变量g为蓝色通道的所有像素
float r = m1.at<Vec3f>(row, col)[2]; // 定义浮点数变量r为红色通道的所有像素
//分别更改三个通道像素值,进而设置对比度和亮度。问题:为何此处使用<Vec3b>?
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);
}
}
}
imshow("更改后", dst);
waitKey(0);
return 0;
}