基于像素点特征的Harris角点检测图像拼接(matlab实现)
piccolo,之前做的东西,简单整理下,不是做图像方向的,写的不好轻喷
主要原理参看Harris角点检测原理及实现和Harris角点检测算法优化
下面简单说下:
角点( Corner Points )
1.局部窗口沿各方向移动,均产生明显变化的点。这个变化是多样的,如灰度
2.图像局部曲率突变的点
Harris角点检测
Harris角点检测作为一种典型的角点检测算法,受信号处理中相关函数的启发,给出与自相关函数相联系的矩阵M,M矩阵的特征值是自相关函数的一阶曲率,如果两个曲率值都高,那么就认为该点是角点,此方法对图像旋转、亮度变化、视角变化和噪声的影响具有很好的鲁棒性。
Harris角点检测算法使用了信号处理中的自相关函数的思想,它只涉及图像的一阶导数。先定义矩阵
M = [ I x 2 I x I y I x I y I y 2 ] M=\left[ \begin{array}{ll}{I_{x}^{2}} & {I_{x} I_{y}} \\ {I_{x} I_{y}} & {I_{y}^{2}}\end{array}\right] M=[Ix2IxIyIxIyIy2]
其中,
I
x
I_{x}
Ix——图像?在?方向的梯度
I
y
I_{y}
Iy——图像?在y方向的梯度
G
G
G ——高斯模板
角点响应函数定义为:
C R F = det ( M ) − K × t r 2 ( M ) det ( M ) = λ 1 λ 2 = I x 2 I y 2 − ( I x I y ) 2 tr ( M ) = λ 1 + λ 2 = I x 2 + I y 2 \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} CRF=det(M)−K×tr2(M)det(M)=λ1λ2=Ix2Iy2−(IxIy)2tr(M)=λ1+λ2=Ix2+Iy2
其中,
t
r
tr
tr——矩阵的迹(矩阵对角线的和
K
K
K——经验值,通常
0.04
0.04
0.04~
0.06
0.06
0.06
当某点的角点响应函数值大于设定的阈值T时,判定点改为角点
具体实现(matlab实现部分:基于像素点特征的Harris角点检测图像拼接算法)
上述情况是在经验值K取得比较合适的时候拼接的,下图是经验值k取得太大导致的拼接失败,所以harris角点检测的K值选取比较关键。同时,写的比较简单,这个性能也并不好。
经验值K 的选取会影响特征点提取的可靠性和准确性,针对不同的图片,K 值的选取会有不同。同时,阈值T难以确定,T值过大,则提取的特征点数目过少,丢失的信息过多,影响匹配的准确性;T值过小,则判定的特征点过多,增加了匹配的计算量且降低了准确率。即使阂值T大小合适,但针对不同类型的图片,图像纹理和结构特征相差很大,都会导致合适的阈值T也相差很多,难以自动选取。
下面是一种改进的角点响应函数CRF,无需选择K值,能有效避免K 值选取的随机性,具有实用性,可靠性好。
CRF = tr ( M ) det ( M ) + ξ ξ = 1 × 1 0 − 6 \operatorname{CRF}=\frac{\operatorname{tr}(M)}{\operatorname{det}(M)+\xi} \quad \xi=1 \times 10^{-6} CRF=det(M)+ξtr(M)ξ=1×10−6