使用OpenCV合并两张图片

100 投票
7 回答
260732 浏览
提问于 2025-04-17 03:18

我正在尝试使用 OpenCV 2.1 将两张图片合并成一张,想把这两张图片并排放在一起。在 Python 中,我这样做:

import numpy as np, cv

img1 = cv.LoadImage(fn1, 0)
img2 = cv.LoadImage(fn2, 0)

h1, w1 = img1.height,img1.width
h2, w2 = img2.height,img2.width

# Create an array big enough to hold both images next to each other.
vis = np.zeros((max(h1, h2), w1+w2), np.float32)

mat1 = cv.CreateMat(img1.height,img1.width, cv.CV_32FC1)
cv.Convert( img1, mat1 )

mat2 = cv.CreateMat(img2.height, img2.width, cv.CV_32FC1)
cv.Convert( img2, mat2 )

# Copy both images into the composite image.
vis[:h1, :w1] = mat1
vis[:h2, w1:w1+w2] = mat2

h,w = vis.shape
vis2 = cv.CreateMat(h, w, cv.CV_32FC3)
vis0 = cv.fromarray(vis)
cv.CvtColor(vis0, vis2, cv.CV_GRAY2BGR)
cv.ShowImage('test', vis2)
cv.WaitKey()

这两张输入的图片是:

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box.png?rev=2270

https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/box_in_scene.png?rev=2270

合成后的图片是:

enter image description here

可能很难从网站的其他部分区分出来,但大部分区域是白色的,对应的是应该放置单独图片的位置。黑色区域是没有写入任何图片数据的地方。

为什么我的图片数据都变成白色了呢?

7 个回答

24

你还可以使用OpenCV自带的函数 cv2.hconcatcv2.vconcat,顾名思义,前者是用来把图片横着拼接在一起,后者则是把图片竖着拼接在一起。

import cv2

img1 = cv2.imread('opencv/lena.jpg')
img2 = cv2.imread('opencv/baboon.jpg')

v_img = cv2.vconcat([img1, img2])
h_img = cv2.hconcat([img1, img2])

cv2.imshow('Horizontal', h_img)
cv2.imshow('Vertical', v_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

横向拼接

横向拼接

纵向拼接

纵向拼接

45

对于那些想把两张彩色图片合成一张的人,这里有一个小改动,灵感来自Andrey的回答,这个方法对我有效:

img1 = cv2.imread(imageFile1)
img2 = cv2.imread(imageFile2)

h1, w1 = img1.shape[:2]
h2, w2 = img2.shape[:2]

#create empty matrix
vis = np.zeros((max(h1, h2), w1+w2,3), np.uint8)

#combine 2 images
vis[:h1, :w1,:3] = img1
vis[:h2, w1:w1+w2,:3] = img2
178

如果你的图片大小正好一样(这在展示图像处理结果时很常见),你可以用numpy的连接功能来简化你的代码。

要把图片竖着叠加(img1在img2上面):

vis = np.concatenate((img1, img2), axis=0)

要把图片横着并排(img1在img2左边):

vis = np.concatenate((img1, img2), axis=1)

为了验证:

import cv2
import numpy as np
img1 = cv2.imread('img1.png')
img2 = cv2.imread('img2.png')
vis = np.concatenate((img1, img2), axis=1)
cv2.imwrite('out.png', vis)

生成的out.png图片左边会是img1,右边会是img2。

撰写回答