Python OpenCV实现单窗口多图像显示:两种核心方法解析
本文详解在Python OpenCV中如何在单一窗口内展示多张图像,避免多窗口冗余。重点介绍两种实现方案:一是手动创建画布并复制图像区域,二是利用NumPy的hstack和vstack函数进行水平与垂直堆叠。文章提供完整代码示例及参数说明,帮助开发者高效处理图像展示需求。
在使用OpenCV进行图像显示时,若需同时展示多张图片,默认会生成多个独立窗口,这不仅造成界面冗余,也增加了用户的操作复杂度。为解决这一问题,通常需要将多张图像整合至同一个窗口中进行统一显示。
方案一:构建画布并复制图像至指定区域后显示
# 方法1:创建一个画布,将所有图像复制到画布中,最后显示画布
h, w, _ = img.shape
img_list = [img, invert, gaussianBlur, flip] # 图像列表
four_view = np.zeros((h * 2 + 10, w * 2 + 10, 3), np.uint8) # 创建空白图像
four_view[:, :] = 255 # 给所有通道的像素值赋值255
for i in range(len(img_list)):
row = i // 2
col = i % 2
print(row, col)
# 将小图像复制到大画布上。
np.copyto(four_view[(h + 10) * row:h * (row + 1) + 10 * row, (w + 10) * col:w * (col + 1) + 10 * col],
img_list[i])
cv.imshow('result', four_view)
方案二:利用NumPy模块的水平堆叠(hstack)与垂直堆叠(vstack)功能,将多张图像合并为一张整体图像后进行显示。
实现上述功能主要依赖两个核心函数:np.hstack()用于水平方向拼接,np.vstack()用于垂直方向拼接。
水平堆叠函数hstack(tup)要求输入的ndarrays序列中,除第二个轴(列数)外,其他维度形状必须一致,但允许包含任意长度的一维数组。垂直堆叠函数np.vstack()则要求输入的ndarrays序列中,除第一个轴(行数)外,其他维度形状必须一致,且若包含一维数组,其长度必须相同。
# 方法2:使用numpy的水平堆叠和竖直堆叠完成所有图像的堆叠,最后一起显示
vs1 = np.hstack((img, invert)) # 水平堆叠
vs2 = np.hstack((gaussianBlur, flip)) # 水平堆叠
result = np.vstack((vs1, vs2)) # 竖直堆叠
以下是完整的项目代码实现:
# -*-coding:utf-8-*-
"""
File Name: color_operation.py
Program IDE: PyCharm
Create File By Author: Hong
"""
import cv2 as cv
import numpy as np
def image_display(image_path: str):
"""
多个图像在一个窗口内显示
:param image_path: 传入图像路径
:return:
"""
img = cv.imread(image_path, cv.IMREAD_COLOR)
# 颜色取反
invert = cv.bitwise_not(img)
# 高斯模糊
gaussianBlur = cv.GaussianBlur(img, (0, 0), 10)
# 镜像
flip = cv.flip(img, 1) # 0表示绕x轴翻转;1表示绕y轴翻转;-1表示绕两个轴翻转
# 方法1:创建一个画布,将所有图像复制到画布中,最后显示画布
h, w, _ = img.shape
img_list = [img, invert, gaussianBlur, flip]
four_view = np.zeros((h * 2 + 10, w * 2 + 10, 3), np.uint8)
four_view[:, :] = 255 # 给所有通道的像素值赋值255
for i in range(len(img_list)):
row = i // 2
col = i % 2
print(row, col)
# 将小图像复制到大画布上。
np.copyto(four_view[(h + 10) * row:h * (row + 1) + 10 * row, (w + 10) * col:w * (col + 1) + 10 * col],
img_list[i])
cv.imshow('result', four_view)
# 方法2:使用numpy的水平堆叠和竖直堆叠完成所有图像的堆叠,最后一起显示
vs1 = np.hstack((img, invert)) # 水平堆叠
vs2 = np.hstack((gaussianBlur, flip)) # 水平堆叠
result = np.vstack((vs1, vs2)) # 竖直堆叠
# 初略解决imshow()中文乱码显示的问题。不能完全解决,有些中文无法显示。这是python-opencv的弊端
def zh_ch(string):
return string.encode('gbk').decode(errors='ignore')
cv.imshow(zh_ch('图片'), result)
cv.waitKey(0)
cv.destroyAllWindows()
if __name__ == '__main__':
path = 'images/daiyutong.png'
image_display(path)
最终显示效果如下:

至此,关于Python OpenCV在单窗口中显示多幅图像的教程已介绍完毕。如需了解更多Python OpenCV图像处理相关内容,欢迎查阅本站往期文章或继续浏览后续内容,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













