Python欧几里得距离变换

这篇具有很好参考价值的文章主要介绍了Python欧几里得距离变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

欧氏距离变换

edt,即Euclidean distance transform.,欧氏距离变换。对于一个二值矩阵 A A A,元素 a ∈ A a\in A aA,则 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.2 1.2 2 1.5 2.2 1.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_distancesTrue时返回距离矩阵
  • return_indicesTrue时返回特征变换矩阵
  • 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, chessboardcdteuclidean选项。二者其他区别主要是采用的算法不同。

这三种不同的metric在计算距离时采用的方案不同

  • 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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包