python使用opencv或matplotlib把多张图片显示在一个窗口内的方法
比如你某个文件夹下有多张图片,你不想imshow一张一张的显示,你想放在一个窗口中显示。
或者是把多张图片放在一个窗体内对比展示,而不是同时打开多个窗体。
如果用单纯的用cv2.imshow打开多个窗体来显示多张图片是这样:
cv2.namedWindow("original_img", cv2.WINDOW_NORMAL)
cv2.resizeWindow('original_img', 1000, 1000)
cv2.imshow('original_img', original_img)
图示:
那么显示出来是多个窗口对应不同的图片。显示不是我们想要的。
2. 使用opencv展示多张图片
使用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)
效果图:
3. 使用python3 + opencv3 一个窗口中显示多张图片
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()
效果图: