2011-08-26 59 views
2

我使用numpy是Python。我已预装成numpy的2维阵列的图像为:Numpy - 通过测试相邻索引获取索引位置

[ 
    [...], # row0 
    [...], # row1 
    [...], # row2 
    ... 
] 

我需要获得所有像素的所有索引位置,其中任一北(只有下列之一),南,东或西相邻像素具有一定的价值。在我的情况下,如果任何4个相邻像素的0

回答

4

如果是你原来的数组,定义了一堆片:

from scipy import * 

a = ones((12,22)) 
a[5,10] = a[5,12] = 0 

a_ = a[1:-1, 1:-1] 
aE = a[1:-1, 0:-2] 
aW = a[1:-1, 2:] 
aN = a[0:-2, 1:-1] 
aS = a[ 2:, 1:-1] 

a4 = dstack([aE,aW,aN,aS]) 
num_adjacent_zeros = sum(a4 == 0, axis=2) 
print num_adjacent_zeros 

ys,xs = where(num_adjacent_zeros == 1) 
# account for offset of a_ 
xs += 1 
ys += 1 

print '\n hits:' 
for col,row in zip(xs,ys): 
    print (col,row) 

的理由采取小a_的是,我不知道你想与边缘的情况下,例如在那里做什么北方像素可能不存在。

我建立了一个相邻零的数量的数组,并使用它来获得刚好相邻的零的位置。输出:

[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 1 0 2 0 1 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]] 

hits: 
(10, 4) 
(12, 4) 
(9, 5) 
(13, 5) 
(10, 6) 
(12, 6) 
+0

你是什么意思逻辑操作。抱歉。我是新来的numpy。 – miki725

+0

好吧,我会详述我的回答 – wim

+0

谢谢你的阐述。试图弄清楚你在这里做了什么。所有这些功能对我来说依然是陌生的。 – miki725

2

或许要做到这一点是找到所有使用类似的零的最简单的方法:

import numpy as np 
# a is the image array 
z_indices = np.where(a == 0) 

然后就是计算相邻指数来像素为零(所有+ 1,-1组合为零指数)。如果一个点与两个不同的零像素相邻,则必须删除重复项。

+0

我现在正在这样做。有没有更好的方法? – miki725

+0

@ miki725:如果你已经尝试了一些东西,在原始问题中陈述这个问题通常是个好主意。 – JoshAdel