Python 2计算图像黑色像素占比出错:预期80.0%却得0.0%求排查
黑色像素占比计算代码错误排查与修复
问题重现
你遇到的情况是:明明按照逻辑统计黑色像素(B)占比应该得到80.0%,但运行代码后输出却是0.0%。你的代码如下:
line1 = "BBBBBBBBBB" line2 = "BBNNBBNNBB" line3 = "BBNNBBNNBB" line4 = "BBBBBBBBBB" line5 = "BBBBNNBBBB" line6 = "BBNBBBBNBB" line7 = "BBBNNNNBBB" line8 = "BBBBBBBBBB" data = ["BBBBBBBBBB", "BBNNBBNNBB", "BBNNBBNNBB", "BBBBBBBBBB", "BBBBNNBBBB", "BBNBBBBNBB", "BBBNNNNBBB", "BBBBBBBBBB"] def percentBlack(data): numB = 0 numP = 0 for line in data: for pixel in line: if pixel == "B": numB += 1 numP += 1 return round((numB/numP)*100,1) print(percentBlack(data))
问题根源
出现这个错误最可能的原因是你在Python 2环境下运行这段代码。Python 2中整数之间的除法会执行「地板除」——直接舍弃小数部分。你的代码中总黑色像素numB=64,总像素numP=80,64/80在Python2中会得到0,乘以100后还是0,最终round(0,1)就输出0.0。
而在Python3中,整数除法默认返回浮点数,64/80=0.8,计算后就能得到预期的80.0%。
改进建议
有两种方式可以解决这个问题:
- 方式一:强制浮点数除法(兼容Python2/3)
在除法运算前把其中一个操作数转为浮点数,确保得到浮点数结果:
或者在代码最开头添加语句,让Python2的除法行为和Python3一致:return round((float(numB)/numP)*100,1)from __future__ import division # 后续代码保持不变 - 方式二:切换到Python3环境运行
如果你的运行环境允许,直接用Python3执行代码即可——原逻辑本身是正确的,能直接输出80.0%。
另外可以快速验证下data列表是否确实包含了你需要的所有行(从你给出的代码看这部分是没问题的)。
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

