计算图像中白色像素的总数会引发错误

时间:2017-11-26 08:38:39

标签: python numpy opencv image-processing python-imaging-library

Image 我正在尝试计算图像中白色像素的总数。但是使用我的代码,我收到了这个错误

  

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

2 个答案:

答案 0 :(得分:5)

请注意,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 docs for countNonZero()。此功能仅适用于单通道阵列,因此您需要将图像转换为灰度,或者决定如何计算零。您也可以仅使用np.sum(img == 0)的numpy来计算零值的数量,或者np.sum(img > 0)来计算非零值。对于三通道阵列,这将独立计算每个通道中的所有零。如果你想只包括所有三种颜色都为零的那些,你可以做很多事情 - 最简单的可能是将所有通道一起添加到一个2D数组中,然后按照上面的方式进行。

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,但这更明确。

答案 1 :(得分:2)

我正在使用地图数据结构,它将为您提供图像中不同的像素及其计数。您可以使用其他任何数据结构,对此感到满意。

map<Vec3b, int> palette;
for (int y = 0; y<im.rows; y++) {

for (int x = 0; x<im.cols; x++)
    {
        Vec3b color = im.at<Vec3b>(Point(x, y));
        if (palette.count(color) == 0)
        {
            palette[color] = 1;
        }
        else
        {
            palette[color] = palette[color] + 1;
        }
    }
}