理论
-线性混合操作
相关API (addWeighted)
[C++] 纯文本查看 复制代码 void cvAddWeighted(
const CvArr* src1,
double alpha,
const CvArr* src2,
double beta,
double gamma,
CvArr* dst );
参数1:输入图像Mat – src1(第一张图像)
参数2:输入图像src1的alpha值(权重)
参数3:输入图像Mat – src2(另一张图像)
参数4:输入图像src2的alpha值(权重)
参数5:gamma值(校验值)
参数6:输出混合图像
注意点:两张图像的大小和类型必须一致才可以[C++] 纯文本查看 复制代码 dst=(I) =saturate( src1(I)* alpha + src2(I) *beta + gamma )
[C++] 纯文本查看 复制代码 /*
注意:
进行线性混合时,2张图的大小和类型必须一致
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src1,src2, dst;
src1 = imread("j1.jpg");
src2 = imread("j2.jpg");
if (!src1.data || !src2.data) {
printf("加载图片异常\n");
return -1;
}
double alpha = 0.5;
//设定权重
if (src1.rows==src2.rows && src1.cols==src2.cols && src1.type()==src2.type())
//判断2张图的大小和类型是不是一致
{
addWeighted(src1, alpha, src2, (1.0 - alpha),0.0,dst);
//调用混合函数
//add(src1, src2, dst, Mat());
//这个函数也是可以混合 但是效果很差
//multiply(src1, src2, dst, 1.0);
//这个是图像相乘的结果
}
else {
cout << "2张图的大小或者类型不一致,程序退出!";
return -1;
}
namedWindow("j1", CV_WINDOW_AUTOSIZE);
imshow("j1", src1);
namedWindow("j2", CV_WINDOW_AUTOSIZE);
imshow("j2", src2);
namedWindow("最终效果图", CV_WINDOW_AUTOSIZE);
imshow("最终效果图", dst);
waitKey(0);
return 0;
}
|