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
答案 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;
}
}
}