Jupyter Notebook中用Matplotlib并排显示相册图片函数故障求助
解决Jupyter Notebook中Matplotlib并排显示相册图片的问题
我帮你梳理下原代码里的几个核心问题,然后给出能实现网格并排显示的修正版本~
原代码的问题点:
- 错误使用了
list.get(path):list是Python内置类型,没有get方法,你应该是想获取指定目录下的图片路径列表,需要用文件操作相关的工具(比如os模块)来实现。 - 未定义的变量
images:代码里cv2.imread(images)中的images没有声明,应该是遍历到的单个图片路径(另外别用iter当变量名,它是Python内置函数,换成img_path更清晰)。 - 没有利用子图对象实现并排:你虽然创建了
fig, ax = plt.subplots(nrows=2, ncols=2),但原函数完全没用到这些子图,反而每次循环单独调用plt.show(),这会导致图片逐个弹出,没法实现并排布局。
修正后的完整代码
import cv2 import numpy as np import matplotlib.pyplot as plt import os def show_images_in_grid(folder_path, rows=2, cols=2): # 获取文件夹下的所有图片路径(可根据需要添加/修改图片格式后缀) img_paths = [os.path.join(folder_path, filename) for filename in os.listdir(folder_path) if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp'))] # 确保要显示的图片数量不超过子图总数 total_imgs = min(len(img_paths), rows * cols) # 创建子图网格,设置合适的画布大小 fig, axes = plt.subplots(nrows=rows, ncols=cols, figsize=(10, 8)) # 将二维的axes数组转为一维,方便循环遍历 axes = axes.flatten() for idx in range(total_imgs): current_path = img_paths[idx] # 读取图片 img = cv2.imread(current_path) if img is None: print(f"警告:无法读取图片 {current_path}") axes[idx].axis('off') continue # OpenCV默认读入BGR格式,转为Matplotlib需要的RGB格式 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 在对应子图中显示图片 axes[idx].imshow(img_rgb) # 关闭子图的坐标轴 axes[idx].axis('off') # 隐藏多余的子图(如果图片数量不足rows*cols) for idx in range(total_imgs, rows * cols): axes[idx].axis('off') # 自动调整子图间距,让布局更美观 plt.tight_layout() # 显示整个网格图 plt.show()
使用方法
在Jupyter Notebook里直接调用函数,传入你的相册文件夹路径即可:
# 替换成你的相册文件夹绝对/相对路径 show_images_in_grid("path/to/your/photo/album")
额外说明
- 代码里过滤了常见的图片格式,如果你的相册里有其他格式(比如
.webp),可以添加到endswith的参数里; - 处理了图片无法读取的情况,避免程序崩溃;
- 通过
plt.tight_layout()自动调整子图之间的间距,避免图片被裁剪或重叠; - 如果相册里的图片数量超过4张(2行2列),只会显示前4张,你可以修改函数的
rows和cols参数来调整网格大小,比如show_images_in_grid("your/path", rows=3, cols=3)实现3x3的布局。
内容的提问来源于stack exchange,提问作者glomba
相关产品推荐
相关产品推荐

