2015-03-13 94 views
1

內創建緩衝區我有一個二進制圖像,如下所示:一個numpy的陣列

data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0]]) 

對於具有1秒的值的像素,我想使兩個像素與在每一個四個方向包圍值的1的緩衝區。預期結果如下:

result=np.array([[1, 1 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 1], 
       [1, 1 , 1 , 1 , 1 , 1 , 1 , 1]]) 

我該怎麼辦?

+0

它是隻有一個和零的數組,還是有其他值? – 2015-03-13 08:39:30

+0

是的,它只是1s和0s – Borys 2015-03-13 09:41:24

回答

2

如果你只有輸入和輸出陣列上的1和0可以用一個二維卷積,這是簡單的工作做。

from scipy.signal import convolve2d 

data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0]]) 

# the kernel doesn't need to be ones, it just needs to be positive and 
# non-zero. 
kernel = np.ones((5, 5)) 

result = np.int64(convolve2d(data, kernel, mode='same') > 0) 

它給你你想要的輸出。你需要定義你想在邊緣發生什麼 - 在這個版本中,輸出數組的大小與輸入數組的大小相同。

如果你有一個稀疏的數組,你可以做得更快。

如果你有比你的數組中的1和0的其他值,將需要更多的思考。

+0

爲什麼你需要「一個積極的和非零的內核」?我看不到任何理由,文檔也沒有提到這個(http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.convolve2d.html)。 – EOL 2015-03-13 08:51:54

+1

你不需要'convolve2d',但是你需要爲方法工作(特別是'> 0')。 – 2015-03-13 09:13:57

+0

@HenryGomersall感謝您的回答。你能解釋一下爲什麼你使用了(5,5)的內核。 – Borys 2015-03-13 09:53:51

1

您也可以使用morphological dilation運營商(其擴張的ones在這種情況下)做到這一點。

from skimage.morphology import square, dilation 
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 1 , 1 , 1 , 1 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0], 
       [0, 0 , 0 , 0 , 0 , 0 , 0 , 0]]) 
result = dilation(data, square(5)) 

注意square(5)相當於np.ones((5,5))在這種情況下。膨脹運算器通過擴大True1像素的作用,使用作爲第二參數傳遞的元素(在這種情況下,以每個像素爲中心的5x5平方)。