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

这是一篇基于边缘连接方法的椭圆检测算法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算法计算边缘,提取出没有分支的边缘,去除过短弧段,使用多边形逼近算法逼近边缘。

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

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

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

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

2.1 弧段邻接矩阵AAM的构建

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

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

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

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

在这里插入图片描述

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

2.3 基于AAM生成候选组合

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

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

{ L n i , n i − 1 = 1 , ∀ n i ∈ Φ r − L m j − 1 , m j = 1 , ∀ m j ∈ Φ r + L k , g ≠ − 1 , ∀ 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. Lni,ni1=1,Lmj1,mj=1,Lk,g=1,niΦrmjΦr+k,gΦrΦr+

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

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

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

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

{ L m j − 1 , m j = 1 , ∀ m j ∈ Φ r + L m k , m g ≠ − 1 , ∀ m k , m g ∈ Φ 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. {Lmj1,mj=1,mjΦr+Lmk,mg=1,mk,mgΦr+

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

{ L n i , n i − 1 = 1 , ∀ n i ∈ Φ r − L n k , n g ≠ − 1 , ∀ n k , n g ∈ Φ 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. {Lni,ni1=1,niΦrLnk,ng=1,nk,ngΦr

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

L n k , m g ≠ − 1 , ∀ n k ∈ Φ r − , m g ∈ Φ r + L_{n_k,m_g}\neq -1, \forall n_k \in\boldsymbol{\varPhi}^{r-} ,m_g \in \boldsymbol{\varPhi}^{r+} Lnk,mg=1,nkΦr,mgΦr+

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

2.4 椭圆拟合

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

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

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

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

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

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

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

2.5 椭圆验证

拟合出一个椭圆之后,需要验证其是否为真椭圆,因此本文采用采样点 V i , i = 1 , 2 , . . , N v \textbf{V}_i,i=1,2,..,N_v Vi,i=1,2,..,Nv的方法来进行验证。论文使用了4种指标,形状指标 S  ⁣ I {S\!I} SI,位置指标 L  ⁣ I {L\!I} LI,梯度指标 G  ⁣ I {G\!I} GI和加权指标 W  ⁣ I {W\!I} WI。验证得分 P s c o r e P_{score} Pscore按照如下公式计算得到,其中 L  ⁣ I i , G  ⁣ I i , W  ⁣ I i {L\!I}_i, {G\!I}_i, {W\!I}_i LIi,GIi,WIi为第 i t h i^{th} ith个采样点的指标值。

P s c o r e = S  ⁣ I ⋅ ∑ i = 1 N v ( 0.5 + L  ⁣ I i ⋅ G  ⁣ I i ) ⋅ W  ⁣ I i N v ⋅ ∑ i = 1 N v W  ⁣ I i P_{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} Pscore=SINvi=1NvWIii=1Nv(0.5+LIiGIi)WIi

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

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

S  ⁣ I = { 1 , i f { w E ~ h E ~ w E ~ 2 + h E ~ 2 > 2 2 − 1 w E ~ h E ~ ⩾ 2 / 2 1 − c o s ( θ a r c 2 ) 0 , o t h e r w i s e {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. SI=10,ifwE~2+hE~2 wE~hE~>2 12 wE~hE~ 1cos(2θarc)2 /2,otherwise

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

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

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

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

W ( θ ) = r R R 2 c o s 2 θ + r 2 s i n 2 θ W(\theta) = \dfrac{rR}{R^2cos^2\theta+r^2sin^2\theta} W(θ)=R2cos2θ+r2sin2θrR

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

N v = { 360 , i f   ( w E ~ + h E ~ ) π ⩾ 360 ( w E ~ + h E ~ ) π , o t h e r w i s e N_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. Nv={360(wE~+hE~)π,if (wE~+hE~)π360,otherwise

最终,如果 P s c o r e > T v a l P_{score} > T_{val} Pscore>Tval T v a l T_{val} 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对任意两个弧段的邻接性判断较为简单,后续可以提出一个更强的判断准则,以让矩阵变得更加稀疏有效。椭圆验证也需要加强,最好能够提出一个适合所有情况的验证方法,拟合出一个椭圆,判断其是还是不是,似乎很像深度学习的思路,但是深度学习如何训练,还有速度问题有待考虑,如果能解决验证问题,椭圆准确率会直线上升。

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

  • 10
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值