线性时间求解点集所有点最近邻的Felzenszwalb算法

本文介绍了Felzenszwalb算法,用于在一维和高维情况下快速求解点集所有点到特定边界的最近邻问题。在字体渲染中,该算法用于计算图像上每个点到轮廓线的最短距离。算法基于抛物线的性质,通过构建下包络逐步求解,具有O(KN)的时间复杂度。
摘要由CSDN通过智能技术生成

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

一维情形的求解

首先介绍一维点集的最近邻求解,并且不难由一维推广到更高维的情况。首先先看一下核心的计算式:设集合 S S 为一个一维的点集, G 表示二值化后的点集的状态,每个点的取值为0或1,每个点的最近邻可以由如下式子得出

Df(p)=min((pq)2+f(q)),qS D f ( p ) = m i n ( ( p − q ) 2 + f ( q ) ) , q ∈ S
对于本文所提到的情形下,其中
f(q)={ 0,,G(q)=1G(q)=0 f ( q ) = { 0 , G(q)=1 ∞ , G(q)=0

如果是第一次看见这种表达,可能不太好理解,那么来仔细考虑一下这个式子,右侧是一个取最小值的表达,对什么取最小值呢? (xp)2+f(q),qS ( x − p ) 2 + f ( q ) , q ∈ S q q 个函数,更细一点来看它们都是开口向上抛物线,抛物线的极小值点为 ( q , f ( q ) ) 自变量为 x x ,那么上面这个式子其实是在对所有的这 q 个函数在自变量为 x=p x = p 的时候的函数值取最小值,由于当
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值