Python PIL如何批量计算图片平均红通道值并完成排序
批量计算图片平均红色通道值实现方案
你不需要重复编写10次单图处理代码,把单张图片的平均R值计算逻辑抽为可复用块,配合循环遍历所有目标文件即可,同时可以优化原有逐像素遍历的低效写法。
注意你原有代码存在笔误:Image.open('GRK_imge1.png') 文件名拼写缺失字母a,正确文件名为GRK_image1.png,直接运行会触发文件不存在报错。
基础兼容版本(无额外第三方依赖)
你的图片命名为连续规则的GRK_image1.png到GRK_image10.png,直接循环生成文件名遍历即可,逻辑和你原有写法完全兼容:
from PIL import Image storeAllImages = [] # 遍历1-10的序号,匹配所有目标图片 for img_idx in range(1, 11): file_name = f'GRK_image{img_idx}.png' # 统一转RGB格式,避免部分图片带透明通道导致通道拆包报错 img = Image.open(file_name).convert('RGB') r_pixels = [] for x in range(640): for y in range(480): R, _, _ = img.getpixel((x, y)) r_pixels.append(R) avg_r = sum(r_pixels) / len(r_pixels) storeAllImages.append((file_name, avg_r)) print(f"{file_name} 平均红色通道值:{avg_r}") # 需要按平均R值排序直接调用列表排序即可,默认升序 storeAllImages.sort(key=lambda item: item[1]) print("按平均红色通道值排序结果:", storeAllImages)
高性能优化版本
双层循环逐像素调用getpixel执行效率很低,当处理图片数量较多时耗时明显,安装numpy库后可以将处理速度提升数十倍:
from PIL import Image import numpy as np storeAllImages = [] for img_idx in range(1, 11): file_name = f'GRK_image{img_idx}.png' img = Image.open(file_name).convert('RGB') # 将图片转为像素数组,结构为(高度, 宽度, 通道数) img_array = np.array(img) # 直接提取红色通道(通道索引0)计算全局均值 avg_r = img_array[:, :, 0].mean() storeAllImages.append((file_name, avg_r)) storeAllImages.sort(key=lambda item: item[1]) print(storeAllImages)
如果后续图片命名不再是连续序号,可以用你已经导入的glob模块做通配符匹配,将循环遍历部分替换为
for file_name in glob.glob('GRK_image*.png'):,即可自动扫描当前目录下所有以GRK_image开头的png格式图片,不需要手动维护序号范围。
内容的提问来源于stack exchange,提问作者Maibaozi
相关产品推荐
相关产品推荐

