前言
在上一章中描述了图像像素的基础操作以及计算反差图像,详细描述可点击查看(https://www.jianshu.com/p/b26d15f7f554)
目标
本章中,将学习如何:
- 理论-线性混合操作
- 相关API(addWeighted)
- 代码演示
图像线性混合的数学原理
计算公式注意事项:
- 其中α的取值范围为0~1之间
- f0(x)和f1(x)为参与混合的两幅图像,g(x)表示输出图像
- 通过对两幅图像的每个像素值做线性加权得到最终的输出图像
- 两幅图像的大小和类型必须完全一致,否则没有相加的意义
源代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src1, src2, dst;
src1 = imread("../images/LinuxLogo.jpg");
src2 = imread("../images/win10logo.jpg");
if (!src1.data) {
cout << "could not load image Linux Logo..." << endl;
return -1;
}
if (!src2.data) {
cout << "could not load image WIN7 Logo..." << endl;
return -1;
}
double alpha = 0.5;
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) { // 判断图像是否一致
addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
// add(src1, src2,dst,Mat()); // 图像相加
// multiply(src1, src2, dst, 1.0); // 图像相乘
imshow("linuxlogo", src1);
imshow("win7logo", src2);
namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
imshow("blend demo", dst);
}
else {
printf("could not blend images , the size of images is not same...\n");
return -1;
}
waitKey(0);
return 0;
}
效果如下所示:
linuxlogo.png win7logo.png 混合后效果.png
相关API说明
实现线性混合主要是利用OpenCV中的addWeighted函数
void cv::addWeighted (
InputArray src1, //第一个输入数组。
double alpha, // 第一个数组元素的权重。
InputArray src2, //第二个输入数组,和src1具有相同大小和通道数
double beta, //第二个数组元素的权重。
double gamma, //增加到每个和的标量。
OutputArray dst, //输出数组,和输入数组有相同的尺寸和通道数
int dtype = -1 //输出数组的可选深度;当两个输入数组都具有相同的深度时,dtype可以设置为- 1,这将等同于src1.depth()。
)
网友评论