1 前言
介绍图像算术操作,以及其可以实现的图像亮度、对比度调整效果。相关API:
-
add()
-
subtract()
-
multiply()
-
divide()
-
addWeighted()
2 代码及内容
cpp
#include "iostream"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char *argv)
{
//【图像加减乘除操作】
/*
//首先读入两幅图像,并显示出来。
Mat src1 = imread("C:/Users/Administrator/Desktop/Zooey.png");
Mat src2 = imread("C:/Users/Administrator/Desktop/5.png");
if (src1.empty() || src2.empty())
{
cout << "could not find image file" << endl;
return -1;
}
imshow("input1", src1);
imshow("input2", src2);
//算术操作
Mat dst1;
add(src1, src2, dst1); //加
imshow("add-demo", dst1);
Mat dst2;
subtract(src1, src2, dst2); //减,注意参数顺序,src1-src2,转到定义有详细介绍
imshow("subtract-demo", dst2);
Mat dst3;
multiply(src1, src2, dst3); //乘
imshow("multiply-demo", dst3);
Mat dst4;
divide(src1, src2, dst4); //除,注意参数顺序,src1/src2,转到定义有详细介绍
imshow("divide-demo", dst4);
*/
//【亮度、对比度调整】
//图像亮度调整(实际上就是像素的加减操作,所有像素值加减相同的值)
Mat src = imread("C:/Users/Administrator/Desktop/Zooey.png");
imshow("input", src);
Mat black = Mat::zeros(src.size(), src.type()); //创建一个大小、类型都和原图一样的黑色图像(像素值全为0)
black = Scalar(40, 40, 40); //设置每个像素的值,为后面的算术操作做准备
Mat dst1; //算术操作后接收结果的Mat对象
subtract(src, black, dst1); //减法操作
imshow("亮度调整", dst1);
//图像对比度调整(实际上就是像素的乘法操作,所有像素值乘以相同的值,它们之间的差值变大,对比度就变大了),下面的API(方法、函数)既可以调整比对度也可以调整亮度。
Mat dst2;
addWeighted(src, 1.2, black, 0.5, 0.0, dst2); //提供的API。dst = src1*alpha + src2*beta + gamma;活用转到定义。alpha第二参数,beta第四参数,gamma第五参数。
imshow("对比度与亮度调整", dst2);
waitKey(0);
destroyAllWindows();
return 0;
}
代码分为两部分,一部分是基础算术操作,一部分是对比度,亮度调整。运行时分别注释。
代码中都注释的很清楚,也就是几个API的使用,在使用官方API时,要活用转到定义,官方都会有自己的注释说明。
要明确亮度和对比度调整的原理是什么:
-
亮度:所有像素值同加减相同的值,实现整体黑白度的变化。
-
对比度:所有像素值同乘相同的值,这样像素值间的差距会变大(2和4,差2,同乘2,变4和8,差4),实现整体色彩对比度变化。
Note:对RGB图像来说,像素值越大,亮度越高。
-
黑色(0,0,0)
-
白色(255,255,255)
演示:
代码后半部分的亮度、对比度调整。
3 结束语
没啦。