如何按文件名排序图片并计算均值与标准差(Python实现)
问题解答与代码优化建议
一、关于文件名升序排序
当然可以实现,只需要先筛选出目标图片文件,再对文件列表进行升序排序即可,Python的sorted()函数默认按字符串升序排列,刚好匹配文件名的排序需求。
二、代码具体优化建议与修改点
1. 实现排序逻辑
原代码先遍历所有文件再判断后缀,建议先筛选出符合格式的图片文件,再进行排序,这样更高效:
# 替换原有的listOfImageFiles和筛选逻辑 image_files = sorted( [f for f in os.listdir(dir_path) if f.lower().endswith(fileext)] )
这里用lower()是为了兼容大写后缀的情况(比如.PNG、.JPG),避免漏处理。
2. 避免重复读取图片
你当前代码里用Image.open()和mahotas.imread()分别读取了同一张图片,属于重复IO操作,会拖慢程序速度。建议二选一:
- 如果只需要统计均值和标准差,用PIL的
ImageStat.Stat就足够,不需要mahotas; - 如果需要对图片数组做后续操作,用mahotas读取后,用numpy计算均值和标准差即可,不需要PIL。
3. 完善文件后缀匹配
原代码的fileext里,建议给所有后缀补全点号(比如不要写png,要写.png),避免误匹配类似testpng这种不带后缀的文件;同时用lower()处理文件名,兼容大小写后缀。
4. 添加异常处理
图片文件可能存在损坏、格式不兼容的情况,直接读取会导致程序崩溃,建议加上异常捕获:
try: # 图片读取与统计代码 except Exception as e: print(f"处理文件 {image_file} 出错: {str(e)}")
5. 优化输出可读性
当前只打印均值和标准差,无法对应到具体文件,建议输出时带上文件名,方便后续核对结果。
修改后的完整代码示例
import os from PIL import Image, ImageStat import numpy as np import mahotas dir_path = "The file path" fileext = ('.png', '.jpg', '.jpeg') # 筛选并按文件名升序排序图片文件 image_files = sorted( [f for f in os.listdir(dir_path) if f.lower().endswith(fileext)] ) for image_file in image_files: img_path = os.path.join(dir_path, image_file) print(f"=== 处理文件: {image_file} ===") try: # 方案1:使用PIL完成统计(无需额外数组操作) with Image.open(img_path) as im: stat = ImageStat.Stat(im) print(f"PIL均值: {stat.mean}") print(f"PIL标准差: {stat.stddev}") # 方案2:使用mahotas+numpy统计(适合后续数组处理) # img = mahotas.imread(img_path) # mean = img.mean() # std_dev = np.std(img) # print(f"Mahotas均值: {mean}") # print(f"Mahotas标准差: {std_dev}") except Exception as e: print(f"读取失败: {str(e)}") print() # 空行分隔不同文件的结果
内容的提问来源于stack exchange,提问作者Neko Lim
相关产品推荐
相关产品推荐

