3分钟搞懂欧式距离变换(EDT):从暴力算法到Felzenszwalb的演进史

线性时间求解点集所有点最近邻的Felzenszwalb算法 最近在做字体渲染的相关内容,利用FreeType可以提取出ttf文件中具体某个字符的轮廓图,这个轮廓图是二值化的图像,后续的处理需要用到图像上的每个点到字体轮廓线的最近距离,即要求平面上的每个点与轮廓线的最近邻。可以考虑使用KD树,这里介绍一下Felzenszwalb算法,它可以在O(KN)的复杂度内完成所有点的最近邻求解,其中K是点集的维度,N是点的总个数。 一维情形的求解 首先介绍一维... 阅读详情

从暴力到优雅:欧式距离变换(EDT)算法的演进与实战

如果你处理过机器人路径规划、图像形态学分析,或者任何需要计算像素到最近“障碍物”距离的任务,那么“欧式距离变换”(Euclidean Distance Transform, EDT)这个词对你来说一定不陌生。它听起来像是一个复杂的数学概念,但本质上,它解决的是一个非常直观的问题:给定一张二值图像(比如,黑色代表障碍物,白色代表自由空间),如何高效地为每一个白色像素点,计算出它到最近黑色像素点的真实欧几里得距离?这个距离图,就是EDT。

早期的开发者可能会选择最直接的方法——暴力计算。想象一个512x512的图像,对于每一个白色像素,遍历所有黑色像素计算距离,再取最小值。这个计算量是灾难性的。正是这种从“不可用”到“实时计算”的需求,驱动了EDT算法长达数十年的演进。今天,我们不再需要忍受分钟级的等待,得益于一系列聪明的算法革新,我们能在毫秒级完成同样的任务。这篇文章,我将带你穿越这段技术演进史,不仅理解每种算法的核心思想,更会通过具体的代码示例和场景对比,让你掌握如何在实际项目中选用最合适的“武器”。

1. 理解EDT:不仅仅是距离计算

在深入算法之前,我们必须先厘清EDT究竟在做什么,以及它为什么如此重要。EDT输入一张二值图像,输出一张相同尺寸的灰度图(或距离场)。输出图像中每个像素的值,代表了该位置到最近背景点(通常指目标物体或障碍物)的欧几里得距离。

注意:在计算机视觉和机器人领域,对“背景”和“前景”的定义可能相反。常见的是,将值为0的像素视为障碍物(目标点),值为1的像素视为自由空间(空间点)。EDT计算的是每个自由空间点到最近障碍物的距离。

EDT与曼哈顿距离、棋盘格距离变换有本质区别。后两者计算的是基于网格的近似距离(分别只允许横向/纵向移动,或允许八方向移动),计算简单但不符合真实世界的物理距离。欧式距离才是我们生活中感知的距离,因此EDT在需要精确几何信息的应用中无可替代。

它的核心应用场景包括:

  • 机器人学与ESDF地图:这是EDT当前最火热的应用领域。在基于栅格的地图中,EDT可以快速生成欧几里得符号距离场(ESDF)。ESDF不仅提供距离信息,还通过正负号区分点在障碍物内部还是外部,是无人机、机器人进行安全、平滑路径规划(如Fast Planner)的基石。
  • 图像处理与形态学:用于图像骨架化、形状匹配、图像分割(如分水岭算法的预处理)等。
  • 计算机图形学:用于生成距离场字体、几何形状的偏移等。

理解一个概念最好的方式是从最朴素的方法开始。这就引出了我们的第一个主角:暴力算法。

2. 算法演进史:从蛮力到智慧

2.1 第一阶段:暴力算法(Brute Force)—— 思维的起点

暴力算法的逻辑简单到令人发指,也慢到令人绝望。其伪代码可以概括为:

# 假设二值图像 binary_img, 0为障碍物,1为自由空间
height, width = binary_img.shape
edt_result = np.full((height, width), np.inf) # 初始化距离为无穷大

# 第一步:收集所有障碍物坐标
obstacle_points = []
for y in range(height):
    for x in range(width):
        if binary_img[y, x] == 0:
            obstacle_points.append((x, y))

# 第二步:为每个自由空间点计算到所有障碍物的最小距离
for y in range(height):
    for x in range(width):
        if binary_img[y, x] == 1:
            min_dist = np.inf
            for (ox, oy) in obstacle_points:
                dist = np.sqrt((x - ox)**2 + (y - oy)**2) # 欧式距离
                if dist < min_dist:
             
