当前位置:   article > 正文

CV | python使用opencv或matplotlib把多张图片显示在一个窗口内的方法_cv2显示多张图片

cv2显示多张图片

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

1. 单纯的用cv2.imshow打开多个窗体

比如你某个文件夹下有多张图片,你不想imshow一张一张的显示,你想放在一个窗口中显示。
或者是把多张图片放在一个窗体内对比展示,而不是同时打开多个窗体。

如果用单纯的用cv2.imshow打开多个窗体来显示多张图片是这样:

    cv2.namedWindow("original_img", cv2.WINDOW_NORMAL)
    cv2.resizeWindow('original_img', 1000, 1000)
    cv2.imshow('original_img', original_img)

  • 1
  • 2
  • 3
  • 4

图示:

在这里插入图片描述

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

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

效果图:

在这里插入图片描述

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

效果图:

在这里插入图片描述

注意:

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

效果图:

在这里插入图片描述


以上就是python下使用opencv或matplotlib,把多张图片显示在一个窗体内的方式。 便于对比图片。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/312038
推荐阅读
相关标签
  

闽ICP备14008679号