2015-01-16 44 views
18

不好意思,我真的無法想到一個合適的措辭。如何將模式分解爲numpy數組?

說我有這樣一個數組:

arr = [[0 1 1 1 1 1 1 1 0], 
     [0 0 1 1 1 1 1 0 0], 
     [0 0 0 1 1 1 0 0 0], 
     [0 0 0 0 1 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0]] 

我期待 「腐蝕」 掉1 s表示觸摸0 s,這將導致:

arr = [[0 0 1 1 1 1 1 0 0], 
     [0 0 0 1 1 1 0 0 0], 
     [0 0 0 0 1 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0], 
     [0 0 0 0 0 0 0 0 0]] . 

我已經嘗試了一些東西,如np.roll,但它似乎效率低下(並具有邊緣效應)。有沒有一個很好的方法來做到這一點?

+0

嗯,真的沒有辦法正確地標題。 upvoting所以得到了應有的重視:-) – jjm

+0

你可以循環訪問數組,檢查'1'是否鄰居'0'並將其設置爲'0'? – KSFT

+0

在計算機視覺中,我認爲這被稱爲縮小。 確實有一個比解析更好的術語 –

回答

22

Morpholocial erosion可以在這裏使用。

形態侵蝕將(i,j)處的像素設置爲以(i,j)爲中心的鄰域中的所有像素的最小值。 source

data 
Out[39]: 
array([[0, 1, 1, 1, 1, 1, 1, 1, 0], 
     [0, 0, 1, 1, 1, 1, 1, 0, 0], 
     [0, 0, 0, 1, 1, 1, 0, 0, 0], 
     [0, 0, 0, 0, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0]]) 

structure 
Out[40]: 
array([[0, 1, 0], 
     [1, 1, 1], 
     [0, 1, 0]]) 

eroded = binary_erosion(data, structure, border_value=1).astype(int) 

eroded 
Out[42]: 
array([[0, 0, 1, 1, 1, 1, 1, 0, 0], 
     [0, 0, 0, 1, 1, 1, 0, 0, 0], 
     [0, 0, 0, 0, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0]]) 
+3

對於所有輸入都是不正確的。 –

+0

@OliverW。感謝您指出錯誤。在內核中將中心設置爲1修復它我認爲? – M4rtini

+1

我這麼認爲,是的。事後看來,這是「正確」的答案(正確的意思是有人寫它並設法將它放到主流圖書館中),但我不知道。我仍然很滿意我的想法,並且運行良好,但是你也可以得到我的投票:-) –

12

考慮用十字形內核進行卷積。

import numpy as np 
from scipy.signal import convolve2d 
kernel = np.array([[0,1,0], [1,1,1], [0,1,0]]) 
mask = convolve2d(arr, kernel, boundary='symm', mode='same') 
arr[mask!=5] = 0 

這種方法可以正確處理所有輸入:

In [143]: D = np.random.random_integers(0,1, (5,5)) 

In [144]: D2 = D.copy() 

In [145]: mask = convolve2d(D, kernel, boundary='symm', mode='same') 

In [146]: D2[mask!=5] = 0 

In [147]: binary_erosion(D, kernel2, border_value=1).astype(int) 
Out[147]: 
array([[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]]) 

In [148]: D2 
Out[148]: 
array([[0, 0, 0, 1, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0]]) 

In [149]: D 
Out[149]: 
array([[1, 0, 1, 1, 1], 
     [0, 1, 0, 1, 0], 
     [0, 1, 0, 1, 0], 
     [0, 0, 1, 1, 0], 
     [1, 0, 1, 0, 0]]) 
In [150]: kernel 
Out[150]: 
array([[0, 1, 0], 
     [1, 1, 1], 
     [0, 1, 0]]) 

In [151]: kernel2 
Out[151]: 
array([[0, 1, 0], 
     [1, 0, 1], 
     [0, 1, 0]]) 

看入彎看到的差異。

相關問題