pix*_*ead 2 python opencv numpy image-processing python-imaging-library
图像我正在尝试计算图像中白色像素的总数。但是用我的代码,我得到这个错误
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
Run Code Online (Sandbox Code Playgroud)
请注意,Image大写...在PIL中Image是一类。实际的图像数据是该类内部的许多属性之一,并且PIL不使用numpy数组。因此,您的图像不是一个numpy数组。如果要转换为numpy数组,只需将图像封装为数组:
img = np.array(img)
Run Code Online (Sandbox Code Playgroud)
如果您使用OpenCV读取图像,则该图像已经作为一个numpy数组出现。
img = cv2.imread(filename)
Run Code Online (Sandbox Code Playgroud)
另请注意,PIL中的通道顺序与OpenCV不同。在PIL中,图像以RGB顺序读取,而在OpenCV中,它们以BGR顺序读取。因此,如果您使用PIL进行阅读但使用OpenCV进行显示,则需要在显示之前交换频道。
编辑:另外,检查OpenCV文档中的countNonZero()。该功能仅适用于单通道阵列,因此您需要将图像转换为灰度,或者决定如何计算零。您也可以仅使用numpy np.sum(img == 0)来计数零值或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)
Run Code Online (Sandbox Code Playgroud)
白色像素数量:5
注意这里cv2.IMREAD_GRAYSCALE等于0,但这是更明确的。