Euclidean Distance Transform - EDT EDT 欧式距离场的概念 阅读详情

相关推荐

欧式距离变换(EDT)算法解析:从暴力计算到光栅扫描优化

本文深入解析欧式距离变换(EDT)算法,从暴力计算到光栅扫描优化,详细介绍了Saito-Toriwaki、Maurer和Felzenszwalb等算法的实现原理与性能对比。EDT在机器人路径规划和ESDF地图构建中具有重要应用价值,能显著提升环境感知和避障效率。

weixin_30823001的博客 53

Euclidean Distance Transform (EDT) 算法解析:从暴力法到光栅扫描的优化之路

本文深入解析了欧式距离变换(EDT)算法,从暴力法到光栅扫描的优化过程。详细介绍了Saito-Toriwaki的二维分解法、Maurer的维诺图改进以及Felzenszwalb的线性时间算法,并探讨了EDT与ESDF(欧式符号距离场)的关系与区别。这些优化算法显著提升了EDT在机器人路径规划、医疗影像处理等领域的应用效率。

weixin_29208077的博客 123

3种EDT算法实战对比:暴力法、光栅扫描与Felzenszwalb谁更快?

本文通过实战对比了三种欧式距离变换(EDT)算法的性能:暴力法、光栅扫描算法与Felzenszwalb算法。测试表明,暴力法仅适用于极小规模数据;光栅扫描算法实现简单,是可靠的通用选择;而Felzenszwalb算法凭借其下包络线优化,在处理大规模栅格地图时速度最快,是实时机器人导航、图像处理等高性能场景的首选。

a2b3c4d5e的博客 194

Felzenszwalb等提出的彩色图像分割方法

论文中详细描述了算法的实现,值得大家学习!

Felzenszwalb-Segmentation:围绕原始 felzenszwalb 分割代码的易于使用的 Matlab 包装器

基于 Felzenszwalb 和 Huttenlocher 的无监督图像分割的 matlab 包装器 Matlab方面 汇编 简单地运行 compileFelzenszwalbSegmentation.m 设置 - 安全地将 repo 添加到搜索路径 为了让 Matlab 熟悉所有相关路径(目前只有 2 个)转到根文件夹并执行 initWorkspaceSegmentation.m 演示 跑步 demoFelzenszwalbSegmentation.m 这需要 Matlabs GUI 来显示图像和分割结果 检查演示文件以了解如何设置变量以及如何调用底层 mex 函数 C++方面 中描述的分割算法的实现: 高效的基于图的图像分割 Pedro F. Felzenszwalb 和 Daniel P. Huttenlocher 国际计算机视觉杂志,2004 年 9 月 59(2)。

Introduction_to_Algorithms_2ndEdt(算法导论英文版呢)

本书深入浅出,全面地介绍了计算机算法。对每一个算法的分析既易于理解又十分有趣,并保持了数学严谨性。本书的设计目标全面,适用于多种用途。涵盖的内容有:算法在计算中的作用,概率分析和随机算法的介绍。本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通子图算法正确性的证明,对哈密顿回路和子集求和问题的NP完全性的证明等内容。全书提供了900多个练习题和思考题以及叙述较为详细的实例研究。. 本书内容丰富,对本科生的数据结构课程和研究生的算法课程都是很实用的教材。本书在读者的职业生涯中,也是一本案头的数学参考书或工程实践手册。 在有关算法的书中,有一些叙述非常严谨,但不够全面,另一些涉及了大量的题材,但又缺乏严谨性。《算法导论》将严谨性和全面性融为一体。.. 本书深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。各章自成体系,可以作为独立的学习单元。算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂。说明和解释力求浅显易懂,不失深度和数学严谨性。 本书自第1版出版以来,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。第2版增加了论述算法作用、概率分析与随机算法、线性规划等几章。同时,对第1版的几乎每一节都作了大量的修订。一项巧妙而又重要的修改是提前引入循环不变式,并在全书中用来证明算法的正确性。在不改变数学和分析重点的前提下,作者将许多数学基础知识从第一部分移到了附录中,并在开始部分加入了一些富有诱导性的题材。...

KANO分析模型

KANO分析模型的基本概念,目的意义,应用场景,实现方法和示例等

JasonH2021的博客 3051

嵌入式开发中Tab与空格混用的危害与统一规范实践

