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タプルの配列になります。最初の配列には、最初の次元のインデックスが含まれ、2番目の配列には、のピクセル値に対応する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 に答える