Python OpenCV图像堆叠实战:水平、垂直及自定义矩阵拼接
本文详解OpenCV中图像堆叠的三种实现方式。首先介绍使用numpy的hstack和vstack进行水平与垂直简单拼接;随后深入解析自定义stackImages函数,支持不同尺寸、通道数(如彩色与灰度混合)及任意行列矩阵的灵活堆叠,并提供完整代码与缩放比例参数说明。
准备工作
在已创建的项目中右键,选择新建Python File以生成新的Python脚本。在文件开头import cv2导入cv2库,同时import numpy导入numpy库并将其重命名为np以便后续调用。
import cv2
import numpy as np
需明确OpenCV坐标系特性:x轴向右延伸,y轴向下延伸,坐标原点位于图像左上角。例如处理一张宽640像素、高480像素的图片时,需基于此坐标系进行坐标定位。接下来进入具体学习环节。

水平堆叠
使用numpy的hstack()函数实现水平堆叠,传入待拼接的图像作为参数,参数数量决定最终拼接的图像张数。
img=cv2.imread("Resources/lena.png")
imgHor=np.hstack((img,img))
cv2.imshow("Horizontal",imgHor)
cv2.waitKey(0)
执行代码观察结果,当传入参数为(img,img)时,系统将水平拼接两张原始图像。

若需水平拼接三张图像,可修改代码为:imgHor=np.hstack((img,img,img))

垂直堆叠
使用numpy的vstack()函数实现垂直堆叠,同样传入待拼接图像作为参数,参数数量决定拼接张数。
img=cv2.imread("Resources/lena.png")
imgVer=np.vstack((img,img))
cv2.imshow("Vertical",imgVer)
cv2.waitKey(0)
执行代码观察结果,当传入参数为(img,img)时,系统将垂直拼接两张原始图像。

同理,若需垂直拼接三张图像,可修改代码为:imgVer=np.vstack((img,img,img))
图像栈堆叠
直接使用numpy函数无法处理尺寸或通道数不同的图像堆叠,因此需要自定义堆叠方法。以下提供标准模板代码,旨在实现复杂场景下的图像堆叠,用户只需掌握调用方式即可,无需深究内部逻辑。
def stackImages(scale,imgArray):
rows = len(imgArray)
cols = len(imgArray[0])
rowsAvailable = isinstance(imgArray[0], list)
width = imgArray[0][0].shape[1]
height = imgArray[0][0].shape[0]
if rowsAvailable:
for x in range ( 0, rows):
for y in range(0, cols):
if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:
imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
else:
imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
imageBlank = np.zeros((height, width, 3), np.uint8)
hor = [imageBlank]*rows
hor_con = [imageBlank]*rows
for x in range(0, rows):
hor[x] = np.hstack(imgArray[x])
ver = np.vstack(hor)
else:
for x in range(0, rows):
if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
else:
imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
hor= np.hstack(imgArray)
ver = hor
return ver
水平与垂直堆栈
- 该自定义方法包含两个核心参数:第一个为缩放比例,0.5表示缩小至原图一半,2表示放大两倍,直观易懂;
- 第二个参数为图像堆叠矩阵,可自定义任意行数和列数,但需确保每行的图像列数一致,以构成有效矩阵;
- 示例代码中构建了一个2行3列的矩阵,每行包含三张图像。
img=cv2.imread("Resources/lena.png")
imgStcak=stackImages(0.5,([img,img,img],[img,img,img]))
cv2.imshow("ImgStack",imgStcak)
cv2.waitKey(0)
运行代码查看最终效果:

该方法支持混合不同通道数的图像,例如将灰度图与彩色图堆叠。具体操作如下:
img=cv2.imread("Resources/lena.png")
imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgStcak=stackImages(0.5,([img,imgGray,img],[img,img,img]))
cv2.imshow("ImgStack",imgStcak)
cv2.waitKey(0)
cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)将原始彩色图像转换为灰度图像,通道数由3变为1。在参数矩阵中替换其中一个img变量后运行代码,观察混合效果:

本节内容简洁且实用,应用场景广泛。建议读者动手实践以加深理解。
关于OpenCV图像堆叠的实现讲解至此结束,更多相关技术内容可查阅本站往期文章或继续关注后续更新,感谢支持。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













