如何批量处理文件夹内500张图像并绘制亮度均值直方图?
批量处理图像亮度均值并绘制直方图方案
没问题,我来帮你把单张图像的亮度计算逻辑扩展成批量处理方案,同时实现直方图绘制,直接上干货:
1. 先确认需要的依赖库
首先确保你已经安装了这些必要的库,如果没有的话,执行以下命令安装:
pip install opencv-python numpy matplotlib
2. 完整代码实现
下面是整合后的批量处理代码,我加了详细注释,方便你理解每一步:
import cv2 import numpy as np import os import matplotlib.pyplot as plt # 设置你的图像文件夹路径,替换成实际路径 image_folder = "path/to/your/images" # 初始化列表存储所有图像的亮度均值 brightness_values = [] # 遍历文件夹中的所有JPG图像 for filename in os.listdir(image_folder): # 只处理JPG格式的文件(注意区分大小写,根据你的实际文件后缀调整) if filename.lower().endswith(".jpg"): img_path = os.path.join(image_folder, filename) try: # 读取图像 img = cv2.imread(img_path) if img is None: print(f"警告:无法读取图像 {filename},跳过") continue # 计算亮度均值,和你单张的逻辑一致 avg_color_per_row = np.average(img, axis=0) avg_color = np.average(avg_color_per_row, axis=0) brightness = sum(avg_color) / 3 # 将亮度值加入列表 brightness_values.append(brightness) print(f"已处理 {filename},亮度均值:{brightness:.2f}") except Exception as e: print(f"处理 {filename} 时出错:{str(e)}") # 绘制亮度均值直方图 plt.figure(figsize=(10, 6)) # 可以根据你的数据分布调整bins的数量,比如20、30 plt.hist(brightness_values, bins=20, edgecolor='black') plt.title("图像亮度均值分布直方图") plt.xlabel("亮度均值") plt.ylabel("图像数量") plt.grid(axis='y', alpha=0.75) # 显示图像或者保存到文件 plt.show() # 如果需要保存直方图,取消下面的注释 # plt.savefig("brightness_histogram.png")
3. 关键细节说明
- 文件遍历:用
os.listdir遍历文件夹,同时通过后缀过滤只处理JPG图像,避免误处理其他文件;也可以用glob模块更简洁,比如glob.glob(os.path.join(image_folder, "*.JPG")),适合文件名大小写固定的情况。 - 异常处理:加入
try-except和img is None的判断,防止个别损坏的图像导致程序中断,同时给出明确提示。 - 直方图优化:
bins参数可以根据你的实际亮度分布调整,比如如果亮度值集中在某个区间,增加bins数量能更清晰展示分布;figsize用来调整图的大小。 - 数据后续使用:
brightness_values列表里存储了所有有效图像的亮度均值,你可以基于这个列表进一步筛选有效图像(比如剔除低于/高于某个阈值的图像)。
内容的提问来源于stack exchange,提问作者Terry Liu
相关产品推荐
相关产品推荐

