使用Python MapReduce计算图像Skewness和Kurtosis无输出问题求助
问题分析与修复方案
你的代码存在几个关键问题,导致控制台无法输出有效结果:
- Mapper输入参数不符合框架约定:MRJob的mapper方法默认接收
(_, value)参数,其中value对应输入文件的每行内容。你写的input_paths不符合规则,且你实际是自行遍历本地文件夹,无需依赖输入参数,直接忽略即可。 - Yield格式错误:当前你yield的是
((image_name, (skewness, kurt)), None),把复合元组作为key、None作为value,导致Reducer只能遍历到无意义的None值,无法输出有效统计结果。正确做法是将文件名作为key,统计结果作为value。 - Reducer逻辑无效:当前Reducer遍历的
values全是None,打印内容没有实际价值。每个图像对应唯一的统计值,只需直接输出文件名和对应的偏度、峰度即可。 - 调试打印的局限性:MRJob在运行时,mapper/reducer内的
print不会直接显示在控制台,应依赖框架的yield输出机制,或在Reducer中进行有效打印。
修复后的代码
import os from mrjob.job import MRJob from scipy.stats import skew, kurtosis import numpy as np from PIL import Image class MetalImageSkewnessKurtosis(MRJob): def mapper(self, _, line): # 忽略输入行,直接遍历目标文件夹 metal_folder = r'D:\polluted_project\metals' for root, dirs, files in os.walk(metal_folder): for file in files: # 兼容大小写的后缀判断 if file.lower().endswith((".jpg", ".jpeg", ".png")): image_path = os.path.join(root, file) image_name = os.path.basename(image_path) # 加载图像并转为灰度图 img = Image.open(image_path).convert('L') pixel_values = np.array(img).flatten() # 计算偏度和峰度 skewness_val = skew(pixel_values) kurt_val = kurtosis(pixel_values) # 输出文件名作为key,统计结果作为value yield image_name, (skewness_val, kurt_val) def reducer(self, image_name, stats): # 每个图像对应一组统计值,直接输出格式化结果 for skewness_val, kurt_val in stats: print(f"{image_name}\t偏度: {skewness_val:.4f}\t峰度: {kurt_val:.4f}") if __name__ == '__main__': MetalImageSkewnessKurtosis.run()
额外说明
- 直接执行脚本即可运行,MRJob会自动调度mapper和reducer,控制台会输出Reducer中打印的格式化结果。
- 改用
file.lower().endswith(...)可以避免因文件名后缀大小写不一致导致的漏处理问题。 - 若想更贴合MRJob的原生输出逻辑,也可以在Reducer中直接
yield image_name, f"偏度: {skewness_val:.4f}, 峰度: {kurt_val:.4f}",框架会自动将结果打印到控制台,无需手动写print。
内容的提问来源于stack exchange,提问作者Suneel Kumar
相关产品推荐
相关产品推荐

