这是一篇基于边缘连接方法的椭圆检测算法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 快速椭圆检测

算法流程图如下所示,流程很显然,从边缘弧段中分割出椭圆弧段,构造邻接矩阵并搜索所有弧段的组合,对每个组合进行快速拟合与验证,最后使用聚类方法去除重复椭圆。下面对每个阶段进行详细说明。
论文阅读——椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection

2.1 弧段提取

这步跟之前椭圆检测相关的博客中目的是一样的,从一个轮廓中提取出边缘弧段,图像模糊去噪,使用自适应Canny算法计算边缘,提取出没有分支的边缘,去除过短弧段,使用多边形逼近算法逼近边缘。

到这里,论文中有两点与传统方法不同

  • 过短弧段的阈值是自适应的,Tedge=22θarc1cos(θarc2)T_{edge} = \dfrac{2\sqrt{2}\theta_{arc}}{1-cos\left(\dfrac{\theta_{arc}}{2}\right)},其中θarc\theta_{arc}是一个阈值,论文中默认取值π/3\pi/3,表示椭圆弧段的逼近段中的最大弯曲程度。
  • 多边形逼近算法使用的是自适应多边形逼近算法。OpenCV中有多边形逼近算法,但是需要给一个阈值,2012年Prasad提出了自适应多边形逼近算法,没有提供C++版本,本文实现了C++版本的自适应逼近算法,并且进行了些优化,使得与OpenCV逼近算法速度相近。

边缘逼近之后,使用基于曲率和凸性的方法进行分割以得到椭圆弧段,这里与传统分割方法本质上思想一样,但是论文中使用了一个更加简洁的方法,将分割过程总结为一个公式。令一个逼近段表示为{Akk=1,2,...Nd}\{\textbf{A}_k|k=1,2,...N_{d}\},令vk=AkAk1\textbf{v}_k = \textbf{A}_k - \textbf{A}_{k-1},所有成对的逼近线段之间的角度为{θii=2,..,Nd1,θi(π,π)}\{\theta_i|i=2,..,N_d-1, \theta_i\in(-\pi,\pi)\},其中θi\theta_i是从vk\textbf{v}_kvk+1\textbf{v}_{k+1}的角度。 逼近的轮廓的弧序列必须满足凸性sign(θi)=sign(θi+1)sign(\theta_i) = sign(\theta_{i+1}),且曲率θi<θarc,1/λarcvi+1/viλarc|\theta_{i}|<\theta_{arc}, 1/\lambda_{arc}\leqslant |\textbf{v}_{i+1}|/|\textbf{v}_{i}|\leqslant \lambda_{arc}。这样,这个问题就可以用下面一个公式涵盖了。
{η=[vkvk+1,svk×vk+1]Tvk2[tp]=[1cotθarc0cscθarc]η\left\{\begin{array}{l} \boldsymbol{\eta} = \dfrac{\left[\textbf{v}_{k}\cdot \textbf{v}_{k+1}, s\textbf{v}_{k}\times \textbf{v}_{k+1}\right]^T}{|\textbf{v}_{k}|^2} \\ \left[\begin{array}{c} t\\p \end{array}\right] = \left[\begin{array}{cc} 1 & -cot\theta_{arc}\\ 0 & csc\theta_{arc} \end{array}\right] \cdot \boldsymbol{\eta}\\ \end{array} \right.

如果 t>0,p>0t>0, p>0, 1/λarc<η<λarc1/\lambda_{arc}<|\boldsymbol{\eta}|<\lambda_{arc}, 就可以说Ak+1\textbf{A}_{k+1}Ak1\textbf{A}_{k-1}, Ak\textbf{A}_{k} 属于同一个弧段,然后继续判断下一组弧段,直到所有弧段判断完成,这样就得到了一组椭圆弧段。弧段提取出之后按照顺时针方向处理

2.1 弧段邻接矩阵AAM的构建

一个椭圆因为噪声遮挡等原因会被分割维多个椭圆弧段,但是,直接判断3个或者更多弧段是否来自同一个椭圆是非常困难的,而判断两个弧段是否能够组合是比较容易的。这里采用了区域约束和曲率约束的方法来判断一对弧段的邻接情况。

从图像中提取出一组椭圆弧段{A~(k)k=1,2,..,τ}\{\tilde{A}^{(k)}| k = 1,2,..,\tau\}。对于任意弧段A~(k)\tilde{A}^{(k)},令 Ai(k)\textbf{ A}^{(k)}_iA~(k)\tilde{A}^{(k)}的第ii个点,Ai(k)\textbf{A}^{(k)}_{-i}A~(k)\tilde{A}^{(k)}倒数第ii个点。AAM L\textbf{L}是一个τ\tau-by-τ\tau的非对称矩阵,其中Li,j{1,0,1}L_{i,j}\in\{-1,0,1\}。令D(i,j)=A1(j)A1(i)D(i,j) = |\textbf{A}^{(j)}_{1} - \textbf{A}^{(i)}_{-1}|,表示第i个弧段的尾点到第j个弧段的首点的距离。

Li,jL_{i,j}表示弧段A~(i),A~(j)\tilde{A}^{(i)},\tilde{A}^{(j)}的连接性,和点A1(i)\textbf{A}^{(i)}_{-1}到点A1(j)\textbf{A}^{(j)}_{1}的邻接性。Li,j=1L_{i,j}=-1表示A~(i),A~(j)\tilde{A}^{(i)},\tilde{A}^{(j)}不属于同一个椭圆,此时也有Lj,i=Li,j=1L_{j,i}=L_{i,j}=-1Li,j=0L_{i,j}=0表示这两个弧段不邻接,不能直接判断A~(i),A~(j)\tilde{A}^{(i)},\tilde{A}^{(j)}是否属于同一个椭圆。Li,j=1L_{i,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)\tilde{A}^{(i)},\tilde{A}^{(j)},如果D(i,j)<D(i,i)D(i,j) < D(i,i),说明A1(j)\textbf{A}^{(j)}_{1}邻接与A1(i)\textbf{A}^{(i)}_{-1},那么就需要判断Li,jL_{i,j}是等于1还是等于-1,也就是连和不连,距离较远的弧段直接判定为0,在后续组合中验证即可。

论文中,使用了两个准则来判断连接性。这里避免繁琐的公式理解费劲,直接说思想,判断弧段是否相连时,主要判断对应的首尾点是否满足曲率和凸性,也就是判断是否互相在搜索区间里面。当然这种也有例外,对于那些首尾点特别近的,容易受到噪声等影响导致不满足椭圆几何性质,那么久直接将首尾点融合作为一个点,在相邻的两个点判断是否满足曲率即可。

论文阅读——椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection

按照上述思想,遍历所有弧段,即可获得邻接矩阵AAM。

2.3 基于AAM生成候选组合

这个部分是根据生成的AAM获得所有弧段的组合。

给定一个椭圆弧A~(r)\tilde{A}^{(r)},弧段搜索的目的是找到所有包含A~(r)\tilde{A}^{(r)}的组合结果。令一组包含弧段A~(r)\tilde{A}^{(r)}的来自同一个椭圆的弧段序列为{A~(np),A~(np1),...,A~(n1),A~(r),A~(m1),...,A~(mq1),A~(mq)}\{\tilde{A}^{(n_{p})}, \tilde{A}^{(n_{p-1})}, ..., \tilde{A}^{(n_1)}, \tilde{A}^{(r)}, \tilde{A}^{(m_1)},...,\tilde{A}^{(m_{q-1})},\tilde{A}^{(m_q)}\},其中A~(r)\tilde{A}^{(r)}为搜索根节点。定义集合Φr={n0,n1,n2,...,np},Φr+={m0,m1,m2,...,mq}\boldsymbol{\varPhi}^{r-} = \{n_0, n_1,n_2,...,n_p\}, \boldsymbol{\varPhi}^{r+} = \{m_0, m_1,m_2,...,m_q\}r=m0=n0r = m_0=n_0。集合Φr±=Φr{r}Φr+\boldsymbol{\varPhi}^{r\pm} = \boldsymbol{\varPhi}^{r-}\bigcup \{r\}\bigcup\boldsymbol{\varPhi}^{r+}是一个椭圆弧组合,每个元素存的是弧段角标。下面这个公式,给出了一个组合应该具有的性质,也是后续进行搜索弧段的根据。

{Lni,ni1=1,niΦrLmj1,mj=1,mjΦr+Lk,g1,k,gΦrΦr+\left\{\begin{array}{ll} L_{n_i,n_{i-1}} = 1, & \forall n_i\in \boldsymbol{\varPhi}^{r-}\\ L_{m_{j-1},m_j} = 1, & \forall m_j\in \boldsymbol{\varPhi}^{r+}\\ L_{k,g}\neq -1, & \forall k,g \in \boldsymbol{\varPhi}^{r-}\bigcup \boldsymbol{\varPhi}^{r+}\\ \end{array}\right.

如果搜索之后的集合Φr,Φr+\boldsymbol{\varPhi}^{r-},\boldsymbol{\varPhi}^{r+}满足上述公式,那么Φr±\boldsymbol{\varPhi}^{r\pm}就构成了一个候选弧段组合。直接搜索弧段组合是非常困难的,因此弧段选择被拆分为3个步骤,分别是弧段前向搜索弧段反向搜索双向组合验证

值得注意的是,上式有个潜在的属性Lk,g{0,1},k,gΦr±L_{k,g}\in \{0,1\}, \forall k,g \in \boldsymbol{\varPhi}^{r\pm}。在搜索过程中,如果 k,gΦr±\exists~k, g\in \boldsymbol{\varPhi}^{r\pm} 满足Lk,g=0L_{k,g} = 0,那么就验证下这两个弧段有没有可能不属于同一个椭圆,如果验证不属于同一个椭圆那么Lk,g=Lg,k=1L_{k,g} = L_{g,k} = -1

下面,介绍基于根节点A~(r)\tilde{A}^{(r)}的三种搜索策略。

第一步:前向搜索。 前向搜索能够根据如下公式得到所有前向组合I ⁣I+={Φ1r+,Φ2r+,...,ΦNpr+}{\rm \textbf{I}\!\textbf{I}}^+ = \{\boldsymbol{\varPhi}^{r+}_1,\boldsymbol{\varPhi}^{r+}_2,...,\boldsymbol{\varPhi}^{r+}_{N_p}\},其中Φir+\boldsymbol{\varPhi}^{r+}_i满足Φr+\boldsymbol{\varPhi}^{r+}的定义, NpN_p表示前向搜索的组合个数。对于第ii个组合,Φir+\boldsymbol{\varPhi}^{r+}_i被初始化为{m0}\{m_0\},搜索角标mim_i初始化为m0m_0。然后找到下一个弧段 A~(mi+1)\tilde{A}^{(m_{i+1})},这个弧段满足A~miA~mi+1\tilde{A}^{m_i}\rightarrow \tilde{A}^{m_{i+1}},也就是Lmi,mi+1=1L_{m_i, m_{i+1}} = 1。如果这没有弧段A~(mk)A~mi+1\tilde{A}^{(m_k)} \nrightarrow \tilde{A}^{m_{i+1}},也就是 Lmk,mi+1=1,k=0,1,...,iL_{m_k,m_{i+1}} = -1, k=0,1,...,i,这个弧段A~mi+1\tilde{A}^{m_{i+1}}将会被压进Φir+\boldsymbol{\varPhi}^{r+}_i,并且搜索角标设置为mi+1m_{i+1},直到没有弧段能够被放进Φir+\boldsymbol{\varPhi}^{r+}_i,这时候就得到一个前向弧段组合Φir+\boldsymbol{\varPhi}^{r+}_i。这里使用了一个深度优先遍历的方法以获得所有的组合I ⁣I+{\rm \textbf{I}\!\textbf{I}}^+

{Lmj1,mj=1,mjΦr+Lmk,mg1,mk,mgΦr+\left\{\begin{array}{l} L_{m_{j-1},m_j} = 1, \forall m_j\in \boldsymbol{\varPhi}^{r+}\\ L_{m_k,m_g}\neq -1, \forall m_k,m_g \in \boldsymbol{\varPhi}^{r+}\\ \end{array}\right.

第二步:反向搜索。反向搜索的方法与第一步相似,主要不同点在于搜索策略的不同,下式是反向搜索策略公式。反向搜索能够获得所有组合I ⁣I={Φ1r,Φ2r,...,ΦNar}{\rm \textbf{I}\!\textbf{I}}^- = \{\boldsymbol{\varPhi}^{r-}_1,\boldsymbol{\varPhi}^{r-}_2,...,\boldsymbol{\varPhi}^{r-}_{N_a}\},其中Φir\boldsymbol{\varPhi}^{r-}_i满足Φr\boldsymbol{\varPhi}^{r-}的定义,且NaN_a表示反向组合的个数。

{Lni,ni1=1,niΦrLnk,ng1,nk,ngΦr\left\{\begin{array}{l} L_{n_i,n_{i-1}} = 1, \forall n_i\in \boldsymbol{\varPhi}^{r-}\\ L_{n_k,n_g}\neq -1, \forall n_k,n_g \in \boldsymbol{\varPhi}^{r-}\\ \end{array}\right.

第三步:双向组合验证。经过上两步之后,能够得到两个集合I ⁣I+={Φ1r+,Φ2r+,...,ΦNpr+}{\rm \textbf{I}\!\textbf{I}}^+ = \{\boldsymbol{\varPhi}^{r+}_1,\boldsymbol{\varPhi}^{r+}_2,...,\boldsymbol{\varPhi}^{r+}_{N_p}\}I ⁣I={Φ1r,Φ2r,...,ΦNar}{\rm \textbf{I}\!\textbf{I}}^- = \{\boldsymbol{\varPhi}^{r-}_1,\boldsymbol{\varPhi}^{r-}_2,...,\boldsymbol{\varPhi}^{r-}_{N_a}\}。因此总共能够获得Nb=NpNaN_b=N_p\cdot N_a个双向组合。I ⁣I±={Φi,jr±i=1,2,..,Na,j=1,2,..,Np}{\rm \textbf{I}\!\textbf{I}}^{\pm} = \{\boldsymbol{\varPhi}^{r\pm}_{i,j}| i=1,2,.., N_a, j = 1,2,.., N_p\}按照组合的像素个数降序排序,Φi,jr±=ΦirΦjr+\boldsymbol{\varPhi}^{r\pm}_{i,j} = \boldsymbol{\varPhi}^{r-}_{i}\bigcup \boldsymbol{\varPhi}^{r+}_{j}。任意不满足下面这个公式的组合Φi,jr±\boldsymbol{\varPhi}^{r\pm}_{i,j}将会被置为\boldsymbol{\emptyset}

Lnk,mg1,nkΦr,mgΦr+L_{n_k,m_g}\neq -1, \forall n_k \in\boldsymbol{\varPhi}^{r-} ,m_g \in \boldsymbol{\varPhi}^{r+}

之后,一个弧段组合Φi,jr±\boldsymbol{\varPhi}^{r\pm}_{i,j}将会进行椭圆拟合,如果通过拟合,这个椭圆就会被放进候选椭圆中,在Φi,jr±\boldsymbol{\varPhi}^{r\pm}_{i,j}中的弧段将不会参加到任何组合中。遍历所有弧段A~(r)\tilde{A}^{(r)}将会得到所有候选组合。最后使用Prasad 和Leung的方法进行椭圆聚类,剔除重复椭圆,得到最终检测椭圆。

2.4 椭圆拟合

一般的椭圆公式为 α1x2+2α2xy+α3y2+2α4x+2α5y+α6=0\alpha_1x^2 + 2\alpha_2xy + \alpha_3y^2 + 2\alpha_4x+2\alpha_5y+\alpha_6=0,椭圆拟合问题转换为解决如下公式Sα=λCα\textbf{S}\boldsymbol{\alpha} = \lambda \textbf{C} \boldsymbol{\alpha},其中S\textbf{S}是一个66矩阵,C\textbf{C}是一个66约束矩阵,α\boldsymbol{\alpha}是需要求解的向量,α=[α1,...,α6]T\boldsymbol{\alpha} = [\alpha_1,...,\alpha_6]^T。ElliFit方法约束了α3=1\alpha_3 = 1,也就是C\textbf{C}的元素 C3,3=1C_{3,3} = 1,其他设置为0。

我们假设一个点集 {(xi,yi)i=1,2,...,N}\{(x_i,y_i)|i=1,2,...,N\}用于拟合一个椭圆。令ai=[xi2,2xiyi,yi2,2xi,2yi,1]\textbf{a}_i=[x_i^2,2x_iy_i,y_i^2,2x_i,2y_i,1]a1N=[a1T,a2T,...,aNT]T\textbf{a}_{1\rightarrow N} = [\textbf{a}_1^T,\textbf{a}_2^T,...,\textbf{a}_{N}^T]^T。那么拟合矩阵S=a1NTa1N=k=1N akT ak\textbf{S} = \textbf{a}_{1\rightarrow N}^{T}\textbf{a}_{1\rightarrow N}=\sum_{k=1}^{N}\textbf{ a}_k^T\textbf{ a}_k,这样就引出如下的累计因子和累计矩阵的定义。

累计因子。给一个点(xi,yi)(x_i,y_i),矩阵aiTai\textbf{a}_i^T\textbf{a}_i定义为累积因子 fxi,yi\textbf{ f}_{x_i,y_i},也就是fxi,yi=aiTai\textbf{f}_{x_i,y_i} = \textbf{a}_i^T\textbf{a}_i fxi,yi\textbf{ f}_{x_i,y_i}仅与点(xi,yi)(x_i,y_i)有关与图像上下文无关。因此,累积因子 fxi,yi\textbf{ f}_{x_i,y_i}能够在检测之前进行初始化。

累积矩阵。所有相关点的累计因子的和就是累积矩阵Fs\textbf{F}^{s},也就是Fs=i=1Nfxi,yi\textbf{F}^{s} = \sum\limits_{i=1}^{N}\textbf{f}_{x_i,y_i}。一个弧段组合Φr±={r1,r2,...,rm}\boldsymbol{\varPhi}^{r\pm} = \{r_1,r_2,...,r_m\}的拟合矩阵S\textbf{S}就是在这个组合的每个弧段的累积矩阵Fis\textbf{F}^{s}_i 的和,也就是S=iΦr±Fis\textbf{S} = \sum\limits_{i\in\boldsymbol{\varPhi}^{r\pm}} \textbf{F}^s_{i}

除此之外,论文中给出了一种求解方法,该方法能够通过两次的特征值特征向量分解来计算 Sα=λCα\textbf{ S}\boldsymbol{\alpha} = \lambda \textbf{C} \boldsymbol{\alpha}。这里给出详细过程,S\textbf{S}是一个实对称矩阵,因此能够分解为QTΛQ\textbf{Q}^T\boldsymbol{\varLambda}\textbf{Q}Q\textbf{Q}是一个由特征向量构成的正交矩阵,且Λ\boldsymbol{\varLambda}是有特征值构成的对角矩阵。令β=Λ1/2Qα\boldsymbol{\beta}=\boldsymbol{\varLambda}^{1/2}\textbf{Q}\boldsymbol{\alpha},拟合问题转变为Λ1/2QCQTΛ1/2β=Mβ=1λβ\boldsymbol{\varLambda}^{-1/2}\textbf{QC}\textbf{Q}^T\boldsymbol{\varLambda}^{-1/2}\boldsymbol{\beta}=\textbf{M}\boldsymbol{\beta}=\dfrac{1}{\lambda}\boldsymbol{\beta}。令β\boldsymbol{\beta}^*M\textbf{M}最大特征值对应的特征向量,则α=QTΛ1/2β\boldsymbol{\alpha}^*=\textbf{Q}^T\boldsymbol{\varLambda}^{-1/2}\boldsymbol{\beta}^*是最终拟合求解结果。

总结下这个小节想说明的事情。

  • 从一个点集转换到拟合矩阵,涉及到大量的乘法加法计算,而一个预计算好的累计因子,能够大量的减少计算拟合矩阵所用的时间,提高最终检测速度。
  • 提供了一个二次分解的求解方法,这样就能使用OpenCV提供的特征值分解方法进行求解,使得在C++实现变为可能。
  • 每个弧段都对应一个累计矩阵,那么一个弧段组合就是这几个弧段的累积矩阵的加法,非常快的就能获得一个组合所需的拟合矩阵,极大减少了统计时间。

2.5 椭圆验证

拟合出一个椭圆之后,需要验证其是否为真椭圆,因此本文采用采样点Vi,i=1,2,..,Nv\textbf{V}_i,i=1,2,..,N_v的方法来进行验证。论文使用了4种指标,形状指标S ⁣I{S\!I},位置指标L ⁣I{L\!I},梯度指标G ⁣I{G\!I}和加权指标W ⁣I{W\!I}。验证得分PscoreP_{score}按照如下公式计算得到,其中L ⁣Ii,G ⁣Ii,W ⁣Ii{L\!I}_i, {G\!I}_i, {W\!I}_i为第ithi^{th}个采样点的指标值。

Pscore=S ⁣Ii=1Nv(0.5+L ⁣IiG ⁣Ii)W ⁣IiNvi=1NvW ⁣IiP_{score} = {S\!I} \cdot \dfrac{\sum\limits_{i=1}^{N_v} \left(0.5 + {L\!I}_i\cdot {G\!I}_i\right)\cdot {W\!I}_i}{N_v\cdot \sum\limits_{i=1}^{N_v} {W\!I}_i}

给定一个拟合椭圆E~\tilde{E},令OE~\textbf{O}_{\tilde{E}}为椭圆中心点,θE~\theta_{\tilde{E}}为旋转角,wE~,hE~w_{\tilde{E}}, h_{\tilde{E}}为对应的半长短轴长。R(θE~)\textbf{R}(\theta_{\tilde{E}})为对应的旋转矩阵,θVi\theta_{\textbf{V}_i}为采样点对应的采样角度。下面介绍4个指标。

形状指标。这个主要用于约束椭圆形状的,避免过扁或过小的椭圆,最终拟合公式如下所示。

S ⁣I={1,if{wE~hE~wE~2+hE~2>221wE~hE~2/21cos(θarc2)0,otherwise{S\!I} = \left\{\begin{array}{ll} 1 & ,if\left\{\begin{array}{l} \dfrac{w_{\tilde{E}}h_{\tilde{E}}}{\sqrt{w_{\tilde{E}}^2+h_{\tilde{E}}^2}} > \dfrac{\sqrt{2}}{\sqrt{2}-1}\\ \sqrt{w_{\tilde{E}}h_{\tilde{E}}}\geqslant \dfrac{\sqrt{2}/2}{1-cos\left(\dfrac{\theta_{arc}}{2}\right)} \end{array}\right.\\ 0 & ,otherwise\\ \end{array}\right.

位置指标。如果第 ithi^{th}个采样点Vi\textbf{V}_i 落在边缘点的一个8邻域上,则认为其满足位置指标,对应指标值L ⁣Ii=1{L\!I}_i = 1,否则L ⁣Ii=0{L\!I}_i = 0

梯度指标。梯度指标主要是用于验证当前采样点的估计梯度li\textbf{l}_i和理论梯度gi\textbf{g}_i的差异,下面公式给出计算梯度指标值的方法。

G ⁣Ii=122πθ<li,gi>{G\!I}_i = \dfrac{1}{2} - \dfrac{2}{\pi}\theta_{<\textbf{l}_i,\textbf{g}_i>}

加权指标。椭圆采样点是从极坐标出发,在角度轴均匀采样,这就导致采样点在图像上分布并不均匀(在长轴两端点多,短轴两端点少),因此对每个采样点,使用如下的加权指标进行加权,以提高验证精度,每个采样点的加权指标为W ⁣Ii=W(θVi){W\!I}_i = W(\theta_{\textbf{V}_i})

W(θ)=rRR2cos2θ+r2sin2θW(\theta) = \dfrac{rR}{R^2cos^2\theta+r^2sin^2\theta}

采样点的采样方法是从拟合椭圆的极坐标出发的,采样点个数由如下公式计算得到。也就是,如果椭圆周长小于360,那么个数就是周长,否则就采360个点。

Nv={360,if (wE~+hE~)π360(wE~+hE~)π,otherwiseN_v = \left\{\begin{array}{ll} 360 & , if~ (w_{\tilde{E}}+ h_{\tilde{E}})\pi \geqslant 360\\ (w_{\tilde{E}}+ h_{\tilde{E}})\pi & ,otherwise \end{array}\right.

最终,如果Pscore>TvalP_{score} > T_{val}TvalT_{val}是验证阈值,那么就认为这个拟合椭圆是一个真椭圆,否则这个椭圆被认定为虚假椭圆。

3 实验部分

论文提供了大量实验,这里不一一叙述,仅列出比较重要的点。

  • 在原有的2个仿真数据集(occluded, overlap,缺失椭圆和重叠椭圆)的基础上,补充了新的两个仿真数据集(concentric 和concurrent,同椭圆中心点和同交点 ),数据集已公开
  • 在原有3个真实数据集上,公开了两个可见光和红外卫星数据集。
  • 验证算法和标记工具是开源的。
  • 提供了自动调参方法,这样就能解释实验中为什么要设置那样的默认参数,因为这是算出来。
  • 该算法提供了C++和Python版本,方便使用。

下图给出了算法在9个数据集上的精度对比,该算法除了对缺失椭圆处理较差之外,其他表现整体良好。从论文的敏感度分析也能发现,将验证阈值设置地点,缺失椭圆的精度显著提升。
论文阅读——椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection
检测速度也是所有方法中整体上最快的。
论文阅读——椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection
下图是对应的检测结果,大部分都检测出来了。
论文阅读——椭圆检测 2020:Arc Adjacency Matrix-Based Fast Ellipse Detection

个人总结

AAMED核心在于组合所有可能的弧段以提高检测精度,弧段邻接准则,弧段分割都是采用常用的方法。之前的弧段分割都是将其归类到多个象限中,这样尽管降低了组合难度,但是也会造成弧段的过分割。

AAMED能够在各种平台上使用,包括嵌入式平台(包括ARM和TX2平台),对于960*540的图片,嵌入式检测时间小于30ms。

关于未来改进趋势,我列如下几点进行说明。

  • 速度问题。椭圆检测速度仍然需要提高,越快越好,当算法成熟时候,我认为一定能在1080P上的检测速度小于30ms。基于GPU的椭圆检测是趋势,目前椭圆检测算法好多依赖串行,并行化较难。
  • 并行问题。搜索所有候选组合+椭圆拟合验证,我认为理论上,并行性已经很好了,对耗时进行分析,也发现大部分时间浪费在了Canny检测和边缘线提取上,几乎占用了一半的时间。(因为多边形逼近和弧段分割,是可以并行的),所以边缘线提取的并行处理问题有待解决,这个解决了,速度就快了。
  • 改进方向。进过分析,我发现Canny算法会导致边缘被复杂背景带偏,导致曲率错误,弧段过分割,ELSD算法是椭圆弧段检测器,基于是梯度,并没有使用Canny,所以基于梯度的检测算法是趋势,但是多边形逼近,曲率计算等问题需要解决了。此外,AAMED对任意两个弧段的邻接性判断较为简单,后续可以提出一个更强的判断准则,以让矩阵变得更加稀疏有效。椭圆验证也需要加强,最好能够提出一个适合所有情况的验证方法,拟合出一个椭圆,判断其是还是不是,似乎很像深度学习的思路,但是深度学习如何训练,还有速度问题有待考虑,如果能解决验证问题,椭圆准确率会直线上升。

这个论文我觉得讲的还不是很清晰,但各位有不明白的地方或者有独特见解的欢迎讨论。

相关文章:

  • 2022-03-03
  • 2021-07-07
  • 2021-05-07
  • 2021-04-01
  • 2022-12-23
  • 2021-06-01
  • 2021-11-23
  • 2021-12-07
猜你喜欢
  • 2021-12-29
  • 2021-07-18
  • 2021-08-06
  • 2021-07-07
  • 2022-12-23
  • 2021-04-19
  • 2021-08-29
相关资源
相似解决方案