使用OpenCV统计黑白像素结果始终为0的问题求助
问题排查与修复
最直接的原因:文件路径不对
os.listdir() 只返回文件名(比如abc.jpg),但cv2.imread(pic)会在当前脚本的工作目录找这个文件,而非你指定的output_path目录,导致图片读取失败,image为None,后续像素统计自然全为0。
修复方案
1. 拼接完整文件路径
用os.path.join()把目录和文件名拼接成完整路径,确保OpenCV能定位到图片文件。
2. 明确读取灰度图
既然是黑白图像,直接用cv2.IMREAD_GRAYSCALE读取为单通道灰度图,避免多通道(如RGB)重复统计的干扰。
3. 避免除以零报错
若某张图全为白色,黑色像素数为0,计算比例时会触发报错,需添加判断逻辑处理这种情况。
修复后的完整代码
import os import cv2 import numpy as np output_path = "/content/drive/MyDrive/dataset_demo/result_pic" for pic in os.listdir(output_path): if pic.endswith('.jpg'): # 生成完整文件路径 full_img_path = os.path.join(output_path, pic) # 读取为单通道灰度图 image = cv2.imread(full_img_path, cv2.IMREAD_GRAYSCALE) if image is not None: white_pix = np.sum(image == 255) black_pix = np.sum(image == 0) total_pix = white_pix + black_pix # 处理黑色像素为0的情况 ratio = white_pix / black_pix if black_pix != 0 else float('inf') print(f"{pic}: 总像素{total_pix}, 白黑比例{ratio:.2f}") else: print(f"无法读取图片: {pic}")
额外注意点
如果你的“黑白图像”并非严格二值图(存在灰色过渡像素),上述统计只会计算纯黑纯白的像素。若要将所有偏白/偏黑的像素归类统计,需先做二值化处理:
# 以127为阈值,将灰度图转为严格二值图 _, binary_img = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) white_pix = np.sum(binary_img == 255) black_pix = np.sum(binary_img == 0)
内容的提问来源于stack exchange,提问作者Eave_Z
相关产品推荐
相关产品推荐

