【问题标题】: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 添加信息。改为改进您的帖子!
  • 对不起,我不知道它是怎么出错的,我编辑了我希望现在可以了
  • 我建议如果您编辑您的 OP,请不要更改您发布的代码(除非您包含错误),而是在之后添加编辑后的代码。因为现在您上面的错误代码实际上并没有跟随它下面的代码,这会使以后阅读此问题的其他人感到困惑。

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


【解决方案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;
        }
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 2021-02-23
    • 2020-03-07
    • 2020-07-25
    • 1970-01-01
    • 2015-02-13
    • 2014-05-22
    • 2012-01-15
    相关资源
    最近更新 更多