2011-03-10 2 views
8

Matlab/Octave bwdist() 함수를 파이썬으로 대체 한 사람은 누구입니까? 이 함수는 주어진 행렬에 대해 각 셀의 유클리드 거리를 가장 가까운 0이 아닌 셀로 반환합니다. 필자는 옥타브 C 구현, 순수 Matlab 구현을 보았고, 누구든지 ANSI C (어떤 Matlab/Octave 헤더도 포함하지 않으므로 쉽게 파이썬에서 통합 할 수 있음) 또는 순수 파이썬에서 구현해야하는지 궁금합니다. 내가 언급Python 또는 C에서 Matlab/Octave bwdist()

두 링크는 ​​다음과 같습니다 : 나는 추천하여 테스트

bw= [0 1 0 0 0; 
    1 0 0 0 0; 
    0 0 0 0 1; 
    0 0 0 0 0; 
    0 0 1 0 0] 

D = bwdist(bw) 

D = 

    1.00000 0.00000 1.00000 2.00000 2.00000 
    0.00000 1.00000 1.41421 1.41421 1.00000 
    1.00000 1.41421 2.00000 1.00000 0.00000 
    2.00000 1.41421 1.00000 1.41421 1.00000 
    2.00000 1.00000 0.00000 1.00000 2.00000 

:

C++

테스트로

Matlab M-File

는 MATLAB 코드/출력은 다음과 같이 보입니다 distance_transform_edt를 파이썬으로 호출하면 다음 결과를 얻을 수 있습니다 :

이 결과는 옥타브/매트랩 출력과 일치하지 않는 것 scipy 수입 ndimage

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

res = ndimage.distance_transform_edt(a) 
print res 

[[ 0. 1. 0. 0. 0.] 
[ 1. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 1.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 1. 0. 0.]] 

에서 NP 로3210

수입 NumPy와.

답변

9

Matlab bwdist은 가장 가까운 0이 아닌 셀로 거리를 반환하지만 Python distance_transform_edt은 "가장 가까운 배경 요소까지"거리를 반환합니다. SciPy 문서는 "배경"으로 간주되는 것에 대해 명확하지 않지만 그 뒤에는 유형 변환 기계가 있습니다. 실제로는 0이 배경이고, 0이 아닌 것이 전경입니다.

>>> a = np.array(([0,1,0,0,0], 
       [1,0,0,0,0], 
       [0,0,0,0,1], 
       [0,0,0,0,0], 
       [0,0,1,0,0])) 

은 우리가 예를 들어, 사람과 제로와 1과 0을 대체 할 필요가 같은 결과를 계산하기 : 우리는 매트릭스 a이 그렇다면

고려 매트릭스 1-a :

>>> a 
array([[0, 1, 0, 0, 0], 
     [1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0], 
     [0, 0, 1, 0, 0]]) 
>>> 1 - a 
array([[1, 0, 1, 1, 1], 
     [0, 1, 1, 1, 1], 
     [1, 1, 1, 1, 0], 
     [1, 1, 1, 1, 1], 
     [1, 1, 0, 1, 1]]) 

이 경우 scipy.ndimage.morphology.distance_transform_edt에서가 예상 결과를 제공합니다

>>> distance_transform_edt(1-a) 
array([[ 1.  , 0.  , 1.  , 2.  , 2.  ], 
     [ 0.  , 1.  , 1.41421356, 1.41421356, 1.  ], 
     [ 1.  , 1.41421356, 2.  , 1.  , 0.  ], 
     [ 2.  , 1.41421356, 1.  , 1.41421356, 1.  ], 
     [ 2.  , 1.  , 0.  , 1.  , 2.  ]]) 
1

@ jetxee의 코멘트 당 1-A

>>> distance_transform_edt(a==0) 
    array([[ 1.  , 0.  , 1.  , 2.  , 2.  ], 
      [ 0.  , 1.  , 1.41421356, 1.41421356, 1.  ], 
      [ 1.  , 1.41421356, 2.  , 1.  , 0.  ], 
      [ 2.  , 1.41421356, 1.  , 1.41421356, 1.  ], 
      [ 2.  , 1.  , 0.  , 1.  , 2.  ]]) 

관련 문제