计算图像中白色像素的总数会引发错误
Posted
技术标签:
【中文标题】计算图像中白色像素的总数会引发错误【英文标题】:Count total number of white pixels in an image is throwing an error 【发布时间】:2018-05-09 17:06:33 【问题描述】: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
【问题讨论】:
使用cv2.imread(filename, 3)
3 for being bgr
并在传递给countNonZero
时确保你只获得一个像img[0]
这样的频道
@pixelthread 不通过 cmets 添加信息。改为改进您的帖子!
对不起,我不知道它是怎么出错的,我编辑了我希望现在可以了
PIL: TypeError: src is not a numpy array, neither a scalar的可能重复
我建议如果您编辑您的 OP,请不要更改您发布的代码(除非您包含错误),而是在之后添加编辑后的代码。因为现在您上面的错误代码实际上并没有跟随它下面的代码,这会使以后阅读此问题的其他人感到困惑。
【参考方案1】:
注意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)
来计算非零值。对于三通道阵列,这将独立计算每个通道中的所有零。如果你只想包含所有三种颜色都为零的,你可以做很多事情——最简单的可能是将所有通道一起添加到一个二维数组中,然后像上面一样做。
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,但这更明确。
【讨论】:
img=cv2.imread(filename,3) img = np.array(img) TP= width * height white= TP - cv2.countNonZero(img) print "Dimensions:", img.size, "Total pixels:", TP, "White", white
它仍然没有返回白色像素的总数
如果你是用OpenCV读取图像,它已经是一个numpy数组,所以你不需要再次投射它。你也不需要在imread()
中使用 3;任何大于 0 的数字都会给出 BGR 图像,但默认情况下它无论如何都会读取为 BGR。检查docs for cv2.countNonZero()
;它仅适用于单通道图像。
没有错误,但**白色像素和总像素相同**
@pixelthread 看看我的第二次编辑;你没有计算白色像素。发布示例图像,我可以通过显示该图像的白色像素计数进行编辑。【参考方案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;
【讨论】:
以上是关于计算图像中白色像素的总数会引发错误的主要内容,如果未能解决你的问题,请参考以下文章