基于像素点特征的Harris角点检测图像拼接(matlab实现)

基于像素点特征的Harris角点检测图像拼接(matlab实现)

piccolo,之前做的东西,简单整理下,不是做图像方向的,写的不好轻喷
主要原理参看Harris角点检测原理及实现Harris角点检测算法优化
下面简单说下:

角点( Corner Points )

1.局部窗口沿各方向移动,均产生明显变化的点。这个变化是多样的,如灰度
2.图像局部曲率突变的点

Harris角点检测

Harris角点检测作为一种典型的角点检测算法,受信号处理中相关函数的启发,给出与自相关函数相联系的矩阵M,M矩阵的特征值是自相关函数的一阶曲率,如果两个曲率值都高,那么就认为该点是角点,此方法对图像旋转、亮度变化、视角变化和噪声的影响具有很好的鲁棒性。

Harris角点检测算法使用了信号处理中的自相关函数的思想,它只涉及图像的一阶导数。先定义矩阵

M=[Ix2IxIyIxIyIy2]M=\left[ \begin{array}{ll}{I_{x}^{2}} & {I_{x} I_{y}} \\ {I_{x} I_{y}} & {I_{y}^{2}}\end{array}\right]

其中,
IxI_{x}——图像????在????方向的梯度
IyI_{y}——图像????在y方向的梯度
GG ——高斯模板

角点响应函数定义为:

CRF=det(M)K×tr2(M)det(M)=λ1λ2=Ix2Iy2(IxIy)2tr(M)=λ1+λ2=Ix2+Iy2\begin{array}{c}{C R F=\operatorname{det}(M)-K \times t r^{2}(M)} \\ {\operatorname{det}(M)=\lambda_{1} \lambda_{2}=I_{x}^{2} I_{y}^{2}-\left(I_{x} I_{y}\right)^{2}} \\ {\operatorname{tr}(M)=\lambda_{1}+\lambda_{2}=I_{x}^{2}+I_{y}^{2}}\end{array}

其中,
trtr——矩阵的迹(矩阵对角线的和KK——经验值,通常0.040.04~0.060.06

当某点的角点响应函数值大于设定的阈值T时,判定点改为角点

具体实现(matlab实现部分:基于像素点特征的Harris角点检测图像拼接算法)

基于像素点特征的Harris角点检测图像拼接(matlab实现)

基于像素点特征的Harris角点检测图像拼接(matlab实现)

基于像素点特征的Harris角点检测图像拼接(matlab实现)
上述情况是在经验值K取得比较合适的时候拼接的,下图是经验值k取得太大导致的拼接失败,所以harris角点检测的K值选取比较关键。同时,写的比较简单,这个性能也并不好。
基于像素点特征的Harris角点检测图像拼接(matlab实现)

经验值K 的选取会影响特征点提取的可靠性和准确性,针对不同的图片,K 值的选取会有不同。同时,阈值T难以确定,T值过大,则提取的特征点数目过少,丢失的信息过多,影响匹配的准确性;T值过小,则判定的特征点过多,增加了匹配的计算量且降低了准确率。即使阂值T大小合适,但针对不同类型的图片,图像纹理和结构特征相差很大,都会导致合适的阈值T也相差很多,难以自动选取。

下面是一种改进的角点响应函数CRF,无需选择K值,能有效避免K 值选取的随机性,具有实用性,可靠性好。

CRF=tr(M)det(M)+ξξ=1×106\operatorname{CRF}=\frac{\operatorname{tr}(M)}{\operatorname{det}(M)+\xi} \quad \xi=1 \times 10^{-6}