Python OpenCV图像堆叠实战:水平、垂直及自定义矩阵拼接

闻溪
闻溪
发布时间:2026-10-15| 3人浏览过
原创

本文详解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图像堆叠的实现讲解至此结束,更多相关技术内容可查阅本站往期文章或继续关注后续更新,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。