论文阅读——椭圆检测 2017:Effective ellipse detection method in limited-performance embedded system
这篇论文全名叫Effective ellipse detection method in limited-performance embedded system for aerospace application,一种适用于航天应用的高性能嵌入式椭圆检测方法。这篇论文发表在Advances in Mechanical Engineering 是4区的SCI。这篇论文主要是将椭圆检测应用于航天,针对航天问题专门做的椭圆检测,下面对其进行进一步分析。
这次阅读,主要是分析其与传统方法不一样的地方,即分析这篇论文针对航天部分主要改进了那些地方,其他常见的方法不具体细说,查阅之前论文即可读明白
航天问题主要难点是:受限的计算性能和内存资源,这篇论文在保证精度和速度的前提下解决这个问题。
论文使用了FPGA A3PE1500-FG676 Actel和DSP TMS320C6672 TI结合着实现了这个算法,这个算法与之前一样,是基于边缘连接的方法。
文章目录
- 1 边缘轮廓的提取
- 2 弧段分割与组合
- 分割部分
- 组合部分
- 3 椭圆提取
- 4 实验参数及结果等
- (1) 参数设置
- (2)检测结果
- 总结
1 边缘轮廓的提取
这部分主要是检测边缘,提取边缘线。与传统方法不同的是,这里用了加速边缘提取的方法,如果嵌入式需要加速,直接阅读其论文即可,这里仅仅是加速,因此不细致分析了(有需要应用嵌入式加速的话在评论区告诉我,我会给补上,方法不是很难)。
在复现时候,建议使用matlab里的canny进行边缘提取,有两点好处,第一,噪声少,第二,sobel梯度平滑,不会有太多的噪声。
提取的边缘满足两个性质:
- 边缘段个数大于阈值Th1Th_1Th1
- 弧段中点到其首尾连成的直线的距离应该大于阈值Th2Th_2Th2,防止其为直线。
2 弧段分割与组合
分割部分
这部分与传统方法不同的是,这里没有利用多边形逼近算法来近似其曲率信息,其使用sobel角度变换程度来判断分割点。
e3=(p1,p2,..,pn)e^3 = (p_1,p_2,..,p_n)e3=(p1,p2,..,pn)为提取出的一条边缘点,θ=(θ1,θ2,...,θn)\theta = (\theta_1,\theta_2,...,\theta_n)θ=(θ1,θ2,...,θn)为期对应的sobel梯度。G=(g1,g2,..,gn)G=(g_1,g_2,..,g_n)G=(g1,g2,..,gn)为对应的梯度变化率,其计算方式为gi=θi+1−θig_i = \theta_{i+1}-\theta_{i}gi=θi+1−θi。
值得注意的是,在这里计算gig_igi没有完全写清楚,在相减之后,一定要将梯度再进行角度处理,防止出现大于180°的角度变量量。
每个弧段的极大值S=(s1,s2,...,sn−1)S=(s_1,s_2,...,s_{n-1})S=(s1,s2,...,sn−1)计算方式如下所示:
si={1(gi>gi−1andgi>gi+1)and∣gi−gi−1∣>Th30otherwises_i = \left\{\begin{array}{ll}1 & (g_i>g_{i-1} ~and ~g_i>g_{i+1}) ~and~|g_i-g_{i-1}|>Th_3\\ 0 & otherwise \end{array}\right.si={10(gi>gi−1 and gi>gi+1) and ∣gi−gi−1∣>Th3otherwise
组合部分
分割出来的弧段仍然需要满足上述提取边缘时候给出的两个准则,即个数大于阈值Th1Th_1Th1,中点到起始点对应的直线的距离小于Th2Th_2Th2。两个弧段是否可以组合需要需要满足三个条件,这些条件将会在下一节进行说明(我怎么感觉这个论文的结构有问题,(/ω\))。
3 椭圆提取
任意两个弧段组合需要满足三个条件。
条件1: 条件1的说明可以具体看下面这张图,针对于航天目标来说,很少出现同一个椭圆其梯度差异很大的情况,因此作者认为两个弧段的组合其梯度应具有相似性。这也是与常规方法不同的地方。
对于一个弧段ei4e^4_iei4,设其首尾点,弧段中点为p1,pn,pn/2p_1,p_n,p_{n/2}p1,pn,pn/2。从p1,pnp_1,p_np1,pn中点到pn/2p_{n/2}pn/2构成向量vvv,同时在点pn/2p_{n/2}pn/2处的梯度为θn/2\theta_{n/2}θn/2,那么这个弧段按照如下公式进行标记。
Dei4={−if3π2>∣θv−θn/2∣>π2+otherwiseD_{e^4_i}=\left\{\begin{array}{ll} - & if ~ \dfrac{3\pi}{2}>|\theta_{v}-\theta_{n/2}|>\dfrac{\pi}{2}\\ + & otherwise \end{array}\right.Dei4={−+if 23π>∣θv−θn/2∣>2πotherwise
如果两个边缘弧段li4,lj4l^4_i,l^4_jli4,lj4可以组合,那么其应满足Dli4Dlj4>0D_{l^4_i}D_{l^4_j}>0Dli4Dlj4>0,否则不能组合。
条件2: 这个条件主要是判断两个弧段的位置关系,对于弧段eie_iei,根据其首尾点可以计算出一条直线li:f(x)=ax+by+c=0,a⩾0l_i:f(x) = ax+by+c = 0,a\geqslant 0li:f(x)=ax+by+c=0,a⩾0。
先计算弧段iii的凹凸性,根据弧段iii的中点pn/2p_{n/2}pn/2带入f(x)f(x)f(x),根据其符号,记录RlieiR^{e_i}_{l_i}Rliei,同理RljejR^{e_j}_{l_j}Rljej为一样的含义。
Rliei={+iff(pn/2)>0−otherwiseR^{e_i}_{l_i}=\left\{\begin{array}{ll}+ & if ~ f(p_{n/2})>0 \\ - & otherwise\end{array}\right.Rliei={+−if f(pn/2)>0otherwise
其次是要计算RljeiR^{e_i}_{l_j}Rljei,这个表示弧段jjj与直线的关系(这里RljeiR^{e_i}_{l_j}Rljei我认为默认为0,毕竟下面这个公式有阈值覆盖不到的区域)。统计在弧段eje_jej上所有的点pjp_jpj,fpj⩾0f_{p_j} \geqslant 0fpj⩾0的个数Fi+F^+_iFi+,同理得到fpj<0f_{p_j} < 0fpj<0的个数Fi−F^-_iFi−。然后根据下面这个公式来计算:
Rliej={+ifFi−Fi+<Th4−ifFi+Fi−<Th4R^{e_j}_{l_i}=\left\{\begin{array}{ll}+ & if ~ \dfrac{F^-_i}{F^+_i}<Th_4\\ - & if~ \dfrac{F^+_i}{F^-_i}<Th_4\end{array}\right.Rliej=⎩⎪⎪⎨⎪⎪⎧+−if Fi+Fi−<Th4if Fi−Fi+<Th4
这样,如果RlieiRliej<0andRljeiRljej<0R^{e_i}_{l_i}R^{e_j}_{l_i}<0 ~and~ R^{e_i}_{l_j}R^{e_j}_{l_j}<0RlieiRliej<0 and RljeiRljej<0,则可以认为这两个弧段可以组合,否则无法组合。
其实这样是有瑕疵的,因为对于情况,Th4<Fi−Fi+<1Th4Th_4<\dfrac{F^-_i}{F^+_i}<\dfrac{1}{Th_4}Th4<Fi+Fi−<Th41是没有标记结果的,为了完整起见,对这种情况,我自己补充标记为0
条件3: 对这两个弧段进行拟合,拟合误差按照如下定义:
err=1−nNerr=1-\dfrac{n}{N}err=1−Nn
这里的support定义不是很明确,个人理解就是NNN为这两个弧段参与拟合的个数,nnn参与拟合的像素中,在拟合出椭圆上的个数。如果err<Th5err<Th_5err<Th5,则认为这个组合有效,否则无效。
那么如何判定当前像素点是否在椭圆上,作者并没有给出,我阅读其参考的文献,其参考的《Edge curvature and convexity based ellipse detection method》给出了判断像素点是否在椭圆上的准则,即,ddd为像素点到椭圆的距离,如果d<d0,d0=2d<d_0,d_0=2d<d0,d0=2,那么认为这个像素点在椭圆上。在论文《Fitting Multiple Connected Ellipses to an Image Silhouette Hierarchically》中,作者给出了一种计算点到椭圆距离的一种方法。给定一个椭圆,其中心点为(0,0)(0,0)(0,0),旋转角为0,定义测试点为(xi,yi)(x_i,y_i)(xi,yi)。(对于那些检测出来的任意椭圆,可以经过旋转平移得到当前准则下的椭圆)
d(ellipse,(xi,yi))={d1,if(xi,yi)isinsideofellipsed2,if(xi,yi)isoutsideofellipsed(ellipse, (x_i,y_i)) = \left\{\begin{array}{ll}d_1, & if~(x_i,y_i)~is~inside~of~ellipse\\d_2, & if~(x_i,y_i)~is~outside~of~ellipse \end{array}\right.d(ellipse,(xi,yi))={d1,d2,if (xi,yi) is inside of ellipseif (xi,yi) is outside of ellipse
其中d1,d2d_1,d_2d1,d2的定义如下所示,rrr为椭圆的半短轴。
d1(xi,yi)=r(1−(xia)2+(yib)2)d_1(x_i,y_i) = r\left(1-\sqrt{\left(\dfrac{x_i}{a}\right)^2 + \left(\dfrac{y_i}{b}\right)^2}\right)d1(xi,yi)=r(1−(axi)2+(byi)2)
d2(xi,yi)=xi2+yi2(1−1(xia)2+(yib)2)d_2(x_i,y_i)=\sqrt{x_i^2+y_i^2}\left(1-\dfrac{1}{\sqrt{\left(\dfrac{x_i}{a}\right)^2 + \left(\dfrac{y_i}{b}\right)^2}}\right)d2(xi,yi)=xi2+yi2⎝⎜⎜⎛1−(axi)2+(byi)21⎠⎟⎟⎞
下面给出这个计算方法的Matlab代码,其实经过实验表明这个公式几乎等价为采样点与椭圆中心点连线与椭圆的交点与这个采样点的距离。后期有空对其进行推导,这里的椭圆旋转角为逆时针旋转。(这里转成C++也很容易,有需要我再放上C++代码)
clc;clear;close all;
% 计算点到椭圆的近似最小距离% 中心点,长短轴,旋转角
elp = [0,0,200,100,pi/3];
test_p = [135,100];% 对向量进行旋转,使其满足椭圆旋转角为0
v = test_p - elp(1:2);
a = elp(3); b = elp(4); theta = elp(5);
R = [cos(theta), -sin(theta); sin(theta), cos(theta)]; % P* = R * P逆时针变换矩阵
origin_p = v * R;inOrout = 0; % 0 点在椭圆内,1在外
err = origin_p(1)^2/a^2 + origin_p(2)^2/b^2;
if err > 1inOrout = 1;
endif inOrout == 1dist = norm(v) * (1 - 1/sqrt(err));
elsedist = b * (1 - sqrt(err));
end
下图是在E4E^4E4中组合属于同一个椭圆的边缘段,这里E4E^4E4分割后得到的候选椭圆边缘弧段。思想理解起来就是先将一个弧段eie_iei放进SαS_\alphaSα,然后判断其他所有的弧段是否可以与SαS_\alphaSα组合,如果可以组合,那就放进去,如此循环,最后得到一个SαS_\alphaSα。
重要关注: 在这个算法里面,(Sα,ej)satisfypairgroupingstrategy(S_\alpha,e_j) ~~satisfy ~~pair ~~grouping ~~strategy(Sα,ej) satisfy pair grouping strategy说的非常模糊,个人认为应该是验证eje_jej与SαS_\alphaSα里面每个弧段均两两验证是否满足pair gouping strategy,而不是将SαS_\alphaSα看做是一个弧段,如果这样的话,条件1,条件2很难实现,而且弧段顺序问题很难解决。更关键的是,论文后面还有句话,最终,对每个Si5S^5_iSi5可以使用最小二乘拟合得到最终结果,如果真是把SαS_\alphaSα看成一个轮廓的话,直接在算法里面就可以得到最终结果,无需finally。
所以,这样存在一个问题:假设Sα={s1,s2}S_\alpha=\{s_1,s_2\}Sα={s1,s2},验证s3s_3s3是否在SαS_\alphaSα里面,有可能出现,s1,s3s_1,s_3s1,s3满足条件,s2,s3s_2,s_3s2,s3满足条件,但是s1,s2,s3s_1,s_2,s_3s1,s2,s3拟合后误差会很大。 这可能也是这个论文的缺点吧。而且,对于没有组合的弧段是如何处理的并没有说,这个我会在后期复现时候解决。
4 实验参数及结果等
作者一共使用了2个数据集,一个为Prasad数据集,另一个是自己做的模型数据集。
(1) 参数设置
Th1Th_1Th1:曲线最短长度,数据集1设置为32,第二个设置为10.
Th2Th_2Th2:判定弧段是否为直线阈值,设置为2
Th3Th_3Th3:梯度变化率,设置为10°
Th4Th_4Th4:条件2阈值,设置为0.1
Th5Th_5Th5:拟合误差阈值,设置为0.05.
(2)检测结果
从结果上看效果不错,后续会对其进行进一步分析。
总结
从结果上看,论文效果不错,用了很简单的方法做了椭圆检测,目前在组合时候对椭圆的最终处理我目前存有疑问,论文没说清楚,我会在这两天对其进行复现,对其细节进行更加细致的分析。