计算机视觉大型攻略 —— 特征与匹配(1)Harris角点检测

这几篇文章开始写图像特征和匹配相关的内容。

参考书籍:Computer Vision: Algorithms and Applications, Richard Szeliski 

特征点检测和匹配是计算机视觉应用的重要组成部分,以解决寻找一张图像上的点,在另一张图像上的位置的问题。应用于图像拼接,SLAM,3D重建等算法。通常特征点匹配可分为三个过程,特征点检测,定义特征描述符,特征匹配。

参考文献

[1] Obstacle Avoidance and Navigation in the Real World by aSeeing Robot Rover

[2] A COMBINED CORNER AND EDGE DETECTOR

特征点检测

特征点检测要解决的问题就是在图像上寻找有价值的点用于匹配。很容易想到的是,如果从白墙上找一个点,由于他没有什么显著特征,很难在其他图片上找到他的对应点。相反的,如果一个点有独一无二的特征,那么再找到这个点的机会就很大。这些点通常被称作角点(corner)。

文献[1]给出了寻找这些角点的方法——定义一个窗口,任意方向小幅度滑动该窗口,如果亮度的变化大,那么角点就在其中。

上图给出了常见的三种情况。

  • "flat"。该窗口在任何方向上滑动,光强变化不大。
  • "edge"。在沿某个角度(与边平行)滑动的时候,光强变化不大。
  • "coner"。沿任意方向滑动,光强变化明显。

如上图,通常我们会定义一个窗口,在窗口内计算x方向和y方向的梯度Ix, Iy。

考虑上面所说的三种情况,flat, edge, corner. 下图可以看出Ix, Iy的相应分布。

数学模型

下面需要定量分析上面梯度的分布情况。

                                             

假设窗口W,滑动距离为(u, v),定义一个SSD"误差"E(u, v),我们要寻找的就是能使E(u,v)在各个方向都尽量大的窗口。

                                    E(u,v) = \sum _{(x,y)\in W} w(x,y)\left [ I(x+u,y+v)-I(x,y) \right ]^{2}

I(x, y)为原始窗口的光强,I(x+u, y+v)为移动后的光强。w(x,y)是窗口权重函数。

                                      

由于w(x,y)独立于后面的推导,后面的公式方便起见把他省略掉了。

I(x+u, y+v)泰勒展开,

                                   I(x+u, y+v) = I(x,y)+\frac{\partial I}{\partial x}u+\frac{\partial I}{\partial y}v+[high\: order \: terms]

当(u, v)是小运动时,可约等于一阶部分。

                                   I(x+u, y+v) \approx I(x,y)+\frac{\partial I}{\partial x}u+\frac{\partial I}{\partial y}v \approx I(x,y)+\begin{bmatrix} I_{x} & I_{y} \end{bmatrix}\begin{bmatrix} u\\v \end{bmatrix}

                                 其中,  I_{x} = \frac{\partial I}{\partial x}, I_{y} = \frac{\partial I}{\partial y},

代入Error函数E(u,v),

                                                   

进一步展开,发现E(u,v)是一个二次误差函数,

                                                 

                                               

写成矩阵的形式

                                              

用几何图形表示二次型,

                                        

flat, edge, corner的二次型图形表示如下,可以看到coner的形状,E(u,v)在各个方向上的值均较大,

                                           

只考虑E(u, v)的一个切面,即令,

                                  \begin{bmatrix} u &v \end{bmatrix} M \begin{bmatrix} u\\v \end{bmatrix} = const                   

可以看到该公式的几何表示是一个椭圆。注意到M是对称阵,将M三角化,

                                

\lambda _{1},\lambda _{2}是M的特征值,R由特征向量构成,\lambda _{1},\lambda _{2}分别表示了两个轴方向的变化。

                                          

\lambda _{1},\lambda _{2}与flat, edge, corner的关系如下图。

  • flat: \lambda _{1},\lambda _{2}值很小且相等,意味着E(u, v)在各个方向上都很小。
  • edge: \lambda _{1}\lambda _{2}差异大,即上图切面为压得很扁的椭圆,此时E(u,v)在某一个方向上的变化很小。
  • corner:  \lambda _{1},\lambda _{2}值很大且相等,E(u, v)在各个方向上都很大。

                                

清楚了\lambda _{1},\lambda _{2}与E(u, v)的关系后,需要定义一个响应函数来评估一个点是否是角点。

[2]Harris88的提出的响应函数,

                                C = \lambda _{1}\lambda _{2}-\alpha (\lambda _{1}+\lambda _{2})^{2}

其中α是常量,取0.04到0.06之间的值。 这种情况下,如下图 所示,                                                                                                                                     

  • flat: C的绝对值小于某个门槛。
  • edge: C<0。
  • corner: C>0,且C大于某个门槛。

                               

由线性代数的"不难证明"可知,特征值的和等于矩阵对角线元素之和(矩阵的迹),特征值的乘积等于矩阵的行列式,上面的响应函数C还可以写成,

                                C=det(M)-\alpha \: trace(M)^2

这样的话计算C就无需计算矩阵M的特征值了。                  

算法步骤

  1. 计算图像导数Ix, Iy,
  2. 计算I_{x}^{2}, I_{y}^{2},I_{x}I_{y}
  3. I_{x}^{2}, I_{y}^{2},I_{x}I_{y}施加一个宽度为α的高斯滤波(窗口权重函数)。
  4. 计算C。                                                                                                                                                                                                                    C=det(M)-\alpha\: trace(M)^{2}=g(I_{x}^{2})g(I_{y}^{2})-g(I_{x}I_{y})^{2}-\alpha[g(I_{x}^{2})+g(I_{y}^{2})]^{2}
  5. 通过一个门槛找出C值较高的点。
  6. 用Non-maxima suppression算法找出极值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值