Python scipy距离变换edt函数是如何工作的?
我很难理解欧几里德距离变换函数在Scipy中是如何工作的。据我所知,它与Matlab函数(bwdist)不同。例如,对于输入:Python scipy距离变换edt函数是如何工作的?,python,matlab,scipy,edt,Python,Matlab,Scipy,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. 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
这更有意义,因为它将“距离”返回到最近的距离。文档字符串中不清楚,但计算从非零(即非背景)点到最近零(即背景)点的距离 例如:
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. ]])
通过将距离变换
应用于np.logical\u not(a)
(即反转前景和背景),可以获得与Matlab的bwdist(a)
等效的值:
沃伦已经解释了距离变换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.]])
但是
或
仅供参考,scipy源代码链接到。我如何使用生成的矩阵计算距离的比率?@mLstudent33,这不是评论的问题。创建一个新问题,展示你正在尝试做什么,到目前为止你已经尝试了什么,等等(即遵循好问题的所有常规指导原则)。
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.]])