日常生活中,我们经常需要将多张图片合成为一张图片,但是却又找不到好的方法,直接将多张图片拖拽到一起不仅耗时耗力,而且效率低,效果差。OpenCV 给我们提供了很好的拼接工具,下面我们以两张图片的拼接为例介绍常见的拼接算法。

一、不重叠拼接图片

1、使用concatenate横向连接图片,代码如下:

import cv2

import numpy as np

img1 = cv2.imread('E:/picture/room/room1.jpg')

img2 = cv2.imread('E:/picture/room/room2.jpg')

# 横向连接

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

# 纵向连接

# image = np.concatenate((img1, img2), axis=0)

cv2.imshow('image', image)

cv2.waitKey()

cv2.destroyAllWindows()

显示结果:

concatenate函数也可以可以实现纵向连接,代码见上,拼接的结果如下: 我们发现使用concatenate函数连接图片,横向和纵向拼接只需要改变axis的参数值即可。

2、使用joint连接两张图片 该方法主要是使用PIL库中的Image类,然后使用paste方法来拼接图片获得完成图。代码如下:

from PIL import Image

def join(png1, png2, flag='vertical'):

img1, img2 = Image.open(png1), Image.open(png2)

size1, size2 = img1.size, img2.size

if flag == 'horizontal':

joint = Image.new('RGB', (size1[0]+size2[0], size1[1]))

loc1, loc2 = (0, 0), (size1[0], 0)

joint.paste(img1, loc1)

joint.paste(img2, loc2)

joint.save('horizontal.png')

elif flag == 'vertical':

joint = Image.new('RGB', (size1[0], size1[1]+size2[1]))

loc1, loc2 = (0, 0), (0, size1[1])

joint.paste(img1, loc1)

joint.paste(img2, loc2)

joint.save('vertical.png')

if __name__ == '__main__':

img1 = 'D:/Programprojects/PycharmProjects/Image-Stitching-with-OpenCV-and-Python/image_rotate/img1.jpg'

img2 = 'D:/Programprojects/PycharmProjects/Image-Stitching-with-OpenCV-and-Python/image_rotate/img2.jpg'

join(img1, img2, flag='horizontal')

join(img1, img2, flag='vertical'

拼接的结果如下: 横向拼接效果: 纵向拼接效果:

3、使用numpy库自带的hstack()和vstack() 代码如下:

import cv2

from pylab import *

img1 = cv2.imread('E:/picture/room/room1.jpg')

img2 = cv2.imread('E:/picture/room/room2.jpg')

# 横向拼接

htitch = np.hstack((img1, img2))

# 纵向拼接

# vtitch = np.vstack((img1, img2))

cv2.imwrite('./img.jpg', htitch)

# cv2.imwrite('./img.jpg', vtitch)

cv2.imshow("test1", htitch)

# cv2.imshow("test2", vtitch)

cv2.waitKey(0)

cv2.destroyAllWindows()

实验结果如下: 希望对大家有所帮助。

参考: 1、Python将两张图片按横向或纵向拼接成一张图片 2、python将多幅图片显示在一张图片上