2011-03-10 141 views
8

有誰知道一個Python替代Matlab /八度bwdist()函數?該函數將給定矩陣的每個單元格的歐氏距離返回到最接近的非零單元格。我看到了一個Octave C實現,一個純粹的Matlab實現,我想知道是否有人必須在ANSI C(不包括任何Matlab/Octave頭文件,所以我可以輕鬆地從Python進行集成)或純Python中實現它。Matlab/Octave bwdist()在Python或C

我提到的兩個鏈接都低於:

C++

Matlab M-File

作爲一個測試,一個Matlab代碼/輸出看起來是這樣的:

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 

我測試了推薦在Python中使用distance_transform_edt調用,結果如下:

進口numpy的從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 這個結果似乎並不匹配八度/ Matlab的輸出。

回答

9

雖然Matlab bwdist將距離返回到最接近的非零單元格,但Python distance_transform_edt將距離「返回到​​最近的背景元素」。 SciPy文檔不清楚它認爲是什麼「背景」,它背後有一些類型轉換機制;在實踐中0是背景,非零是前景。

因此,如果我們有矩陣a

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

無需做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.  ]])