Harris 角点检测算法编程步骤及示例演示 也不说那么多废话了,要介绍啥背景意义之类的,角点检测,顾名思义,就是检测角点,最简单的就是两条线的交点了,还有比如下国际象棋的棋盘格子的交点之类的,反正就是检测这些点。 简单将 Harris 角点检测算法的思想说下,就是拿一个小窗在图像中移动,通过考察这个小窗口内图像灰度的平均变换值来确定角点。 (1)如果窗口内区域图像的灰度值恒定,那么所有不同方向的偏移几乎不发生变化; (2)如果窗口跨越一条边,那么沿着这条边的偏移几乎不发生变化, 但是与边垂直的偏移会发生很大的变化; (3)如果窗口包含一个孤立的点或者角点,那么所有不同方向的偏移会发生很大的变化。 下面给出具体数学推导: 设图像窗口平移量为(u,v),产生的灰度变化为E(u,v), 有E(u,v)=sum[w(x,y)[I(x+u,y+v)-I(x,y)]^2],其中 w(x,y)为窗口函数,I(x+u,y+v)为平移后的灰度值,I(x,y)为平移前的灰度值。 有泰勒公式展开可得: I(x+u,y+v)=I(x,y)+Ix*u+Iy*v+O(u^2,v^2); Ix,Iy 分别为偏微分,在图像中为图像的方向导数. 因此E(u,v)=sum[w(x,y) [Ix*u+Iy*v+O(u^2,v^2)]^2], 可以近 似 得到 E(u,v)=sum[w(x,y) [Ix*u+Iy*v]^2],即 E(u,v)=[u,v][Ix^2,Ix*Iy;Ix*Iy,Iy^2][u,v]T 令M=[Ix^2,Ix*Iy;Ix*Iy,Iy^2],因此最后对角点的检测成了对矩阵M 的特征值的分析了,令M 其特征值为x1,x2; 当x1>>x2 或者x2>>x1,则检测到的是边缘部分; 当x1,x2 都很小,图像窗口在所有移动的方向上移动灰度级都无明显变化. 当X1,X2 都很大时且相当,检测到的是角点。 编程时用 x1,x2 不方便,因此定义角点响应函数; R=det(M)-k(trace(M))^2; 其中 det(M)为矩阵M 的行列式,trace(M)为矩阵M 的迹。 下面给出更具数学公式实际编程的步骤: 1.利用水平,竖直差分算子对图像的每个像素进行滤波以求得Ix,Iy,进而求得 M 中的四个元素的值。 M=[Ix^2,Ix*Iy;Ix*Iy,Iy^2] 2.对M 的四个元素进行高斯平滑滤波,为的是消除一些不必要的孤立点和凸起,得到新的矩阵M。 3.接下来利用 M 计算对应每个像素的角点响应函数 R,即: R=det(M)-k(trace(M))^2; 也可以使用改进的R: R=[Ix^2*Iy^2-(Ix*Iy)^2]/(Ix^2+Iy^2);里面没有随意给定的参数 k,取值应当比第一个令人满意。 4.在矩阵R 中,同时满足 R(i,j)大于一定阈值threshold 和 R(i,j)是某领域内的局部极大值,则被认为是角点。 下面给出程序代...