计算对应于2D np.array中特定行的行(向量)[复制]

问题描述 投票:1回答:3

这个问题在这里已有答案:

我有一个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这样的功能,但结果似乎需要额外的工作,而且一些实验没有显示按预期工作。

那么,我如何计算具有相同颜色的像素数?有任何想法吗?

python arrays numpy
3个回答
3
投票

您希望给定行的所有元素都匹配您的模板颜色,因此您应该使用np.all逐行,即axis 1.这将导致一个布尔数组,每行有一个真值。

剩下要做的就是数数:

np.count_nonzero(np.all(data == colors[i], axis=1))

0
投票

我们来看看这些数据:

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]))

(如果我的问题是正确的)


0
投票

如果您对许多颜色感兴趣,那么按照这些方式做一些事情会更有效:

import numpy_indexed as npi
unique_colors, counts = npi.count(npi.intersection(data, colors))

这将有效地计算所有感兴趣的颜色的计数。 (免责声明:我是numpy_indexed包的作者)。

© www.soinside.com 2019 - 2024. All rights reserved.