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

Python列表仅返回单条结果:如何让图片红色像素统计结果完整返回?

问题描述

我写了一段统计文件夹内每张图片红色像素数量及占比的Python代码:

def sum_pixel(img):
    sum = img.shape[0] * img.shape[1]
    return sum

def red_part(Min_L, Max_L,img):
    redP_sum = 0
    x = Min_L
    while x < Max_L+1:
        redP_sum = redP_sum + np.where(img == x)[0].shape[0]
        x+=1
    red_percentage = redP_sum/sum_pixel(img)*100
    return [redP_sum, red_percentage]

def read_directory1(directory_name):
    # this loop is for read each image in this foder,directory_name is the foder name with images.
    for filename in os.listdir(r"./"+directory_name):

        #img is used to store the image data 
        img = cv2.imread(directory_name + "/" + filename)
        array_of_img.append(img)

        img_L = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        result = []
        redP = red_part(60,100,img_L)
        result.append(redP)


        return result

文件夹里有3张图片,但调用read_directory1只返回1条结果[[223247, 7.535916339233875]];但用下面的代码print输出时,能正常得到3条正确结果:

def read_directory2(directory_name):
    for filename in os.listdir(r"./"+directory_name):
        #img is used to store the image data 
        img = cv2.imread(directory_name + "/" + filename)
        array_of_img.append(img)

        img_L = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        result = []
        redP = red_part(60,100,img_L)
        result.append(redP)

        print(result)

输出结果:

[[223247, 7.535916339233875]]
[[43506, 2.932113742236025]]
[[77523, 5.224710468426501]]

请问如何修改代码,让列表能返回完整的3条统计结果?

问题原因
  1. read_directory1里的return result写在了for循环内部,第一次循环处理完第一张图片就直接终止函数返回结果,后面两张图片根本没机会处理。
  2. 每次循环都重新初始化result = [],就算不提前return,最后也只会保留最后一张图片的统计结果。
修改后的代码

把result的初始化移到for循环外面,循环内只做结果追加,最后在循环结束后统一返回整个结果列表:

import os
import cv2
import numpy as np

# 提前定义全局变量,避免报错
array_of_img = []

def sum_pixel(img):
    return img.shape[0] * img.shape[1]  # 简化写法

def red_part(Min_L, Max_L, img):
    # 用numpy向量化操作替代while循环,效率更高
    red_pixels = np.logical_and(img >= Min_L, img <= Max_L)
    redP_sum = np.sum(red_pixels)
    red_percentage = redP_sum / sum_pixel(img) * 100
    return [redP_sum, red_percentage]

def read_directory(directory_name):
    result = []  # 结果列表初始化放在循环外
    for filename in os.listdir(r"./" + directory_name):
        img_path = os.path.join(directory_name, filename)  # 用os.path.join拼接路径更稳妥
        img = cv2.imread(img_path)
        if img is None:  # 增加图片读取失败的判断,避免崩溃
            print(f"无法读取图片: {filename}")
            continue
        array_of_img.append(img)
        
        img_L = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        redP = red_part(60, 100, img_L)
        result.append(redP)
    
    return result  # 循环结束后返回完整结果列表
额外优化说明
  • 用os.path.join拼接图片路径,避免因操作系统路径分隔符差异导致的错误。
  • 增加图片读取失败的判断逻辑,防止无效图片破坏程序执行。
  • 重写red_part函数,用numpy向量化操作替代逐值循环,处理大尺寸图片时效率会大幅提升。

内容的提问来源于stack exchange,提问作者Frank Xie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:05:18