这个问题在这里已有答案:
我有一个np.array
,它本质上是RGB格式的图像。我重新塑造它更容易使用。因此,它的形状类似于:(22618, 3)
,每行对应一个像素。我想检查是否有一些像素对应于特定的颜色,以及它们中有多少是这种颜色。
让我们说颜色是在元组中定义的(0, 255, 255)
和(255, 0, 0)
。包含数据的np.array也是data
(真正原创!)。
当我尝试:
any(data[(data2 == colors[0])])
它按预期工作。如果有任何像素(三元组)对应于colors[0]
的三元组,则返回True
,否则False
。但当我尝试这样的事情:
np.sum(data[(data == colors[1])])
结果是对发现包含相同颜色的每个像素的所有像素值(R + G + B)求和。
我只使用包含布尔值(data == colors[1]
)的数组,但收效甚微。另外,我尝试对特定轴求和并没有多大帮助:
np.sum(data == colors[1], axis=0)
数组([373,22618,22618])
我可以在这里做一些棘手的数学知道,最多373
像素可能是正确的颜色,但它不是精确的计算。我可以在这个bincount
中使用像question这样的功能,但结果似乎需要额外的工作,而且一些实验没有显示按预期工作。
那么,我如何计算具有相同颜色的像素数?有任何想法吗?
您希望给定行的所有元素都匹配您的模板颜色,因此您应该使用np.all
逐行,即axis
1.这将导致一个布尔数组,每行有一个真值。
剩下要做的就是数数:
np.count_nonzero(np.all(data == colors[i], axis=1))
我们来看看这些数据:
data = np.array([(0,0,255),(0,0,255),(0,255,0),(0,0,0)])
我们正在寻找这种颜色:
colour = (0,0,255)
计算匹配的元组数:
match = [(x == colour).all() for x in data]
你的答案:
print(np.sum(match))
一内胆:
print(np.sum([(x == colour).all() for x in data]))
(如果我的问题是正确的)
如果您对许多颜色感兴趣,那么按照这些方式做一些事情会更有效:
import numpy_indexed as npi
unique_colors, counts = npi.count(npi.intersection(data, colors))
这将有效地计算所有感兴趣的颜色的计数。 (免责声明:我是numpy_indexed包的作者)。