当前位置: 代码迷 >> 综合 >> numpy cv2 imshow 堆叠图像输出
  详细解决方案

numpy cv2 imshow 堆叠图像输出

热度:5   发布时间:2023-12-15 17:37:27.0

【原理】numpy的ndarray是可以先横向堆叠,再纵向堆叠的。最后显示出整体图像。

【效果】横向堆叠再纵向堆叠

# cv imshow多行多列堆叠import os
import cv2
import numpy as npshow_pic_size = (200, 200) #堆叠后每一个小图片的大小,根据需要调整img_dir = 'D:\Projects\xxx\\test_examples' # 注意该文件夹下的图片命名不能有中文
imgs_list = os.listdir(img_dir)
n = len(imgs_list)
dims = int(n**0.5) # 原始图像个数最好为一个平方数,否则可能会显示不全。最终显示dims列图片。img_all = []all = np.zeros(shape=(200, 200*dims, 3)) # 每行dims列,图像是3维的,最后一个参数为3
all = all.astype(np.uint8) # imshow只显示uint8类型数值list1 = [] # 存放纵向堆叠列表# 堆叠效果:每行dims列,总共dims行
for i in range(n):img_i = cv2.imread(img_dir + '\\' + str(imgs_list[i])) # 读取一张图片img_i = cv2.resize(img_i, show_pic_size) # 调整分辨率大小cv2.putText(img_i, 'img_i', (1,30),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,0,255),2) # 每次在图片上添加相应的文字,格式为:照片/添加的文字/左上角坐标/字体/字体大小/颜色/字体粗细img_all.append(img_i)if i % dims == dims - 1: # 每dims个横向堆叠一次rows = np.hstack(img_all)list1.append(all)list1.append(rows)all = np.vstack(list1) # 每dims个纵向堆叠一次img_all = [] # 横向堆叠清空list1 = [] # 纵向堆叠列表清空all = all[200:, :] # 删去前200行的全0(显示为黑色)
cv2.imshow('Result', all) # 不要中文命名,否则会乱码报错。
cv2.waitKey(0)

 

简单封装一下:

# 输入为图片路径列表和每张图片的小标题列表,输出直接展示拼接后的图片
def stack_images(imgs_list, titles_list):# cv imshow多行多列堆叠,行数和列数为图片数目的平方根import osimport cv2import numpy as npshow_pic_size = (200, 200)  # 堆叠后每一个小图片的大小,根据需要调整n = len(imgs_list)dims = int(n ** 0.5)  # 原始图像个数最好为一个平方数,否则可能会显示不全。最终显示dims列图片。img_all = []all = np.zeros(shape=(200, 200 * dims, 3))  # 每行dims列,图像是3维的,最后一个参数为3all = all.astype(np.uint8)  # imshow只显示uint8类型数值list1 = []  # 存放纵向堆叠列表# 堆叠效果:每行dims列,总共dims行for i in range(n):img_i = cv2.imread(imgs_list[i])  # 读取一张图片img_i = cv2.resize(img_i, show_pic_size)  # 调整分辨率大小title_i = titles_list[i]cv2.putText(img_i, title_i, (1, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255),2)  # 每次在图片上添加相应的文字,格式为:照片/添加的文字/左上角坐标/字体/字体大小/颜色/字体粗细img_all.append(img_i)if i % dims == dims - 1:  # 每dims个横向堆叠一次rows = np.hstack(img_all)list1.append(all)list1.append(rows)all = np.vstack(list1)  # 每dims个纵向堆叠一次img_all = []  # 横向堆叠清空list1 = []  # 纵向堆叠列表清空all = all[200:, :]  # 删去前200行的全0(显示为黑色)cv2.imshow('Result', all)  # 不要中文命名,否则会乱码报错。cv2.waitKey(0)

 

 

 

【效果】(图片如涉及版权请联系我删除)

【其他】

1,更多put_text字体:https://www.jianshu.com/p/e99ede5103ed

2,imshow窗体标题中文乱码解决办法:使用PIL(pillow):https://stackoverflow.com/questions/50854235/how-to-draw-chinese-text-on-the-image-using-cv2-puttextcorrectly-pythonopen

 

【致谢】感谢以上链接作者及:

https://blog.csdn.net/GAN_player/article/details/78155283

https://blog.csdn.net/jacke121/article/details/87723912#commentBox

https://blog.csdn.net/ITBigGod/article/details/87009082