我想对图像中[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)
答案 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)
不建议对具有给定值的像素进行计数,但是对于上面的情况(相同值r
,g
和b
),您仍然可以使用以下代码:
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
如果您要计算r
,g
和b
的不同值的像素,请使用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))
。