计算图像中特定颜色强度的像素

时间:2019-08-15 20:35:00

标签: python opencv

我想对图像中[150,150,150]的颜色强度的像素进行计数,并且确定了图像的形状,并进行了逐像素扫描图像的循环,但是遇到了这个错误,我没有不知道为什么会出现。

但是我遇到了以下错误:

File "D:/My work/MASTERS WORK/FUNCTIONS.py", line 78, in <module>
    if img[x,y] == [150,150,150]:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

代码:

img = cv2.imread('imj.jpg')
h ,w =img.shape[:2]
m= 0
for y in range(h):
    for x in range(w):
        if img[x,y] == [150,150,150]:
            m+=1
print('No. of points = ' , m)

2 个答案:

答案 0 :(得分:0)

应该使用Numpy对处理进行矢量化处理,而不是使用for循环。要计算颜色强度[150,150,150]的像素数,可以使用np.count_nonzero()

count = np.count_nonzero((image == [150, 150, 150]).all(axis = 2)) 

这是一个例子。我们创建大小为[400,400]的黑色图像,并将左下角的颜色设置为[150,150,150]

import numpy as np

# Create black image
image = np.zeros((400,400,3), dtype=np.uint8)
image[300:400,300:400] = (150,150,150)

然后我们计算此强度下的像素数

# Count number of pixels of specific color intensity
count = np.count_nonzero((image == [150, 150, 150]).all(axis = 2))
print(count)
  

10000

最后,如果要更改该强度的像素,我们可以找到所有所需的像素并使用蒙版。在这种情况下,我们将像素变为绿色

# Find pixels of desired color intensity and draw onto mask
mask = (image == [150.,150.,150.]).all(axis=2)

# Apply the mask to change the pixels
image[mask] = [36,255,12]

完整代码

import numpy as np

# Create black image
image = np.zeros((400,400,3), dtype=np.uint8)
image[300:400,300:400] = (150,150,150)

# Count number of pixels of specific color intensity
count = np.count_nonzero((image == [150, 150, 150]).all(axis = 2))
print(count)

# Find pixels of desired color intensity and draw onto mask
mask = (image == [150.,150.,150.]).all(axis=2)

# Apply the mask to change the pixels
image[mask] = [36,255,12]

答案 1 :(得分:0)

不建议对具有给定值的像素进行计数,但是对于上面的情况(相同值rgb),您仍然可以使用以下代码:

for x in range(h):
    for y in range(w):
        if np.all(img[x, y]==150, axis=-1): # (img[x, y]==150).all(axis=-1)
            m+=1

如果您要计算rgb的不同值的像素,请使用np.all(img[x, y]==[b_value, g_value, r_value], axis=-1),因为OpenCV在{{1}之后}。

或者,在上述情况下,您可以使用bgr或简单地使用np.count_nonzero(np.all(img==[b_value, g_value, r_value],axis=-1))