找到(X,Y)特定的索引(R,G,B)从存储在与NumPy ndarrays图像的颜色值(Findi

2019-06-27 09:58发布

我已经存储在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) - I可以测试此。

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

理论上讲,该find_pixel()函数将返回坐标元组,而不仅仅是找到的第一个值的列表。

我已经看了numpy的的“神奇索引”,这让我感到困惑大大...我的大多数尝试在搞清楚了这一点已经过度紧张和不必要的巴洛克风格。

我相信有我在这里可以俯瞰一个非常简单的方法。 什么是做到这一点的最好办法 - 有一个完全更好的机制来获取这些值比我所概括?

Answer 1:

对于一些阵列颜色阵列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)的所有像素。



文章来源: Finding the (x,y) indexes of specific (R,G,B) color values from images stored in NumPy ndarrays