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)

图示:

pythonimshow pythonimshow的图怎么放在一起_python


那么显示出来是多个窗口对应不同的图片。显示不是我们想要的。

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)

效果图:

pythonimshow pythonimshow的图怎么放在一起_pythonimshow_02

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()

效果图:

pythonimshow pythonimshow的图怎么放在一起_opencv窗口显示多张图片_03


注意:

虽然opencv能正常展示多个图片在一个窗口中,但是只能同样尺寸大小的图片,颜色通道一样才能放在一起展示,(当然你可以做图片预处理,把图片归一化。)

如果你想展示多个不同的图片在一个opencv的窗体里面,包括同一个图片,一个彩色,一个灰度图片都不可以放在一个窗体中。

比如说放不同的尺寸的图片或不同的颜色通道在一起来展示,就会黑屏:

pythonimshow pythonimshow的图怎么放在一起_opencv窗口显示多张图片_04

基于上诉原因,我们大多数时候可以借助使用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()

效果图:

pythonimshow pythonimshow的图怎么放在一起_图片对比的方式_05