在软件工程中,代码格式一致性是保障可读性与团队协作效率的基础。从原理上看,制表符(Tab)与空格(Space)在存储与显示机制上存在本质差异:Tab是控制字符,其显示宽度取决于编辑器设置;空格则是固定宽度的字符。这种差异导致混用时会引发代码对齐错乱、版本控制冲突及跨平台兼容性问题,严重影响工程的可维护性。尤其在嵌入式开发领域,资源受限环境与高可靠性要求使得统一的编码规范更为关键。通过配置编辑器、集成clang-format等自动化工具,可以强制实现缩进风格的一致性,从而提升代码质量与团队协作效率。本文聚焦于

weixin_42545636的博客 271

[Linux]双网卡 CentOS 系统中指定网络请求走特定网卡的配置方法

本文详细介绍了在双网卡CentOS系统中指定特定域名/IP通过指定网卡传输流量的方法。核心步骤包括:1)确认网卡信息(ip addr)和域名IP解析(nslookup);2)添加临时路由(ip route add);3)持久化配置(创建route-eth1文件);4)验证配置(ip route show和curl测试)。文章还提供了网关查询、路由删除等常见问题的解决方法,并区分了不同CentOS版本重启网络服务的命令差异。通过合理配置路由规则,可实现流量的定向传输需求。

wingaso的博客 1565

arduino esp8266_Arduino传感器教程 第22章ESP8266 控制 5V 继电器

ESP8266控制5V继电器目录一、NodeMCU二、工作原理本文将使用亚马逊 AlexaEcho 和 ESP8266 控制 5V 继电器。NodeMCUNodeMCU 是一个开源的 IoT 物联网硬件开发板,由于它支持 WIFI 功能且使用方法十分类似 Arduino 开发板,所以近些年获得了越来越多来自全世界的创客朋友们的青睐。NodeMCU 尺寸与 Arduino Nano 类似。...

weixin_39611722的博客 3451

神经网络基础-从零开始搭建一个神经网络

人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。人工神经网络也是类似,通过模仿人脑的“学习机器”,通过不断“看”数据(比如图片,数字),自己总结规律,最终学会预测(比如分类图片)在深度学习中,损失函数是用来衡量模型参数的质量的函数,衡量的方式是比较网络输出和真实输出的差异。

Zach的博客 4008

PCB激光直接成像(LDI)设备技术解析与优化方案

激光直接成像(LDI)是PCB制造中的关键数字化工艺,通过激光束直接在基板上形成电路图案。其核心技术在于高精度光学系统与智能控制算法的结合,工作精度可达微米级。在HDI板、柔性电路等高端PCB制造中,LDI技术能显著提升线宽精度和层间对位准确性。当前行业面临材料适配性、热变形控制等挑战,动态能量补偿、多波长曝光等创新方案正在突破这些瓶颈。随着模块化设计、预测性维护等工程实践的普及,LDI设备综合效率持续提升,为5G、汽车电子等领域的精密电路生产提供关键技术支撑。

weixin_29168393的博客 385

vscode使用continue插件连接LM studio的模型

本文详细介绍了如何使用VSCode的Continue插件连接LM Studio模型。主要步骤包括:在LM Studio中加载模型并设置相关参数,启动API服务,修改Continue配置文件以集成LM Studio模型,并进行测试以验证连接是否成功。通过这些步骤,用户可以将LM Studio中的预训练模型与VSCode的Continue插件无缝对接,实现高效的自然语言处理和编程辅助功能。

weixin_43590837的博客 8621

概率的接力:拆解大模型“预测下一个词“的底层逻辑

大模型的智能不在于它拥有了意识,而在于它用纯数学的架构,将人类语言的复杂结构压缩为可计算的向量轨迹与概率接力。当我们不再将其拟人化为"思考者",而是视作高维条件概率引擎时,才能真正驾驭它。预测下一个词,从来不是终点,而是起点。未来的核心竞争力,属于那些能洞察其统计本质、善用其模式生成能力,并以人类理性与事实为锚点的协作者。词元的轨迹终会止步于上下文窗口,但对技术底层的清醒认知,才是跨越幻觉、走向真实智能的基石。

AI浩 318

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 解密BERT中的位置编码:为什么随机初始化效果不输三角函数?
下一篇: DTFT、DFT和FFT傻傻分不清?5分钟图解帮你理清关系(附Python代码示例)
fern8
博客等级 码龄3年 60粉丝 1520原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值