【Matplotlib拼图】Python 读取图片序列并将其显示在一个图像中

一、问题描述

在论文或者科研写作中会遇到将多个图放在一个figure中的情况,以便阅读。

这个问题用python的matplotlib和opencv即可解决。(或者用PIL读取图像亦可)效果如下:
图片样例

二、解决方案

1. 文件结构

针对该问题,本人的目录结构如下:

  • mask (文件夹,下面存放从 mask_0.pngmask_19.png 的20张序列图片)
  • visualize.py (python脚本,用于执行并可视化)

2. visualize.py 代码

import os

import matplotlib.pyplot as plt
import cv2 as cv

fig = plt.figure()
path = './mask'	 # 设置好路径
prefix = 'mask_'  # 设置好文件名字的前缀
for i in range(0, 20):  # 设置图片的数目与范围
    plt.subplot(4, 5, i+1)  # 由于这里是20张图,可以设置4行5列的结构,
    						# 注意第三个参数不能为0,所以是i+1
    img = cv.imread(os.path.join(path, prefix+str(i)+'.png'))# 注意:前缀+序列号+图片格式的后缀
    plt.imshow(img)
    plt.xticks([])  # 取消x方向标注
    plt.yticks([])  # 取消y方向标注

if __name__ == '__main__':
    plt.show()

3. 一些思考和探索

为什么不用 enumerate(os.listdir()) 进行遍历?

因为os.listdir()函数在遍历目录下的所有图片的过程中会乱序。

比如会得到一个如下列表:

['mask_0.png', 'mask_1.png', 'mask_10.png', 'mask_11.png', 'mask_2.png', ]

这样的列表,在进行可视化的时候,分明是有一定逻辑顺序的分割mask图像,会乱序排列,进而导致可视化的最终结果也不美观,这对于科研论文的配图是极其不好的

为了追求严谨而美观的效果,于是笔者并没有采用enumerate(os.listdir()) 的方案进行遍历。

当然,条条大路通罗马,如果您执意要使用该方案,这里也有针对 os.listdir() 乱序问题的解决方案

如果您觉得有用,不妨点个小小的赞支持一下~

猜你喜欢

转载自blog.csdn.net/Samurai_Bushido/article/details/129915578
今日推荐