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

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;
        
    

【讨论】:

以上是关于计算图像中白色像素的总数会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

在MATLAB中找出二进制图像中白色区域的像素数以及原始图像中ROI的像素数

从图像中删除区域 - ImageJ

如何用matlab计算二值化图中白色区域的像素点个数

计算图像中白色背景上蓝调线的数量

通过分析二进制前景图像的白色像素来计算车辆计数所需的想法

使用python-opencv 统计二值图像中白色像素点的个数(表示面积)