这一部分简单介绍一下,两张图像之间的混合操作:
- 线性混合
- 相乘
- 相加
线性混合
计算表达式如下:
\[g(x) = \alpha f_0(x) + (1- \alpha)f_1(x) \]代码如下:
Mat src = imread("/home/chen/dataset/lena.jpg"); // 读取第一张图像
Mat src2 = imread("/home/chen/dataset/peppers.tiff"); // 读取第二张图像
// 图像混合
if ((src.size() == src2.size()) && (src.type() == src2.type())){
Mat dst = Mat(src.size(), src.type());
double alpha = 0.7;
addWeighted(src, alpha, src2, (1-alpha), 0, dst);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
} else {
printf("error\n");
return -1;
}
结果如下:
相乘/相加
除了两张图像的线性组合,也可以将两张图像直接相乘或者相加,如下:
add(src, src2, dst);
multiply(src, src2, dst);
最后,完整代码如下:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(){
// 读取图像
Mat src = imread("/home/chen/dataset/lena.jpg");
if (src.empty()){
printf("could not load image.\n");
return -1;
}
namedWindow("scr", WINDOW_AUTOSIZE);
imshow("src", src);
Mat src2 = imread("/home/chen/dataset/peppers.tiff");
if (src2.empty()){
printf("could not load image.\n");
return -1;
}
namedWindow("src2", WINDOW_AUTOSIZE);
imshow("src2", src2);
// 图像混合
if ((src.size() == src2.size()) && (src.type() == src2.type())){
Mat dst = Mat(src.size(), src.type());
double alpha = 0.7;
addWeighted(src, alpha, src2, (1-alpha), 0, dst);
// add(src, src2, dst);
// multiply(src, src2, dst);
namedWindow("dst", WINDOW_AUTOSIZE);
imshow("dst", dst);
} else {
printf("error\n");
return -1;
}
waitKey(0);
return 0;
}