计算图像中白色像素的总数

新手上路,请多包涵

我正在尝试计算下图中白色像素的总数:

图片

但是用我的代码,我得到了这个错误

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 许可协议

阅读 1.1k
2 个回答

注意 Image 是大写的……在 PIL 中, Image 是一个类。实际图像数据是类内部的众多属性之一,PIL 不使用 numpy 数组。因此,您的图像不是 numpy 数组。如果要转换为 numpy 数组,只需将图像封装为数组即可:

 img = np.array(img)

如果您使用 OpenCV 读取图像,那么它已经是一个 numpy 数组。

 img = cv2.imread(filename)

另请注意,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:因此对于您的图像,此代码可以正常工作:

 import cv2
import numpy as np

img = cv2.imread('img.png', cv2.IMREAD_GRAYSCALE)
n_white_pix = np.sum(img == 255)
print('Number of white pixels:', n_white_pix)

白色像素数:5

注意这里 cv2.IMREAD_GRAYSCALE 刚好等于0,但这是更明确的。

原文由 alkasm 发布,翻译遵循 CC BY-SA 3.0 许可协议

在使用它之前,必须清楚地了解 cv2.countNonZero()

  • 它只能用于单通道图像。换句话说,只有两个维度(宽度和高度)的图像。当与 3 通道图像一起使用时,您将面临断言错误: (-215:Assertion failed) cn == 1
  • 顾名思义,它计算图像中像素值大于 0 的像素数,即 [1 - 255] 范围内的像素值

示例 1:

下面是一个二值图像:

在此处输入图像描述

 spot_img = cv2.imread('spots.jpg', 0)
binary_img = cv2.threshold(spot_img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
cv2.countNonZero(binary_img)

5个

图像中有 5 个非零像素。鉴于图像是二进制的,我们可以得出结论,有 5 个白色像素(像素值 = 255)

示例 2:

在此处输入图像描述

 code_img = cv2.imread(r'C:\Users\524316\Desktop\Stack\m1.png', 0)
cv2.countNonZero(code_img)

5937

在上面的灰度图像中,图像中有 5937 个非零像素。这包括 [1 - 255] 之间的像素值

要仅获取白色像素 [255] 的计数,请使用 np.sum() 如上所述:

 np.sum(code_img == 255)

5792

要获取特定像素值的计数,请使用与上面相同的方法

原文由 Jeru Luke 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题