个人博客 OpenCV实践之MSER仿射匹配算法 已更新讲述MSER仿射匹配算法代码
区域检测(Region Detection)方法是根据图像中具有某种同类性质的像元进行分类(例如相同像素值大小的点),然后把具有相同性质的像元合并成区域,实现区域的检测即图像分割。MSER(Maximally Stable Extremal Regions最大极值区域检测)方法与一般的区域检测方法有所不同:首先MSER检测到的极值区域具有旋转、尺度以及仿射不变的适应能力。其次MSER检测图像中显著性特征区域(最为稳定的区域)。2002年Matas提出MSER算法采用分水岭算法来区域图像中稳定的区域。
MSER算子的主要思想为:设定一系列的阈值参数 ∆ ∆ ∆的范围[0 255]进行分割操作,高于阈值参数∆的图像像素设置为白色,相反低于 ∆ ∆ ∆的设置为黑色。在阈值参数 ∆ ∆ ∆不断改变过程中,会逐渐出现闭合区域。最后,在设置阈值参数 ∆ ∆ ∆的浮动范围内的极值点区域面积变化最小的判定为最大稳定极值区域。由于MSER只能单方面计算最大稳定极值区域,所以Matas提出通过图像反相来求取最小极值稳定区域。
MSER算子公式如下: Q r a t i o ( i ) = ∣ Q i + ∆ − Q i − ∆ ∣ ∣ Q i ∣ Q_{ratio}(i)=\frac{|Q_{i+∆}-Q_{i-∆}|}{|Q_i|} Qratio(i)=∣Qi∣∣Qi+∆−Qi−∆∣
上式参数 Q i Q_i Qi代表阈值为 i i i时连通区域大小, ∆ ∆ ∆为阈值变化系数, Q r a t i o Q_{ratio} Qratio是区域 Q i Q_i Qi在 2 ∆ 2∆ 2∆范围内的变换率。当 Q r a t i o Q_{ratio} Qratio的比率值很小时,可以得出 Q i Q_i Qi在变化范围 2 ∆ 2∆ 2∆为最大稳定极值区域。MSER采取分水岭区域增长算法进行斑块极值轮廓的提取,同时MSER在区域提取阈值参数增长的过程中类似多尺度检测,不同阈值检测出不同的大小结构。由于MSER算法效率较低,2008年David Nister等提出改进MSER算法,借助于改进分水岭算法的理论,加快MSER算法检测效率。
从图1示意图显示MSER算法检测机制区域经过椭圆拟合以后的示意图,最小极值区域参数为100,最大极值区域参数为1000。图1中间显示稳定极大值区域检测,图1右边显示稳定极小值检测。那么上面的MSER检测到的极值区域是如何拟合成为椭圆的?
下面首先介绍一下椭圆一般代数方程求取椭圆长短半轴 ( a , b ) (a,b) (a,b),中心点 ( x c e n t e r , y c e n t e r ) (x_{center},y_{center} ) (xcenter,ycenter),方向角度 θ θ θ的求解公式。假设椭圆一般代数式如下: g ( A , B , C , D , E , F ) = A x 2 + B x y + C y 2 + D x + E y + F g(A,B,C,D,E,F)=Ax^2+Bxy+Cy^2+Dx+Ey+F g(A,B,C,D,E,F)=Ax2+Bxy+Cy2+Dx+Ey+F
首先假设图像 I ( x , y ) I(x,y) I(x,y)经过分水岭算法来检测出极值区域面积为 S S S的 ( p + q ) (p+q) (p+q)阶几何矩公式如下: J u = ∬ s x p y q I ( x , y ) d x d y Ju=\iint_sx^py^qI(x,y){\rm d}x{\rm d}y Ju=∬sxpyqI(x,y)dxdyMSER离散化求取 ( p + q ) (p+q) (p+q)阶几何矩公式为: J u p q = ∑ S x p y q Ju_{pq}=∑_S{x^py^q} Jupq=S∑xpyq求和统计计算在区域 S S S内所有像素值为1的个数。
首先分别求取几何 0 0 0阶矩 m 00 m_{00} m00和水平 m 10 m_{10} m10、垂直 m 01 m_{01} m01方向上的一阶矩,最后计算出区域的重心坐标 ( x c , y c ) (x_c, y_c) (xc,yc)位置。 m 00 = ∑ S I ( x , y ) m_{00}=∑_SI(x,y) m00=S∑I(x,y) m 10 = ∑ S x I ( x , y ) m_{10}=∑_SxI(x,y) m10=S∑xI(x,y) m 01 = ∑ S y I ( x , y ) m_{01}=∑_SyI(x,y) m01=S∑yI(x,y)
重心点坐标 ( x c , y c ) (x_c,y_c) (xc,yc)为: x c = m 10 m 00 x_c=\frac{m_{10}}{m_{00}} xc=m00m10 y c = m 01 m 00 y_c=\frac{m_{01}}{m_{00}} yc=m00m01求取出区域的重心坐标后,将原点移至重心坐标点,计算区域的中心二阶矩 U c U_c Uc: U c = [ u 20 u 11 u 11 u 02 ] U_c=\left[\begin{matrix}{u_{20}}&{u_{11}}\\{u_{11}}&{u_{02}}\end{matrix}\right] Uc=[u20u11u11u02]其中中心二阶矩阵 U c U_c Uc里的参数求取公式为: u 20 = ∑ S ( x − x c ) 2 I ( x , y ) u_{20}=∑_S(x-x_c)^2I(x,y) u20=S∑(x−xc)2I(x,y) u 02 = ∑ S ( y − y c ) 2 I ( x , y ) u_{02}=∑_S(y-y_c)^2I(x,y) u02=S∑(y−yc)2I(x,y) u 11 = ∑ S ( x − x c ) ( y − y c ) I ( x , y ) u_{11}=∑_S(x-x_c)(y-y_c)I(x,y) u11=S∑(x−xc)(y−yc)I(x,y)中心二阶矩 U c U_c Uc参数获取后,计算二阶矩阵的两个特征值 λ 1 λ_1 λ1和 λ 2 λ_2 λ2: λ 1 = ( u 20 + u 02 ) + ( u 20 − u 02 ) 2 + 4 u 11 2 2 λ_1=\frac{(u_{20}+u_{02})+\sqrt{(u_{20}-u_{02})^2+4u^2_{11}}}{2} λ1=2(u20+u02)+(u20−u02)2+4u112 λ 2 = ( u 20 + u 02 ) − ( u 20 − u 02 ) 2 + 4 u 11 2 2 λ_2=\frac{(u_{20}+u_{02})-\sqrt{(u_{20}-u_{02})^2+4u^2_{11}}}{2} λ2=2(u20+u02)−(u20−u02)2+4u112计算出二阶矩的特征值 λ 1 λ_1 λ1和 λ 2 λ_2 λ2后,椭圆的长短半轴 ( a , b ) (a,b) (a,b)和旋转角度 θ θ θ可以轻易获取为: a = λ 1 m 00 a=\sqrt{\frac{λ_1}{m_{00}}} a=m00λ1 b = λ 2 m 00 b=\sqrt{\frac{λ_2}{m_{00}}} b=m00λ2 θ = 1 2 a r c t a n ( 2 u 11 u 20 − u 02 ) θ=\frac{1}{2}arctan(\frac{2u_{11}}{u_{20}-u_{02}}) θ=21arctan(u20−u022u11)求取出椭圆长短半轴及其倾斜角参数后即可画出极值区域拟合的椭圆。
上述详细描述极值区域拟合椭圆的参数求取过程,下面通过一个整体MSER特征匹配算法流程图来进行讲解:
整体MSER局部特征匹配算法流程大致如下:
1 首先通过MSER算法检测极值稳定区域,通过矩理论极值稳定区域的相关拟合椭圆长短轴、角度参数。
2 随后,对椭圆拟合是适当的外扩一定程度的椭圆大小一般外扩3倍左右为了最大程度降低仿射误差信息量,进行方向旋转至水平。
3 对椭圆长半轴进行压缩重采样降低重采样误差进行高斯滤波来降低采样后的数据精度。
4 对重采样后的局部区域进行特征点的描述子提取(无论是梯度差分还是梯度相位等),构建局部描述子。
5 最后,对提取的局部特征描述子进行匹配来求取内联点对,估计变形参数矩阵以此来完成仿射不变特征匹配过程。
先来几幅仿射匹配实验效果图:
MSER特征匹配算法从目前测试结果来看要比Hessian-Affine仿射不变匹配算法性能要差一点,至于原因个人认为可能MSER对于多尺度下估计尺度参数不如Hessian-Affine估计的精准(MSER通过不同阈值参数∆来完成不同区域的大小检测)。这将会导致构建描述子的精确性,具体原因仍需要仔细分析下代码,个人见解如有错误还请多包涵。
http://www.vlfeat.org/overview/mser.html
https://en.wikipedia.org/wiki/Maximally_stable_extremal_regions
http://cmp.felk.cvut.cz/~matas/papers/matas-bmvc02.pdf
http://webdocs.cs.ualberta.ca/~jag/papersVis2/08ECCV/papers/5303/53030183.pdf
<图像局部不变性特征与描述> 王永明 王贵锦 编著