2017-06-27 48 views
1

https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.ndimage.morphology.distance_transform_edt.htmlscipy distance_transform_edt函数是如何工作的?

我无法理解欧几里德距离转换函数如何在Scipy中工作。据我所知,它不同于Matlab函数(bwdist)。作为一个例子,对于输入:

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

的scipy.ndimage.distance_transform_edt函数返回相同的数组:

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

但是MATLAB函数返回该:

1.4142 1.0000 1.4142 2.2361 3.1623 
1.0000   0 1.0000 2.0000 2.2361 
1.4142 1.0000 1.4142 1.0000 1.4142 
2.2361 2.0000 1.0000   0 1.0000 
3.1623 2.2361 1.4142 1.0000 1.4142 

这使得更有意义,因为它将“距离”返回到最近的一个。

+0

仅供参考,SciPy的源代码的链接[本文](HTTP ://ieeexplore.ieee.org.proxy.lib.fsu.edu/stamp/stamp.jsp arnumber = 1177156)。 –

回答

3

从文档字符串中不清楚,但distance_transform_edt计算从非零(即非背景)点到最接近的零(即背景)点的距离。

例如:

In [42]: x 
Out[42]: 
array([[0, 0, 0, 0, 0, 1, 1, 1], 
     [0, 1, 1, 1, 0, 1, 1, 1], 
     [0, 1, 1, 1, 0, 1, 1, 1], 
     [0, 0, 1, 1, 0, 0, 0, 1]]) 

In [43]: np.set_printoptions(precision=3) # Easier to read the result with fewer digits. 

In [44]: distance_transform_edt(x) 
Out[44]: 
array([[ 0. , 0. , 0. , 0. , 0. , 1. , 2. , 3. ], 
     [ 0. , 1. , 1. , 1. , 0. , 1. , 2. , 2.236], 
     [ 0. , 1. , 1.414, 1. , 0. , 1. , 1. , 1.414], 
     [ 0. , 0. , 1. , 1. , 0. , 0. , 0. , 1. ]]) 

您可以通过应用distance_transform_edt()np.logical_not(a)获得Matlab的bwdist(a)的当量(即反转前景和背景):

In [71]: a 
Out[71]: 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

In [72]: distance_transform_edt(np.logical_not(a)) 
Out[72]: 
array([[ 1.414, 1. , 1.414, 2.236, 3.162], 
     [ 1. , 0. , 1. , 2. , 2.236], 
     [ 1.414, 1. , 1.414, 1. , 1.414], 
     [ 2.236, 2. , 1. , 0. , 1. ], 
     [ 3.162, 2.236, 1.414, 1. , 1.414]]) 
1

沃伦已经解释了如何distance_transform_edt作品。 在你的情况,你可以改变抽样单位沿x和y

ndimage.distance_transform_edt(a) 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

>>> ndimage.distance_transform_edt(a, sampling=[2,2]) 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 2., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 2., 0.], 
     [ 0., 0., 0., 0., 0.]]) 

或者

ndimage.distance_transform_edt(a, sampling=[3,3]) 
array([[ 0., 0., 0., 0., 0.], 
     [ 0., 3., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 3., 0.], 
     [ 0., 0., 0., 0., 0.]])