这是一篇基于边缘连接方法的椭圆检测算法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=1−cos(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}\}
{Ak∣k=1,2,...Nd},令
v
k
=
A
k
−
A
k
−
1
\textbf{v}_k = \textbf{A}_k - \textbf{A}_{k-1}
vk=Ak−Ak−1,所有成对的逼近线段之间的角度为
{
θ
i
∣
i
=
2
,
.
.
,
N
d
−
1
,
θ
i
∈
(
−
π
,
π
)
}
\{\theta_i|i=2,..,N_d-1, \theta_i\in(-\pi,\pi)\}
{θi∣i=2,..,Nd−1,θ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/λarc⩽∣vi+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.
⎩⎪⎪⎨⎪⎪⎧η=∣vk∣2[vk⋅vk+1,svk×vk+1]T[tp]=[10−cotθ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} Ak−1, 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} A−i(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)−A−1(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} A−1(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} A−1(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~(np−1),...,A~(n1),A~(r),A~(m1),...,A~(mq−1),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,ni−1=1,Lmj−1,mj=1,Lk,g=−1,∀ni∈Φr−∀mj∈Φ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~mi→A~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. {Lmj−1,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,ni−1=1,∀ni∈Φr−Lnk,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=Np⋅Na个双向组合。 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 a1→N=[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=a1→NTa1→N=∑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=1∑Nfxi,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=SI⋅Nv⋅i=1∑NvWIii=1∑Nv(0.5+LIi⋅GIi)⋅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,if⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧wE~2+hE~2wE~hE~>2−12wE~hE~⩾1−cos(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对任意两个弧段的邻接性判断较为简单,后续可以提出一个更强的判断准则,以让矩阵变得更加稀疏有效。椭圆验证也需要加强,最好能够提出一个适合所有情况的验证方法,拟合出一个椭圆,判断其是还是不是,似乎很像深度学习的思路,但是深度学习如何训练,还有速度问题有待考虑,如果能解决验证问题,椭圆准确率会直线上升。
这个论文我觉得讲的还不是很清晰,但各位有不明白的地方或者有独特见解的欢迎讨论。