日常生活中,我们经常需要将多张图片合成为一张图片,但是却又找不到好的方法,直接将多张图片拖拽到一起不仅耗时耗力,而且效率低,效果差。OpenCV 给我们提供了很好的拼接工具,下面我们以两张图片的拼接为例介绍常见的拼接算法。
一、不重叠拼接图片
1、使用concatenate横向连接图片,代码如下:
import cv2import numpy as npimg1 = 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 Imagedef join(png1, png2, flag='vertical'):img1, img2 = Image.open(png1), Image.open(png2)size1, size2 = img1.size, img2.sizeif 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 cv2from 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将多幅图片显示在一张图片上