我正在尝试计算下图中白色像素的总数:
但是用我的代码,我得到了这个错误
src 不是 numpy 数组,也不是标量。
这是我的代码:
img=cv2.imread(filename,1)
TP= width * height
white= TP - cv2.countNonZero(img[1])
print "Dimensions:", img.size, "Total pixels:", TP, "White", white
原文由 pixelthread 发布,翻译遵循 CC BY-SA 4.0 许可协议
注意
Image
是大写的……在 PIL 中,Image
是一个类。实际图像数据是类内部的众多属性之一,PIL 不使用 numpy 数组。因此,您的图像不是 numpy 数组。如果要转换为 numpy 数组,只需将图像封装为数组即可:如果您使用 OpenCV 读取图像,那么它已经是一个 numpy 数组。
另请注意,PIL 中的通道顺序与 OpenCV 中的不同。在 PIL 中,图像以 RGB 顺序读取,而在 OpenCV 中,它们以 BGR 顺序读取。因此,如果您使用 PIL 读取但使用 OpenCV 显示,则需要在显示之前交换通道。
编辑:另外,检查 OpenCV 文档中的
countNonZero()
。此函数仅适用于单通道数组,因此您需要将图像转换为灰度,或决定如何计算零。您也可以仅通过np.sum(img == 0)
使用 numpy 来计算零值的数量,或np.sum(img > 0)
来计算非零值。对于三通道阵列,这将独立计算每个通道中的所有零。如果你只想包括所有三种颜色中都为零的那些,你可以做很多事情——最简单的可能是将所有通道一起添加到一个二维数组中,然后像上面一样做。Edit2:另外,您的代码现在正在计算 黑色 像素的数量,而不是白色像素的数量。
countNonZero()
将返回大于 0 的所有像素的数量。然后从像素总数中减去它……这将只给你黑色像素。如果您只想计算白色像素的数量,np.sum(img == 255)
。Edit3:因此对于您的图像,此代码可以正常工作:
注意这里
cv2.IMREAD_GRAYSCALE
刚好等于0,但这是更明确的。