欧几里得距离转换(EDT)算法
0 前言
欧几里得距离转换(Euclidean Distance Transform, EDT)简单的说即是以最常用的欧几里得距离作为
距离度量,找到每一个前景点到最近的背景点之间的距离。文中提及所有的算法中,均是将二维图片
转为两个一维向量的方式进行。
一些基本定义:
背景点为0,黑色,为感兴趣点,Voronioi elements,sites;
前景点为1:白色;
VR:某一背景点的VR指的前景点集合,这些前景点到此背景点的距离比到其他背景点距离都要短。
VS:某一前景点的VS指的是背景点的集合,这些背景点到此前景点距离比到其他前景点距离都要短。
1. Saito的算法:
step1:1-D Transformation
上到下,计算每一行中前景点到本行背景点距离最近的平方,得到中间结果G;
如下图,(a)为原图(b)为同一行的距离平方图,即G,公式如下:
step2:2-D Transformation
从左到右,对每一列,对中间结果G进行操作,计算本列背景点与本行背景点距离平方和的最小值,得到距离图(Distance Map)H;
如下图(4即使最近距离的平方)。
2. Maurer的算法对Saito改进:
第一步中的1-D Transformaion是一样的。只不过由先行后列改为先列后行。
第二步的改进基于一个事实:
对于每一列来说,并不是所有的sites(背景)都对Distance Map起到关键作用,而仅仅取决于与这一行有交集的VR,这里用到VR的概念。
先列后行,在经过列的1-DT后,找到与当前行有交集的VD,这些对Distance Map有作用,其他的删除。并只保留最近的VR。
如图,这样与step2相比,每一行需要计算的前景点数量由图(a)变为最终的图(c)
判断哪个VR与这一行R有交集的标准如下两条(相关VR的选取):
1. 在每一列的背景点(sites)中,只保留这一列与R最近的sites,如上图(a)到(b)的变化;
2. 在第一步保留的点中,有三点u、v、w按照横坐标由小到大排列,即:。
是在R与u和v垂直平分线的交点,同理,如下图所示。如果,即在的右
侧,则删除v,参照上图(b)到(c)的变化。
保留下的背景点可以按照从左至右的顺序排列保存。算法复杂度为:。
3. Felzenszwalb算法[3]
该算法可以在线性的时耗进行,推荐。
表示p点EDT的计算,此处已转换为一维空间,对于一行n个点,计算p
的EDT公式如下:
q也是此列中的一点,f(q)可以看做是q点的消耗函数(对于二维图像,可以认为是
上面所述的1-D Transformation)。是一个以( q, f(q) )为最小值的抛物线。对
于n个q点,即有n个以( q, f(q) )为最小值的抛物线,如下图。
因此,对于属于[0, n-1]的p来说,其EDT就是这些抛物线的下包络(lower envelope)。
算法的步骤就是首先计算这些抛物线的下包络,然后根据下包络得到没一点p的EDT。
这个算法最重要的步骤就是下包络的计算。
在此,有一个事实是:图中任意两个抛物线有且仅有一个交点(intersect point)。这个
交点在一维坐标轴的投影位置s计算如下式:
其中,r,q为两个抛物线的凹点。可以看到若q<r,在交点的左侧,q所属抛物线低于r的,在交点右侧反之。
这里,用两个数组来从左至右顺序的得到下包络。
下包络中,第i个抛物线的水平位置(凹点)保存在数组v[i];下包络中第i个个抛物线的范围保存在z[i]和z[i+1](每个z[i]保存的是交点),k表
示下包络中包含的抛物线个数。
现有一新的抛物线,与v中最右侧的抛物线k比,只有两种可能,交点s在z[k]左边或z[k]右面,如下图所示。
若:
1:新抛物线q与队列中最后一个抛物线v[k]的交点s在z[k]右侧,则下包络添加q为最后一个抛物线,k=k+1,
z[k]指向s,v[k]指向q的凹点。如图(a)。
2:s在z[k]左侧,则v[k]不再属于下包络,更新z[k]为s,v[k]为q的凹点,如图(b)。
其排列好后每一点对应下包络的y值极为EDT,算法伪代码如下所示。
参考文献:
[1] Fabbri R, Costa L D F, Torelli J C, et al. 2D Euclidean distance transform algorithms: A comparative survey[J]. ACM Computing Surveys (CSUR), 2008, 40(1): 2.
[2] Meijster A, Roerdink J B T M, Hesselink W H. A general algorithm for computing distance transforms in linear time[M]//Mathematical Morphology and its applications to image and signal processing. Springer US, 2000: 331-340.
[3] Felzenszwalb P F, Huttenlocher D P. Distance Transforms of Sampled Functions[J]. Theory of computing, 2012, 8(1): 415-428.
欧几里得距离转换(EDT)算法相关推荐
- Fast Planner——ESDF地图中距离计算(欧几里得距离转换EDT)
本文是Fast Planner构建ESDF地图部分中距离场计算相关函数的说明.ESDF中距离场的计算过程其实就是计算出地图更新范围内每个空闲体素到附近障碍物体素的最小距离的过程. Fast Plann ...
- 色温(Kelvin)到RGB的转换:算法和样例
色温(Kelvin)到RGB的转换:算法和样例 据我所知,还不太可能找到从色温到RGB转换的一个可靠的公式.虽然,有很多算法实现了类似的功能,但是,大 ...
- 简述二进制码、十进制码、BCD码、十六进制码转换的算法
进制转换 简述二进制码.十进制码.BCD码.十六进制码转换的算法 把四字节 BCD 码 5287 转换为十六进制码 14A7H 简述二进制码.十进制码.BCD码.十六进制码转换的算法 ①二进制转十进制 ...
- python:实现prefix conversions string前缀转换字符串算法(附完整源码)
python:实现prefix conversions string前缀转换字符串算法 from __future__ import annotations from enum import Enum ...
- 关于树形插件展示中数据结构转换的算法
问题背景 在一些目录结构.机构层级等展示的场景中,我们经常会用到一些成熟的树形插件来进行轻松展示,比如ztree等.大多数插件会支持对两种数据源格式的解析,一种是通用的二维数据结构,一种是树状数据结构 ...
- 多边形网格到B-Rep实体转换:算法详细信息和C ++代码示例
Using a triangulation algorithm (known as tessellation) on a model's boundary representation is rela ...
- 进制转换算法 (C语言实现一个简单的二进制转换工具) ------- 算法笔记010
进制转换算法概念 其核心是利用栈的存储结构性质,进行数据的入栈出栈时的计算,让后将计算好的数据存入另一个栈内,最后再出栈输出.由于栈的先进后出特性,最后输出的顺序和输入的顺序是一样的.具体如上图. 栈 ...
- 各种数制转换——秦九韶算法(转十进制)
秦九韶算法: C++ 秦九韶算法_yq_sprite的博客-CSDN博客_秦九韶算法 求任意两个不同进制非负整数的转换(2 进制 ∼∼ 16 进制),所给整数在 int 范围内. 不同进制的表示符号为 ...
- EAP 认证 五元组转换三元组算法实现
最近工作中接触到部分网络通信编程,需要将鉴权五元组转换成三元组,故将此涉及的算法记录一下,方便以后回顾. USIM卡用2G终端,HLR会发送五元组鉴权,同时VLR会启动五元组/三元组转换流程,将五元组 ...
最新文章
- asp.net MVC 路由
- 修改XtraMessageBox的内容字体大小
- was not declared in this scope
- 盘点多数企业容易犯的五个大数据错误
- uni-app中image组件的基本使用
- 通过开放重定向接管 GitHub Gist 账户,获奖$1万(GitHub $6.1万奖金系列之三)
- php 过滤非utf8,PHP如何将不是UTF8的字符过滤掉(代码)
- 南京邮电大学离散数学实验一利用真值表求主析取范式和主合取范式
- SharePoint 2013 SqlException (0x80131904):找不到Windows NT 用户或组xxxx\administrator
- 南京java程序员工资_2019年一二线城市java程序员工资大调查
- NLP(自然语言处理)基本入门之分词操作
- (java中的super)不会飞还能叫Superman吗
- 敏捷项目管理敏捷工作之冲刺计划
- 主机win10与虚拟机win7相互ping通方法
- java-求指定数组中指定个数的排列组合
- 打卡第二天 树形DP初步
- 劳合社和伦敦市场保险公司携手DXC Technology推动世界首屈一指的保险市场转型
- 集美大学计算机毕业论文,咨询关于集美大学毕业论文检测的问题
- 大学生就业咨询系统数据库设计
- 自动化学计算机语言先学什么,要入门PLC编程 先搞清这5种专用语言
热门文章
- 【Lawin Transformer2022】Lawin Transformer: Improving Semantic Segmentation Transformer with Multi-Sc
- 小说《肖申克的救赎》的优秀读后感2600字
- 一文尽览!弱监督语义/实例/全景分割全面调研(2022最新综述)
- C语言,好爽(第一二三季)
- 【转】ArcGIS server如何将自己的小地图叠加到Google maps或者Virtual Earth上
- gazebo添加模型仿真
- 《初入linux》--第二十部分-Apache服务器的几个实用技巧
- 13. Roman to Integer
- python调用百度翻译api+离线语种检测
- 使用Goods类创建十个商品 第四章 面向对象(上)课堂作业2