OpenCV操作4(图像混合)

图像混合

线性混合操作

g(x) = (1 - α \alpha α) f 0 f_0 f0(x) + α \alpha α f 1 f_1 f1(x)
其中 α \alpha α表示两种图片融合的比例,其中g(x)表示融合之后图片的像素点, f 0 f_0 f0(x)和 f 1 f_1 f1(x)表示背景和前景的像素值, α \alpha α的取值为0-1之间

cv::addWeighted

功能

将两幅大小类型相同的图片线性混合
dst(I) = saturate(src1(I) α \alpha α + src2(I) β \beta β + γ \gamma γ)

函数原型

void cv::addWeighted(inputArray src1,
					 double alpha,
					 inputArray src2,
					 double beta,
					 double gamma,
					 OutputArray dst,
					 int dtype = -1)

参数

src1:输入图像Mat
alpha:输入图像src1的alpha值
src2:输入图像Mat
beta:输入图像src2的alpha值
gamma:gamma值
dst:输出混合图像

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui_c.h>
#include<math.h>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	Mat src1, src2, dst;
	src1 = imread("D://cvproject/windows.jpg");
	src2 = imread("D://cvproject/linux.jpg");
	if (src1.empty() || src2.empty())
	{
		printf("could not load image...\n");
		return -1;
	}
	double alpha = 0.5;
	if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
	{
		addWeighted(src1, alpha, src2, 1-alpha, 0.0, dst);
		namedWindow("input1", CV_WINDOW_AUTOSIZE);
		namedWindow("input2", CV_WINDOW_AUTOSIZE);
		namedWindow("output", CV_WINDOW_AUTOSIZE);
		imshow("input1", src1);
		imshow("input2", src2);
		imshow("output", dst);
		waitKey(0);

	}
	else
	{
		printf("The size of images is not same...\n");
		return -1;
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自己简单复现一下这个函数

Mat dst(src1.size(), src1.type());
for (int row = 0; row < src1.rows; row++)
{
	for (int col = 0; col < src1.cols; col++)
	{
		dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha*src1.at<Vec3b>(row, col)[0] + (1 - alpha)*src2.at<Vec3b>(row, col)[0]);
		dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha*src1.at<Vec3b>(row, col)[1] + (1 - alpha)*src2.at<Vec3b>(row, col)[1]);
		dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha*src1.at<Vec3b>(row, col)[2] + (1 - alpha)*src2.at<Vec3b>(row, col)[2]);
	}
}

结果与api一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值