赞
踩
转自: https://blog.csdn.net/ITBigGod/article/details/87009082
比如你某个文件夹下有多张图片,你不想imshow一张一张的显示,你想放在一个窗口中显示。
或者是把多张图片放在一个窗体内对比展示,而不是同时打开多个窗体。
如果用单纯的用cv2.imshow打开多个窗体来显示多张图片是这样:
cv2.namedWindow("original_img", cv2.WINDOW_NORMAL)
cv2.resizeWindow('original_img', 1000, 1000)
cv2.imshow('original_img', original_img)
图示:
那么显示出来是多个窗口对应不同的图片。显示不是我们想要的。
使用opencv展示多张图片:
简单例:
def opecv_muti_pic():
# 图1
img = cv.imread('E:\\tmp\\cat1.jpg')
# 图2
img2 = cv.imread('E:\\tmp\\cat2.jpg')
# 图集
imgs = np.hstack([img,img2])
# 展示多个
cv.imshow("mutil_pic", imgs)
#等待关闭
cv.waitKey(0)
效果图:
python3 + opencv3 版:
(函数封装多图)
import argparse import glob import cv2 import numpy as np import os # 一个窗口窗口显示多张图片:python3 + opencv3的版本。 # 传入的参数是: # 1. 图片的集合(大小、通道数需要一致,否则黑屏) # 2. 想显示到一张图片的大小 # 3. 图片间隔大小。 # 如果图片太多,会自动省略多的图片,不够严谨。 def show_in_one(images, show_size=(500, 500), blank_size=2, window_name="merge"): small_h, small_w = images[0].shape[:2] column = int(show_size[1] / (small_w + blank_size)) row = int(show_size[0] / (small_h + blank_size)) shape = [show_size[0], show_size[1]] for i in range(2, len(images[0].shape)): shape.append(images[0].shape[i]) merge_img = np.zeros(tuple(shape), images[0].dtype) max_count = len(images) count = 0 for i in range(row): if count >= max_count: break for j in range(column): if count < max_count: im = images[count] t_h_start = i * (small_h + blank_size) t_w_start = j * (small_w + blank_size) t_h_end = t_h_start + im.shape[0] t_w_end = t_w_start + im.shape[1] merge_img[t_h_start:t_h_end, t_w_start:t_w_end] = im count = count + 1 else: break if count < max_count: print("图片总数为: %s" % (max_count - count)) cv2.namedWindow(window_name) cv2.imshow(window_name, merge_img) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Demonstrate mouse interaction with images') parser.add_argument("-i", "--input", help="Input directory.") args = parser.parse_args() path = args.input if path is None: # 修改为自己的图片存放的文件夹 test_dir = "/home/xxy/PycharmProjects/different_ocr/Auto_Cutting/test" path = test_dir debug_images = [] for infile in glob.glob(os.path.join(path, '*.*')): ext = os.path.splitext(infile)[1][1:] # get the filename extenstion if ext == "png" or ext == "jpg" or ext == "bmp" or ext == "tiff" or ext == "pbm": print(infile) img = cv2.imread(infile) if img is None: continue else: debug_images.append(img) show_in_one(debug_images) cv2.waitKey(0) cv2.destroyWindow()
效果图:
注意:
虽然opencv能正常展示多个图片在一个窗口中,但是只能同样尺寸大小的图片,颜色通道一样才能放在一起展示,(当然你可以做图片预处理,把图片归一化。)
如果你想展示多个不同的图片在一个opencv的窗体里面,包括同一个图片,一个彩色,一个灰度图片都不可以放在一个窗体中。
比如说放不同的尺寸的图片或不同的颜色通道在一起来展示,就会黑屏:
基于上诉原因,我们大多数时候可以借助使用matplotlib来完成这个任务。
import cv2 import matplotlib.pyplot as plt # 使用matplotlib展示多张图片 def matplotlib_multi_pic1(): for i in range(9): img = cv2.imread('/home/xxy/PycharmProjects/different_ocr/Auto_Cutting/test/20171217171857880.png') title="title"+str(i+1) #行,列,索引 plt.subplot(3,3,i+1) plt.imshow(img) plt.title(title,fontsize=8) plt.xticks([]) plt.yticks([]) plt.show() matplotlib_multi_pic1()
效果图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。