图像的混合
代码
先上代码。
我自学的方式是先看代码,然后在代码中遇到不懂的再逐个查询资料,深入学习,直到学懂。大家按照符合自己的方式学习就好了,适合自己的才是最好的。共勉。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//线性混合操作 g = (1-c) * f1(x) + c * f2(x) ; c的取值范围为0-1
Mat src1, src2, dst1, dst2, dst3;
src1 = imread("E:/minions.jpg");
src2 = imread("E:/roothock.jpg");
if (!src1.data)
{
cout << "error1" << endl;
return -1;
}
if (!src2.data)
{
cout << "error2" << endl;
return -1;
}
namedWindow("原图1", WINDOW_AUTOSIZE);
imshow("原图1", src1);
namedWindow("原图2", WINDOW_AUTOSIZE);
imshow("原图2", src2);
double alpha = 0.5;
if(src2.rows==src1.rows&&src1.cols==src2.cols)
{
//addWeighted(inputArrary src1, double alpha, inputArrary src2, double beta, double gamma, outputArrat dst, int dtype)
// 输入图像1 输入图像1的alpha值 输入图像2 输入图像2的alpha的值 gramma的值 输出混合图像 dtype默认为-1
//两张图像必须大小类型都相同才可以
addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst1);//dst为重构的图片
add(src1, src2, dst2, Mat());//只是像素相加 不如前一个
multiply(src1, src2, dst3, 1.0);//只是像素相乘 不如前两个
namedWindow("加权结果", WINDOW_AUTOSIZE);
imshow("加权结果", dst1);
namedWindow("像素相加结果", WINDOW_AUTOSIZE);
imshow("像素相加结果", dst2);
namedWindow("像素相乘结果", WINDOW_AUTOSIZE);
imshow("像素相乘结果", dst3);
}
else
{
cout << "error" << endl;
return -1;
}
waitKey(0);
return 0;
}
代码解释
之前已经解释过具体功能的代码就不进行解释了,如果想了解的话可以看下我之前的文章,毕竟咱们是在不断学习的过程中,要牢记旧知识,不断学习新知识。
addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst1);
addWeighted的功能是实现 src1和src2的加权和,具体的参数如下:addWeighted(输入图像1, 输入图像1的alpha值,输入图像2,输入图像2的alpha的值,gramma的值,输出混合图像,dtype默认为-1)。图像的alpha是指:图像数组元素的权重;gramm是指加在每个元素权重和上的标量,dtype(可选)是指输出图像的深度,当两个输入图像的深度相等时,可以使dtype = -1,即输出图像的深度等于输入图像的深度(src1.depth())。
各种处理后的结果图片对比:
可以看出经过简单的像素相加( add(src1, src2, dst2, Mat()) )、像素相乘( multiply(src1, src2, dst3, 1.0) )、
像素的加权和(addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst1) )处理后的图像的不同表现。
这篇opencv的学习笔记就这样结束了。
我是一个初学者,如果有相关的问题大家可以评论提出一起讨论,或指出我的错误之处,大家一起学习,一起进步,谢谢啦。