OpenCV两张图片的合并

本文深入解析使用OpenCV合并两张图片的原理与实践,包括权值计算公式、OpenCV addWeighted函数应用以及具体代码实现。通过用户自定义权重参数,演示如何将不同图片按比例融合生成新的合成图像。

转载请注明出处。。!

http://blog.youkuaiyun.com/zhonghuan1992



OpenCV两张图片的合并






     原理:

       两张图片合并,想想图片是用一个个像素点来存储。每一个像素点有他的值。

那么合并,无非就是像素点值得合并,使用的公式能够就是给两张图片分别一个权值。然后求和。向以下这个公式:

       的值位于0至1之间

     OpenCV实现:

       那么我们在openCV内怎么实现呢?在openCV中,有一个addWeighted函数。函数详细调用能够看这里

读取完两个要合并的图片后。(注意。这里合并的图片必须是同样的size和type,就是说图片长宽像素数一样。color存储方式要一样。我选的是388*388的png图片

/// Read image ( same size, same type )
       src1= imread("zh.png");
       src2= imread("zh2.png");


调用addWeighted函数。

beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0,dst);


       这里src1和src2都是读取之后的矩阵,alpha和beta是他们的权重。

事实上addWeighted的过程是以下的公式:

       这里的Y是0.0。

       好,让我们动手来做这个操作。代码例如以下:

#include <cv.h>
#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  
#include <highgui.h>
#include <iostream>

using namespace cv;

int main()
{
	double alpha = 0.5; double beta; double input;

	Mat src1, src2, dst;

	/// Ask the user enter alpha
	std::cout << " Simple Linear Blender " << std::endl;
	std::cout << "-----------------------" << std::endl;
	std::cout << "* Enter alpha [0-1]: ";
	std::cin >> input;
	
	/// We use the alpha provided by the user if it is between 0 and 1
	if (input >= 0.0 && input <= 1.0)
	{
		alpha = input;
	}

	/// Read image ( same size, same type ),注意,这里一定要同样大小。同样类型,否则出错
	src1 = imread("zh.png");
	src2 = imread("zh2.png");

	if (!src1.data) { printf("Error loading src1 \n"); return -1; }
	if (!src2.data) { printf("Error loading src2 \n"); return -1; }

	/// Create Windows
	namedWindow("Linear Blend", 1);

	beta = (1.0 - alpha);
	addWeighted(src1, alpha, src2, beta, 0.0, dst); //这里调用了addWeighted函数,得到的结果存储在dst中

	imshow("Linear Blend",dst);

	waitKey();
	return 0;
}

结果:

图片1:

 

图片2:

 

合并后的图片:

转载于:https://www.cnblogs.com/zfyouxi/p/5054760.html

<think>嗯,用户想用OpenCV合并两张图片。首先,我需要根据他们的需求确定合并的方式。常见的合并方法有水平合并、垂直合并,或者叠加。用户没有具体说明,但引用的内容里提到了尺寸一致的图像水平合并,并添加分界线,这可能是一个方向。 参考引用[1]中的代码,用户已经知道如何合并两张尺寸相同的图片,使用copyTo方法,并在中间画一条白线。但用户可能需要更通用的方法,比如处理不同尺寸的图片,或者调整合并方式。 另外,引用[2]提到了用numpy的hstack和vstack来水平或垂直堆叠图片,这可能更简单。比如np.hstack((img1, img2)),但要注意图片的高度是否一致,否则会出错。如果尺寸不同,可能需要调整大小。 还有引用[4]中的边框处理,可能用户想合并时添加边框,但问题主要是合并,所以可能不需要边框。不过要考虑如果图片大小不同,可能需要填充或缩放。 用户的问题可能包括如何处理不同尺寸的图片,是否需要调整大小,或者添加分界线。需要给出多种方法,比如使用numpy函数,或者手动创建画布,复制图像到指定位置。 还要注意数据类型和颜色通道的一致性,比如都是BGR格式,尺寸匹配。如果尺寸不同,需要先调整,使用resize函数。此外,合并后的显示和保存也是步骤之一。 可能需要分步骤说明,先处理相同尺寸的情况,再处理不同尺寸的情况,以及添加分界线的方法。同时,提供代码示例,并解释关键部分,比如如何创建合并后的画布,复制图像,画线等。 还要考虑性能,比如大图片处理时的效率,但用户可能暂时不需要。最后,生成相关问题,帮助用户进一步学习,比如处理不同尺寸、添加透明度或混合图片等。</think>要使用OpenCV合并两张图片,可以根据需求选择水平合并或垂直合并。以下是分步实现方法及代码示例: --- ### **1. 基础合并方法** #### **(1) 水平合并(尺寸一致)** 当两张图片尺寸相同时,可用`np.hstack`快速合并: ```python import cv2 import numpy as np img1 = cv2.imread("image1.jpg") img2 = cv2.imread("image2.jpg") # 水平合并 merged_h = np.hstack((img1, img2)) cv2.imshow("Horizontal Merge", merged_h) cv2.waitKey(0) ``` #### **(2) 垂直合并(尺寸一致)** ```python merged_v = np.vstack((img1, img2)) cv2.imshow("Vertical Merge", merged_v) cv2.waitKey(0) ``` --- ### **2. 手动控制合并(支持不同尺寸)** 若图片尺寸不一致,需先调整尺寸或创建画布: ```python def merge_images(img1, img2, direction='h', border=False): # 统一高度(水平合并)或宽度(垂直合并) if direction == 'h': h = max(img1.shape[0], img2.shape[0]) img1 = cv2.resize(img1, (img1.shape[1], h)) img2 = cv2.resize(img2, (img2.shape[1], h)) merged = np.hstack((img1, img2)) else: w = max(img1.shape[1], img2.shape[1]) img1 = cv2.resize(img1, (w, img1.shape[0])) img2 = cv2.resize(img2, (w, img2.shape[0])) merged = np.vstack((img1, img2)) # 添加分界线(可选) if border: if direction == 'h': cv2.line(merged, (img1.shape[1], 0), (img1.shape[1], h), (255,255,255), 2) else: cv2.line(merged, (0, img1.shape[0]), (w, img1.shape[0]), (255,255,255), 2) return merged ``` --- ### **3. 带分界线的合并(参考引用[1])** 通过创建空白画布并手动复制图像区域: ```python def merge_with_border(img1, img2): h, w = img1.shape[0], img1.shape[1] + img2.shape[1] + 10 # 留出分界线空间 merged = np.zeros((h, w, 3), dtype=np.uint8) merged[:, :img1.shape[1]] = img1 merged[:, img1.shape[1]+10:] = img2 # 添加白色分界线 cv2.line(merged, (img1.shape[1]+5, 0), (img1.shape[1]+5, h), (255,255,255), 5) return merged ``` --- ### **4. 不同尺寸图片合并策略** 1. **调整尺寸**:使用`cv2.resize`统一高度或宽度 2. **填充空白区域**:通过`cv2.copyMakeBorder`扩展画布[^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值