这是一篇基于边缘连接方法的椭圆检测算法AAMED《Arc Adjacency Matrix-Based Fast Ellipse Detection》,核心思想是使用弧段邻接矩阵获得所有弧段的组合方法,然后使用提出的基于采样点的思想的验证方法进行验证。
论文公开了使用的9个数据集,并给出了AAMED在这9个数据集的检测结果,并提供了AAMED源代码,对应下载链接:AAMED算法
下面对该论文进行详细说明。
摘要
快速准确的椭圆检测算法在计算机视觉任务中至关重要。本文提出了一种基于弧段邻接矩阵的椭圆检测算法AAMED。首先,将提取出的边缘线分割成椭圆弧,之后构造有向的弧段邻接矩阵AAM,矩阵每个元素表示了3种邻接状态,并采用了曲率约束和区域约束来使得AAM变得稀疏。其次,通过双向遍历AAM,可以得到所有可能是真实椭圆候选的弧段组合,同时求出了基于累积因子CF的累积矩阵CM。CF与图像上下文无关,可以预先计算。CM与弧或弧的组合有关,可以通过CF的加法或减法进行计算,利用Jacobi方法对CM进行二次特征分解,有效地拟合出候选椭圆。最后,为了有效地消除虚假椭圆,给出了一个综合公式以计算验证分数,分数主要受自适应形状、切线相似性、分布补偿等约束条件的影响。实验表明,在Precision、Recall、F-measure和时间消耗方面,AAMED在9个数据集上的整体性能优于对比的方法。
1 介绍
(椭圆检测的应用和相关工作都说过了,这里不再进行说明)
椭圆检测目前仍有很大的改进空间。因为噪声、不完全和遮挡椭圆的存在,椭圆的边界被分割为多个弧段。组合尽可能多的来自同一个椭圆的弧段,是提升椭圆检测精度的有效手段。有效的组合条件,能够大量的减少候选弧段组合,能够提高椭圆的检测速度。
为了解决上述的问题,本文采用了基于边缘链接的方法来有效快速的检测椭圆。首先,根据椭圆的曲率与凸性提取出椭圆弧段。然后根据一对弧段之间的连接关系构造弧段的邻接矩阵AAM,然后从邻接矩阵搜索出所有可能的组合,得到候选组合。接着,对每个组合进行拟合验证,去除错误组合,得到候选椭圆,最后采用椭圆聚类的方法得到最终椭圆。
本文的创新点如下所示。
- 提出了一种基于有向图的AAM方法来描述任意两个弧的可组合性和序列邻接性。采用曲率约束和区域约束使AAM稀疏。在AAM的基础上,采用双向搜索策略可以找到更正确的组合。
- 基于累积因子CF的累积矩阵CM用于描述一个弧段组合,进而进行快速的椭圆拟合。CF与图像上下文无关,CM仅与弧段组合相关,一个椭圆能够使用基于Jacobi的方法通过两次特征分解拟合得到。
- 提出了自适应形状、切线相似性和分布补偿等约束条件,以获得椭圆验证分数。利用综合得分对拟合椭圆进行验证,有效地消除假椭圆。该验证方法仅需要一个阈值。
2 快速椭圆检测
算法流程图如下所示,流程很显然,从边缘弧段中分割出椭圆弧段,构造邻接矩阵并搜索所有弧段的组合,对每个组合进行快速拟合与验证,最后使用聚类方法去除重复椭圆。下面对每个阶段进行详细说明。

2.1 弧段提取
这步跟之前椭圆检测相关的博客中目的是一样的,从一个轮廓中提取出边缘弧段,图像模糊去噪,使用自适应Canny算法计算边缘,提取出没有分支的边缘,去除过短弧段,使用多边形逼近算法逼近边缘。
到这里,论文中有两点与传统方法不同
- 过短弧段的阈值是自适应的,Tedge=1−cos(2θarc)22θarc,其中θarc是一个阈值,论文中默认取值π/3,表示椭圆弧段的逼近段中的最大弯曲程度。
- 多边形逼近算法使用的是自适应多边形逼近算法。OpenCV中有多边形逼近算法,但是需要给一个阈值,2012年Prasad提出了自适应多边形逼近算法,没有提供C++版本,本文实现了C++版本的自适应逼近算法,并且进行了些优化,使得与OpenCV逼近算法速度相近。
边缘逼近之后,使用基于曲率和凸性的方法进行分割以得到椭圆弧段,这里与传统分割方法本质上思想一样,但是论文中使用了一个更加简洁的方法,将分割过程总结为一个公式。令一个逼近段表示为{Ak∣k=1,2,...Nd},令vk=Ak−Ak−1,所有成对的逼近线段之间的角度为{θi∣i=2,..,Nd−1,θi∈(−π,π)},其中θi是从vk到vk+1的角度。 逼近的轮廓的弧序列必须满足凸性sign(θi)=sign(θi+1),且曲率∣θi∣<θarc,1/λarc⩽∣vi+1∣/∣vi∣⩽λarc。这样,这个问题就可以用下面一个公式涵盖了。
⎩⎪⎪⎨⎪⎪⎧η=∣vk∣2[vk⋅vk+1,svk×vk+1]T[tp]=[10−cotθarccscθarc]⋅η
如果 t>0,p>0, 1/λarc<∣η∣<λarc, 就可以说Ak+1 和Ak−1, Ak 属于同一个弧段,然后继续判断下一组弧段,直到所有弧段判断完成,这样就得到了一组椭圆弧段。弧段提取出之后按照顺时针方向处理
2.1 弧段邻接矩阵AAM的构建
一个椭圆因为噪声遮挡等原因会被分割维多个椭圆弧段,但是,直接判断3个或者更多弧段是否来自同一个椭圆是非常困难的,而判断两个弧段是否能够组合是比较容易的。这里采用了区域约束和曲率约束的方法来判断一对弧段的邻接情况。
从图像中提取出一组椭圆弧段{A~(k)∣k=1,2,..,τ}。对于任意弧段A~(k),令 Ai(k)是A~(k)的第i个点,A−i(k)是A~(k)倒数第i个点。AAM L是一个τ-by-τ的非对称矩阵,其中Li,j∈{−1,0,1}。令D(i,j)=∣A1(j)−A−1(i)∣,表示第i个弧段的尾点到第j个弧段的首点的距离。
Li,j表示弧段A~(i),A~(j)的连接性,和点A−1(i)到点A1(j)的邻接性。Li,j=−1表示A~(i),A~(j)不属于同一个椭圆,此时也有Lj,i=Li,j=−1。Li,j=0表示这两个弧段不邻接,不能直接判断A~(i),A~(j)是否属于同一个椭圆。Li,j=1表示这两个弧段邻接,可以认为属于同一个椭圆。在开始阶段,邻接矩阵AAM初始化为0。
关于邻接矩阵三个邻接属性的理解,下面给个示例
假如给个组合A,B,C,D
- 如果AD之间的邻接值为-1,那么这个组合不存在,也就说明AD不能同时存在在一个组合里面。
- 如果AD之间的邻接值为0,那么A和D不能同时组合,也就是不存在ADC,ADB这样的组合,但是ABD,ACD这样的组合是可以存在的。
- 如果AD之间的邻接值为1,就说明可以出现ADC和ADB这样的组合。
对于任意两个弧段A~(i),A~(j),如果D(i,j)<D(i,i),说明A1(j)邻接与A−1(i),那么就需要判断Li,j是等于1还是等于-1,也就是连和不连,距离较远的弧段直接判定为0,在后续组合中验证即可。
论文中,使用了两个准则来判断连接性。这里避免繁琐的公式理解费劲,直接说思想,判断弧段是否相连时,主要判断对应的首尾点是否满足曲率和凸性,也就是判断是否互相在搜索区间里面。当然这种也有例外,对于那些首尾点特别近的,容易受到噪声等影响导致不满足椭圆几何性质,那么久直接将首尾点融合作为一个点,在相邻的两个点判断是否满足曲率即可。

按照上述思想,遍历所有弧段,即可获得邻接矩阵AAM。
2.3 基于AAM生成候选组合
这个部分是根据生成的AAM获得所有弧段的组合。
给定一个椭圆弧A~(r),弧段搜索的目的是找到所有包含A~(r)的组合结果。令一组包含弧段A~(r)的来自同一个椭圆的弧段序列为{A~(np),A~(np−1),...,A~(n1),A~(r),A~(m1),...,A~(mq−1),A~(mq)},其中A~(r)为搜索根节点。定义集合Φr−={n0,n1,n2,...,np},Φr+={m0,m1,m2,...,mq},r=m0=n0。集合Φr±=Φr−⋃{r}⋃Φr+是一个椭圆弧组合,每个元素存的是弧段角标。下面这个公式,给出了一个组合应该具有的性质,也是后续进行搜索弧段的根据。
⎩⎨⎧Lni,ni−1=1,Lmj−1,mj=1,Lk,g=−1,∀ni∈Φr−∀mj∈Φr+∀k,g∈Φr−⋃Φr+
如果搜索之后的集合Φr−,Φr+满足上述公式,那么Φr±就构成了一个候选弧段组合。直接搜索弧段组合是非常困难的,因此弧段选择被拆分为3个步骤,分别是弧段前向搜索,弧段反向搜索,双向组合验证。
值得注意的是,上式有个潜在的属性Lk,g∈{0,1},∀k,g∈Φr±。在搜索过程中,如果∃ k,g∈Φr± 满足Lk,g=0,那么就验证下这两个弧段有没有可能不属于同一个椭圆,如果验证不属于同一个椭圆那么Lk,g=Lg,k=−1。
下面,介绍基于根节点A~(r)的三种搜索策略。
第一步:前向搜索。 前向搜索能够根据如下公式得到所有前向组合II+={Φ1r+,Φ2r+,...,ΦNpr+},其中Φir+满足Φr+的定义, Np表示前向搜索的组合个数。对于第i个组合,Φir+被初始化为{m0},搜索角标mi初始化为m0。然后找到下一个弧段 A~(mi+1),这个弧段满足A~mi→A~mi+1,也就是Lmi,mi+1=1。如果这没有弧段A~(mk)↛A~mi+1,也就是 Lmk,mi+1=−1,k=0,1,...,i,这个弧段A~mi+1将会被压进Φir+,并且搜索角标设置为mi+1,直到没有弧段能够被放进Φir+,这时候就得到一个前向弧段组合Φir+。这里使用了一个深度优先遍历的方法以获得所有的组合II+
{Lmj−1,mj=1,∀mj∈Φr+Lmk,mg=−1,∀mk,mg∈Φr+
第二步:反向搜索。反向搜索的方法与第一步相似,主要不同点在于搜索策略的不同,下式是反向搜索策略公式。反向搜索能够获得所有组合II−={Φ1r−,Φ2r−,...,ΦNar−},其中Φir−满足Φr−的定义,且Na表示反向组合的个数。
{Lni,ni−1=1,∀ni∈Φr−Lnk,ng=−1,∀nk,ng∈Φr−
第三步:双向组合验证。经过上两步之后,能够得到两个集合II+={Φ1r+,Φ2r+,...,ΦNpr+}和II−={Φ1r−,Φ2r−,...,ΦNar−}。因此总共能够获得Nb=Np⋅Na个双向组合。II±={Φi,jr±∣i=1,2,..,Na,j=1,2,..,Np}按照组合的像素个数降序排序,Φi,jr±=Φir−⋃Φjr+。任意不满足下面这个公式的组合Φi,jr±将会被置为∅。
Lnk,mg=−1,∀nk∈Φr−,mg∈Φr+
之后,一个弧段组合Φi,jr±将会进行椭圆拟合,如果通过拟合,这个椭圆就会被放进候选椭圆中,在Φi,jr±中的弧段将不会参加到任何组合中。遍历所有弧段A~(r)将会得到所有候选组合。最后使用Prasad 和Leung的方法进行椭圆聚类,剔除重复椭圆,得到最终检测椭圆。
2.4 椭圆拟合
一般的椭圆公式为 α1x2+2α2xy+α3y2+2α4x+2α5y+α6=0,椭圆拟合问题转换为解决如下公式Sα=λCα,其中S是一个66矩阵,C是一个66约束矩阵,α是需要求解的向量,α=[α1,...,α6]T。ElliFit方法约束了α3=1,也就是C的元素 C3,3=1,其他设置为0。
我们假设一个点集 {(xi,yi)∣i=1,2,...,N}用于拟合一个椭圆。令ai=[xi2,2xiyi,yi2,2xi,2yi,1],a1→N=[a1T,a2T,...,aNT]T。那么拟合矩阵S=a1→NTa1→N=∑k=1N akT ak,这样就引出如下的累计因子和累计矩阵的定义。
累计因子。给一个点(xi,yi),矩阵aiTai定义为累积因子 fxi,yi,也就是fxi,yi=aiTai, fxi,yi仅与点(xi,yi)有关与图像上下文无关。因此,累积因子 fxi,yi能够在检测之前进行初始化。
累积矩阵。所有相关点的累计因子的和就是累积矩阵Fs,也就是Fs=i=1∑Nfxi,yi。一个弧段组合Φr±={r1,r2,...,rm}的拟合矩阵S就是在这个组合的每个弧段的累积矩阵Fis 的和,也就是S=i∈Φr±∑Fis。
除此之外,论文中给出了一种求解方法,该方法能够通过两次的特征值特征向量分解来计算 Sα=λCα。这里给出详细过程,S是一个实对称矩阵,因此能够分解为QTΛQ,Q是一个由特征向量构成的正交矩阵,且Λ是有特征值构成的对角矩阵。令β=Λ1/2Qα,拟合问题转变为Λ−1/2QCQTΛ−1/2β=Mβ=λ1β。令β∗是M最大特征值对应的特征向量,则α∗=QTΛ−1/2β∗是最终拟合求解结果。
总结下这个小节想说明的事情。
- 从一个点集转换到拟合矩阵,涉及到大量的乘法加法计算,而一个预计算好的累计因子,能够大量的减少计算拟合矩阵所用的时间,提高最终检测速度。
- 提供了一个二次分解的求解方法,这样就能使用OpenCV提供的特征值分解方法进行求解,使得在C++实现变为可能。
- 每个弧段都对应一个累计矩阵,那么一个弧段组合就是这几个弧段的累积矩阵的加法,非常快的就能获得一个组合所需的拟合矩阵,极大减少了统计时间。
2.5 椭圆验证
拟合出一个椭圆之后,需要验证其是否为真椭圆,因此本文采用采样点Vi,i=1,2,..,Nv的方法来进行验证。论文使用了4种指标,形状指标SI,位置指标LI,梯度指标GI和加权指标WI。验证得分Pscore按照如下公式计算得到,其中LIi,GIi,WIi为第ith个采样点的指标值。
Pscore=SI⋅Nv⋅i=1∑NvWIii=1∑Nv(0.5+LIi⋅GIi)⋅WIi
给定一个拟合椭圆E~,令OE~为椭圆中心点,θE~为旋转角,wE~,hE~为对应的半长短轴长。R(θE~)为对应的旋转矩阵,θVi为采样点对应的采样角度。下面介绍4个指标。
形状指标。这个主要用于约束椭圆形状的,避免过扁或过小的椭圆,最终拟合公式如下所示。
SI=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧10,if⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧wE~2+hE~2wE~hE~>2−12wE~hE~⩾1−cos(2θarc)2/2,otherwise
位置指标。如果第 ith个采样点Vi 落在边缘点的一个8邻域上,则认为其满足位置指标,对应指标值LIi=1,否则LIi=0。
梯度指标。梯度指标主要是用于验证当前采样点的估计梯度li和理论梯度gi的差异,下面公式给出计算梯度指标值的方法。
GIi=21−π2θ<li,gi>
加权指标。椭圆采样点是从极坐标出发,在角度轴均匀采样,这就导致采样点在图像上分布并不均匀(在长轴两端点多,短轴两端点少),因此对每个采样点,使用如下的加权指标进行加权,以提高验证精度,每个采样点的加权指标为WIi=W(θVi)。
W(θ)=R2cos2θ+r2sin2θrR
采样点的采样方法是从拟合椭圆的极坐标出发的,采样点个数由如下公式计算得到。也就是,如果椭圆周长小于360,那么个数就是周长,否则就采360个点。
Nv={360(wE~+hE~)π,if (wE~+hE~)π⩾360,otherwise
最终,如果Pscore>Tval,Tval是验证阈值,那么就认为这个拟合椭圆是一个真椭圆,否则这个椭圆被认定为虚假椭圆。
3 实验部分
论文提供了大量实验,这里不一一叙述,仅列出比较重要的点。
- 在原有的2个仿真数据集(occluded, overlap,缺失椭圆和重叠椭圆)的基础上,补充了新的两个仿真数据集(concentric 和concurrent,同椭圆中心点和同交点 ),数据集已公开
- 在原有3个真实数据集上,公开了两个可见光和红外卫星数据集。
- 验证算法和标记工具是开源的。
- 提供了自动调参方法,这样就能解释实验中为什么要设置那样的默认参数,因为这是算出来。
- 该算法提供了C++和Python版本,方便使用。
下图给出了算法在9个数据集上的精度对比,该算法除了对缺失椭圆处理较差之外,其他表现整体良好。从论文的敏感度分析也能发现,将验证阈值设置地点,缺失椭圆的精度显著提升。

检测速度也是所有方法中整体上最快的。

下图是对应的检测结果,大部分都检测出来了。

个人总结
AAMED核心在于组合所有可能的弧段以提高检测精度,弧段邻接准则,弧段分割都是采用常用的方法。之前的弧段分割都是将其归类到多个象限中,这样尽管降低了组合难度,但是也会造成弧段的过分割。
AAMED能够在各种平台上使用,包括嵌入式平台(包括ARM和TX2平台),对于960*540的图片,嵌入式检测时间小于30ms。
关于未来改进趋势,我列如下几点进行说明。
-
速度问题。椭圆检测速度仍然需要提高,越快越好,当算法成熟时候,我认为一定能在1080P上的检测速度小于30ms。基于GPU的椭圆检测是趋势,目前椭圆检测算法好多依赖串行,并行化较难。
-
并行问题。搜索所有候选组合+椭圆拟合验证,我认为理论上,并行性已经很好了,对耗时进行分析,也发现大部分时间浪费在了Canny检测和边缘线提取上,几乎占用了一半的时间。(因为多边形逼近和弧段分割,是可以并行的),所以边缘线提取的并行处理问题有待解决,这个解决了,速度就快了。
-
改进方向。进过分析,我发现Canny算法会导致边缘被复杂背景带偏,导致曲率错误,弧段过分割,ELSD算法是椭圆弧段检测器,基于是梯度,并没有使用Canny,所以基于梯度的检测算法是趋势,但是多边形逼近,曲率计算等问题需要解决了。此外,AAMED对任意两个弧段的邻接性判断较为简单,后续可以提出一个更强的判断准则,以让矩阵变得更加稀疏有效。椭圆验证也需要加强,最好能够提出一个适合所有情况的验证方法,拟合出一个椭圆,判断其是还是不是,似乎很像深度学习的思路,但是深度学习如何训练,还有速度问题有待考虑,如果能解决验证问题,椭圆准确率会直线上升。
这个论文我觉得讲的还不是很清晰,但各位有不明白的地方或者有独特见解的欢迎讨论。