2011-08-26 74 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