图像混合
混合两个图像简单了解图像叠加
数据集准备
将较大的图像剪裁得到与较小图像尺寸相同的图像
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
Mat src1,src2;
src1 = imread("girl4.jpg");
src2 = imread("girl6.jpg");
Rect rec = Rect (0,0,src1.cols,src1.rows);
Mat roi = src2(rec);
imwrite("girl6_scaled.jpg", roi);
imshow("1", roi);
waitKey(0);
return -1;
}
图像混合
对于结果图像dst上像素dst[row][col],有 dst[row][col]= alpha×src1[row][col]+(1-alpha)×src2[row][col]
addWeighted()
CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype = -1);
- src1 基准图像
- alpha 基准图像强度
- src2 叠加图像
- beta (1-alpha)叠加图像强度
- dst 输出图像
代码
#include<opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src1, src2, dst;
src1 = imread("girl4.jpg");
src2 = imread("girl6_scaled.jpg");
if (!src1.data || !src2.data)
{
printf("Wrong with Loading data!\n");
return -1;
}
else if (src1.cols != src2.cols|| src1.rows != src2.rows)
{
printf("Wrong Size!\n");
return -1;
}
double alpha = 0.5;
addWeighted(src1, alpha, src2, (1.0-alpha), 0.0, dst);
namedWindow("dst");
imshow("dst", dst);
waitKey(0);
return -1;
}
再加点细节
#include<opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int alphago = 0;
Mat src1, src2, dst;
void Process(int, void*);
int main() {
src1 = imread("girl4.jpg");
src2 = imread("girl6_scaled.jpg");
if (!src1.data || !src2.data)
{
printf("Wrong with Loading data!\n");
return -1;
}
else if (src1.cols != src2.cols || src1.rows != src2.rows)
{
printf("Wrong Size!\n");
return -1;
}
namedWindow("dst");
imshow("dst", src2);
createTrackbar("alpha1", "dst", &alphago, 100, Process);
waitKey(0);
return -1;
}
void Process(int, void*)
{
double alpha = double(alphago) / 100.0;
addWeighted(src1, alpha, src2, 1.0 - alpha, 0.0, dst);
imshow("dst", dst);
}