欧氏距离变换
edt
,即Euclidean distance transform.
,欧氏距离变换。对于一个二值矩阵
A
A
A,元素
a
∈
A
a\in A
a∈A,则
edt
(
a
)
\operatorname{edt}(a)
edt(a)为
a
a
a到矩阵中0元素的最短距离。假设现有一矩阵
A = [ 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 ] A = \begin{bmatrix} 0&1&1&1&1\\ 0&0&1&1&1\\ 0&1&1&1&1\\ 0&1&1&1&0\\ 0&1&1&0&0 \end{bmatrix} A= 0000010111111111111011100
记 B = edt ( a ) B=\operatorname{edt}(a) B=edt(a),则
- 对于 A 11 A_{11} A11而言,由于其本身为0,则对应的 B 11 = 0 B_{11}=0 B11=0
- A 12 = 1 A_{12}=1 A12=1,距离 A 12 A_{12} A12最近的0在 A 11 A_{11} A11和 A 22 A_{22} A22处,相隔均为1,所以 B 12 = 1 B_{12}=1 B12=1
- A 13 = 1 A_{13}=1 A13=1,距离 A 13 A_{13} A13最近的0在 A 22 A_{22} A22处,由于在左下角,故距离为 1 + 1 = 2 \sqrt{1+1}=\sqrt{2} 1+1=2,即 B 12 = 2 B_{12}=\sqrt{2} B12=2
以此类推,得到
B = [ 0. 1. 2 5 3. 0. 0. 1. 2. 2. 0. 1. 2 2 1. 0. 1. 2 1. 0. 0. 1. 1. 0. 0. ] B = \begin{bmatrix} 0.&1.&\sqrt{2}&\sqrt{5}&3.\\ 0.&0.&1.&2.&2.\\ 0.&1.&\sqrt{2}&\sqrt{2}&1.\\ 0.&1.&\sqrt{2}&1.&0.\\ 0.&1.&1.&0.&0. \end{bmatrix} B= 0.0.0.0.0.1.0.1.1.1.21.221.52.21.0.3.2.1.0.0.
distance_transform_edt
在scipy.ndimage
中,distance_transform_edt
可计算欧式变换,
from scipy import ndimage
import numpy as np
a = np.array(([0,1,1,1,1],
[0,0,1,1,1],
[0,1,1,1,1],
[0,1,1,1,0],
[0,1,1,0,0]))
ndimage.distance_transform_edt(a)
'''
array([[0. , 1. , 1.41421356, 2.23606798, 3. ],
[0. , 0. , 1. , 2. , 2. ],
[0. , 1. , 1.41421356, 1.41421356, 1. ],
[0. , 1. , 1.41421356, 1. , 0. ],
[0. , 1. , 1. , 0. , 0. ]])
'''
其完整定义为
distance_transform_edt(input, sampling=None, return_distances=True, return_indices=False, distances=None, indices=None)
其参数含义为
-
sampling
网格间距,相当于 B B B乘以一个系数 -
return_distances
为True
时返回距离矩阵 -
return_indices
为True
时返回特征变换矩阵 -
distances, indices
用于指针传参的数组,不用管
其他距离变换函数
scipy.ndimage
除了edt
之外,还提供了另外两个距离变换函数
istance_transform_bf(input, metric='euclidean', sampling=None, return_distances=True, return_indices=False, distances=None, indices=None)
distance_transform_cdt(input, metric='chessboard', return_distances=True, return_indices=False, distances=None, indices=None)
二者和edt
相比,多了个metric
函数,其中bf
可选三种euclidean, taxicab, chessboard
,cdt
无euclidean
选项。二者其他区别主要是采用的算法不同。
这三种不同的metric
在计算距离时采用的方案不同文章来源:https://www.toymoban.com/news/detail-460102.html
-
euclidean
即前面提到的欧几里得距离 -
chessboard
会将对角线的距离算作1,而非 2 \sqrt2 2 -
taxicab
类似于曼哈顿距离,不处理对角线
二者差异如下文章来源地址https://www.toymoban.com/news/detail-460102.html
>>> ndimage.distance_transform_bf(a,'chessboard')
array([[0, 1, 1, 2, 3],
[0, 0, 1, 2, 2],
[0, 1, 1, 1, 1],
[0, 1, 1, 1, 0],
[0, 1, 1, 0, 0]], dtype=uint32)
>>> ndimage.distance_transform_bf(a,'taxicab')
array([[0, 1, 2, 3, 3],
[0, 0, 1, 2, 2],
[0, 1, 2, 2, 1],
[0, 1, 2, 1, 0],
[0, 1, 1, 0, 0]], dtype=uint32)
>>>
到了这里,关于Python欧几里得距离变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!