You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()

额外说明

  1. 直接执行脚本即可运行,MRJob会自动调度mapper和reducer,控制台会输出Reducer中打印的格式化结果。
  2. 改用file.lower().endswith(...)可以避免因文件名后缀大小写不一致导致的漏处理问题。
  3. 若想更贴合MRJob的原生输出逻辑,也可以在Reducer中直接yield image_name, f"偏度: {skewness_val:.4f}, 峰度: {kurt_val:.4f}",框架会自动将结果打印到控制台,无需手动写print。

内容的提问来源于stack exchange,提问作者Suneel Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:23:09