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条统计结果?
问题原因
read_directory1里的return result写在了for循环内部,第一次循环处理完第一张图片就直接终止函数返回结果,后面两张图片根本没机会处理。- 每次循环都重新初始化
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
相关产品推荐
相关产品推荐

