Python欧几里得距离变换

news/2024/11/7 20:50:42/

文章目录

    • 欧氏距离变换
    • distance_transform_edt
    • 其他距离变换函数

欧氏距离变换

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 类似于曼哈顿距离,不处理对角线

二者差异如下

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

http://www.ppmy.cn/news/87603.html

相关文章

虚拟机磁盘扩容及重新分区方法

创建虚拟机的时候,如果分配的磁盘过小,在后续的使用时可能需要进行扩容,在扩容后你会发现好像磁盘并没有变大,这时候就需要进行重新分区 一、虚拟机扩容 在将需要扩容的虚拟机关机后,点击VMware的菜单栏中的虚拟机&…

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第二章——MindSpore调试调优

1.生态迁移 生态迁移工具使用示例 生态迁移工具技术方案 不同框架间模型定义前端表达差别巨大(相同算子的API技术难点 、 算子功能、模型构建方式差别较大); 对于同一框架,不管前端表达差异如何,最终对应的计算 图是相似的。因此提出&#x…

每天一个面试题之==和equals的区别是什么?

==和equals的区别是什么? ""是一个关系运算符,关系运算符可以用来进行数据和数据之间的比较,而在java中数据类型大致可以分为两大类分别是基本数据类型和引用数据类型。 基本数据类型包含 byte&#xff0c…

【C++】布隆过滤器

文章目录 布隆过滤器的引入布隆过滤器的概念如何选择哈希函数个数和布隆过滤器长度布隆过滤器的实现布隆过滤器的优缺点 布隆过滤器的引入 我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过…

RabbitMQ 小白教程,从安装到使用

主要内容 AMQP简介 RabbitMQ简介 RabbitMQ原理 Erlang安装 安装RabbitMQ RabbitMQ账户管理 交换器 学习目标 知识点要求AMQP简介掌握RabbmitMQ简介掌握RabbitMQ原理掌握Erlang安装掌握安装RabbitMQ掌握RabbitMQ账户管理掌握交换器掌握 一、 AMQP简介 1 AMQP是什么?…

[算法前沿]--018-中文大模型ChatGLM微调:P-Tuning,deepspeed,LoRA<下>

文章目录 1.模型部署使用自己的数据集对话数据集1.模型部署 首先载入Tokenizer: from transformers import AutoConfig, AutoModel, AutoTokenizer# 载入Tokenizer tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)如果需…

【深度剖析】JavaScript中块级作用域与函数作用域

前言 系列首发于公众号『前端进阶圈』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。 面试官必问系列:深入理解JavaScript块和函数作用域 在 JavaScript 中,究竟是什么会生成一个新的作用域&#…

C语言基础知识:宏定义

目录 一.预处理 二.宏定义用法 ①宏常量 ②宏语句 ③宏函数 ④其它 1.#undef 是用来撤销宏定义的,用法如下: 2.使用ifndef防止头文件被重复包含和编译 三.宏定义相关作用符 ①换行符 "\" ②字符串化符 "#" ③片段连接符&…