使用Numpy结合OpenCV统计图像黑白像素数量结果与实际不符如何解决
问题原因
cv2.imread默认以BGR三通道格式读取图像,哪怕输入图像本身是单通道灰度图,读入后也会被转换为3通道格式,每个像素对应B、G、R三个数值。你当前代码直接对整个三通道数组做相等判断并统计,会把单个像素的三个通道值分别计数:
- 1个纯白色像素三通道值均为255,会被统计为3次符合
img==255的结果,3个白色像素刚好对应你输出的9次统计值 - 1个纯黑色像素三通道值均为0,会被统计为3次符合
img==0的结果,和你输出的36次黑色统计值匹配
解决方法
方案1:读取时直接加载为灰度图
修改imread的读取参数,指定单通道灰度读取,修改对应代码行:
# 第二个参数指定灰度模式读取,读入后数组为二维单通道 img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
读取后不需要再处理通道维度,后续统计逻辑可以直接复用,统计结果就是实际像素数量。
方案2:三通道图像判断时按像素维度聚合
如果必须保留三通道读取的逻辑,统计时增加维度判断,要求单像素的三个通道全部满足条件才计数:
# axis=-1 指最后一个维度(通道维度)全部满足条件才计数 number_of_white_pix = np.sum((img == 255).all(axis=-1)) number_of_black_pix = np.sum((img == 0).all(axis=-1))
内容的提问来源于stack exchange,提问作者WordP
相关产品推荐
相关产品推荐

