15

我有一个存储在 numpy 数组中的图像,由以下结果产生imread()

>>> ndim
array([[[  0,   0,   0],
        [  4,   0,   0],
        [  8,   0,   0],
        ..., 
        [247,   0,  28],
        [251,   0,  28],
        [255,   0,  28]],

       [[  0, 255, 227],
        [  4, 255, 227],
        [  8, 255, 227],
        ..., 
        [247, 255, 255],
        [251, 255, 255],
        [255, 255, 255]]], dtype=uint8)
>>> ndim.shape
(512, 512, 3)

我想有效地找到具有特定颜色值的像素的(x,y)坐标(或坐标),例如

>>> c
array([ 32,  32, 109], dtype=uint8)

>>> ndim[200,200]
array([ 32,  32, 109], dtype=uint8)

>>> ndim.T[0, 200, 200]
32
>>> ndim.T[1, 200, 200]
32
>>> ndim.T[2, 200, 200]
109

...在这种情况下,我知道 (200, 200) 处的像素具有 RGB 值 (32, 32, 109) - 我可以对此进行测试。

我想要做的是查询 ndarray 的像素值并取回坐标。在上述情况下,假定函数find_pixel(c)将返回 (200, 200)。

理想情况下,此find_pixel()函数将返回坐标元组列表,而不仅仅是它找到的第一个值。

我看过 numpy 的“花式索引”,这让我非常困惑……我想弄清楚这一点的大部分尝试都过于紧张和不必要的巴洛克式。

我确信这里有一个非常简单的方法可以忽略。最好的方法是什么 - 有没有比我概述的更好的机制来获得这些值?

4

1 回答 1

32

对于一些数组颜色数组a和颜色元组c

indices = numpy.where(numpy.all(a == c, axis=-1))

indices现在应该是数组的 2 元组,其中第一个包含第一个维度中的索引,第二个包含对应于像素值的第二个维度中的索引c

如果您需要将其作为坐标元组列表,请使用 zip:

coords = zip(indices[0], indices[1])

例如:

import numpy
a = numpy.zeros((4, 4, 3), 'int')    

for n in range(4):
    for m in range(4):
        a[n, m, :] = n + m
        if (n + m) == 4:
            print n, m

c = (4, 4, 4)
indices = numpy.where(numpy.all(a == c, axis=-1))
print indices
print zip(indices[0], indices[1])

将输出:

1 3
2 2
3 1
(array([1, 2, 3]), array([3, 2, 1]))
[(1, 3), (2, 2), (3, 1)]

它对应于所有值为 (4, 4, 4) 的像素。

于 2012-08-27T09:01:31.930 回答