2015-01-16 4 views
18

이상한 제목을 용서하지 마라, 나는 적당한 말씨를 정말로 생각할 수 없었다. 나는했습니다numpy 배열로 패턴을 분해하려면 어떻게해야합니까?

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]] . 

: 나는 초래하는 0들 터치 1의 거리 "에칭"찾고 있어요

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]] 

:

내가 같은 배열을 말해봐 np.roll과 같은 몇 가지를 시도했지만 비효율적이며 가장자리 효과가 있습니다. 이 작업을 수행하는 좋은 짧은 방법이 있습니까?

+0

음, 실제로는 적절하게 제목을 지정할 수 없습니다. Upvoting 그래서주의를 끌 수 있습니다 :-) – jjm

+0

배열을 순환하여 이웃 '0'을 '1'로 체크하고 '0'으로 설정할 수 있습니까? – KSFT

+0

comnputer 비전에서 나는 이것이 축소라고 불리는 것을 보았다고 생각합니다. 분명히 말하면 더 나은 용어가 있습니다 –

답변

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]]) 

봐이 차이를 볼 수 있습니다.

관련 문제