专栏首页程序员图像混合和图像叠加

图像混合和图像叠加

图像混合是把每一个像素给混合起来;图像叠加就是简单的给一幅图像加上另一幅图像。效果分别如下所示:

在OpenCV中 线性混合是指将两幅图像的像素进行线性混合。 理论公式f(x) = αg(x) +(1 - α)h(x);其中α在[0,1]中取值。

OpenCV提供了一个叫做addWeighted函数的函数来实现图像混合和图像叠加操作。

//addWeighted函数原型
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
//gamma因子是加到每一个混合以后的像素上的。即:
//f(x) = α * src1[i][j] + α src2[i][j] + gamma

因此在OpenCV中使用addWeighted函数的方式如下:

        Mat src1 = imread("C:/Users/zhou_/Desktop/1.png");
	Mat src2 = imread("C:/Users/zhou_/Desktop/2.png");
	if (src1.empty())
	{
		perror("load failed:");
		exit(-1);
	}
	else
	{
		namedWindow("src1");
		imshow("src1", src1);
	}

	if (src2.empty())
	{
		perror("load failed");
		exit(-1);
	}
	else
	{
		namedWindow("src2");
		imshow("src2", src2);
		
	}
    
    double α = 0.5;

    //图像的尺寸和类型应当一致。
    if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
	{
		Mat dst;
		addWeighted(src1, α, src2, 1 - α, 0.0, dst);

		namedWindow("dst");
		imshow("dst", dst);
	}

addWeighted函数的参数从上面可以看处理,很简单。

参数1:图像1;

参数2:线性混合参数α;

参数3:图像2;

参数4:线性混合参数1-α;

参数5:权重gamma;

参数6:目标图像。

下面我们对图像进行部分区域混合,这样的操作需要指定区域范围,如下所示:

src2ROI = src2(Rect(100, 100, src1.cols,src1.rows));

Rect用来指定从坐标(100,100)开始,长是src1.cols,宽是src1.rows这个范围内进行图像混合。

        Mat src1 = imread("C:/Users/zhou_/Desktop/1.png");
	Mat src2 = imread("C:/Users/zhou_/Desktop/壁纸1.jpg"); 
	Mat src2ROI;
	double α = 0.5;
	src2ROI = src2(Rect(100, 100, src1.cols,src1.rows));
        addWeighted(src2ROI, α, src1, 1 - α, 0.0, src2ROI);
	namedWindow("图像混合");
	imshow("图像混合", src2);

需要注意addWeighted函数的参数,混合的目标图像是src2ROI,而不是src2。这样才能改变原图像src2。

图像叠加和图像混合不同的地方在于图像叠加需要使用灰度图像来进行掩码操作。这样才能得到叠加的图像。

                Mat src1 = imread("C:/Users/zhou_/Desktop/1.png");
		Mat src2 = imread("C:/Users/zhou_/Desktop/壁纸1.jpg"); 
		Mat src2ROI;
		double α = 0.5;
		src2ROI = src2(Rect(100, 100, src1.cols,src1.rows));

                //读入图像1的灰度图像,并进行掩码
		Mat mask = imread("C:/Users/zhou_/Desktop/1.png", IMREAD_GRAYSCALE);
		src1.copyTo(src2ROI, mask);

		addWeighted(src2ROI, α, src1, 1 - α, 0.0, src2ROI);
		namedWindow("图像叠加");
		imshow("图像叠加", src2);

这样就完成了图像的叠加。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数字图像处理中常见的变换核及其用途

    图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性...

    zy010101
  • OpenCV中值滤波

    在数字图像处理常见的变换核及其用途中,已经说明了线性滤波。线性滤波是算术运算,有固定的模板,即:变换核。

    zy010101
  • C语言调用C++动态链接库

    C调用C++接口,这个问题的解决和C++调用C动态链接库是类似的。话不多说,直接上例子来进行说明。

    zy010101
  • Focusing Attention Network(FAN)自然图像文本识别 学习笔记

    对于一些复杂的或者质量低的图像,现有的基于注意力(attention-based)的方法识别效果很差,我们研究发现其中一个主要的原因是使用这种注意力模型评估的排...

    Natalia_ljq
  • 电商直播平台开发的三种主要发展模式

    直播为传统电商提供了一个全新的商品“社交”营销模式——主播将有相同爱好的观众聚集在直播间中,观众在电商直播平台开发上观看主播播出的内容时,就可以通过点击直播间上...

    布谷安妮
  • 计算机视觉 OpenCV Android | 图像操作之 统计排序滤波、边缘保留滤波

    上述代码将会生成一个3×3大小的矩形结构元素。 使用该结构元素实现最大值或者最小值滤波的代码如下:

    凌川江雪
  • 各大互联网公司,都融到了多少钱?这个小程序告诉你

    先是「摩拜单车」完成了 6 亿美元 E 轮融资,创下共享单车行业的单笔融资最高记录。接着,号称第二陌生人社交软件的「探探」,也完成了 7000 万 D 轮融资。

    知晓君
  • 多级复制的数据不同步问题(r7笔记第11天)

    昨天刚到公司,开发的同事就找到我,让我帮他看看某一台mysql的库,似乎数据是不同步了。大体的意思是,A地库中的数据会同步到B地,B地的数据会同 步到C地,C地...

    jeanron100
  • 关于c语言中结构体的初始化

    这种方式不能指明结构体类型名而是直接定义结构体变量,并且在值定义一次结构体变量时适用,无结构体名的结构体类型是无法重复使用的。

    用户4645519
  • 程序员通过跳槽来涨工资是否比较普遍?

    从事软件开发十几年,加上现在创业的公司总共经历了四家企业,可以肯定的讲程序员通过跳槽涨工资是一种有效的方法,但如果仅仅是为了提高收入而跳槽这种容易把自己导向一个...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券