Harris角点检测算法

一,角点

  角点还没有明确的数学定义。
  一般的角点检测都是对有具体定义的、或者是能够具体检测出来的兴趣点的检测。这意味着兴趣点可以是角点,也可以是在某些属性上强度最大或者最小的孤立点、线段的终点,或者是曲线上局部曲率最大的点。在实践中,通常大部分称为角点检测的方法检测的都是兴趣点,而不是独有的角点。因此,如果只要检测角点的话,需要对检测出来的兴趣点进行局部检测,以确定出哪些是真正的角点。
  目前的角点检测算法可归纳为3类:基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。对灰度图像、二值图像、边缘轮廓曲线的角点检测算法进行综述,分析了相关的算法,并对各种检测算法给出了评价。
二,Harris算法
  Harris角点提取算法:Harris 角点提取算法是Chris Harris 和Mike Stephens 在H.Moravec 算法的基础上发展出的通过自相关矩阵的角点提取算法,又称Plessey算法。Harris角点提取算法这种算子受信号处理中自相关面数的启发,给出与自相关函数相联系的矩阵M。M 阵的特征值是自相关函数的一阶曲率,如果两个曲率值都高,那么就认为该点是角点特征。

  算法流程

  • 1.利用水平,竖直差分算子对图像的每个像素进行滤波以求得Ix,Iy,进而求得M中的四个元素的值。

    代码中如果窗口数组array为-1,0,1,-1,0,1,-1,0,1}则是求解X方向的,如果为{-1,-1,-1,0,0,0,1,1,1}为Y方向的,则Ix和Iy求解结束,求解IX2相对比较简单,像素相乘即可。

  • 2.对M的四个元素进行高斯平滑滤波,为的是消除一些不必要的孤立点和凸起,得到新的矩阵M。
  • 3.3.接下来利用M计算对应每个像素的角点响应函数R,即:
  • 4、局部极大值抑制,同时选取其极大值
  • 5.在矩阵R中,同时满足R(i,j)大于一定阈值threshold和R(i,j)是某领域内的局部极大值,则被认为是角点

三,代码

 1 from pylab import *
 2 from PIL import Image
 3 from PCV.localdescriptors import harris
 4 """
 5 Example of detecting Harris corner points (Figure 2-1 in the book).
 6 """
 7 # 读入图像
 8 im = array(Image.open(r'b3.jpg').convert('L'))
 9 # 检测harris角点
10 harrisim = harris.compute_harris_response(im)
11 # Harris响应函数
12 harrisim1 = 255 - harrisim
13 figure()
14 gray()
15 #画出Harris响应图
16 subplot(141)
17 imshow(harrisim1)
18 print (harrisim1.shape)
19 axis('off')
20 axis('equal')
21 threshold = [0.01, 0.05, 0.1]
22 for i, thres in enumerate(threshold):
23     filtered_coords = harris.get_harris_points(harrisim, 6, thres)
24     subplot(1, 4, i+2)
25     imshow(im)
26     print (im.shape)
27     plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
28     axis('off')
29 show()

四,运行结果

 4.1纹理平坦的图

   4.1.1正面

   

   4.1.2侧面

   

   4.1.3旋转

   

   4.1.4相对较远处

   

    4.1.5较亮情况

   

 4.2垂直或水平边缘多

    4.2.1正面

   

    4.2.2侧面

   

   4.2.3旋转

   

    4.2.4相对较远处

   

 4.3纹理角点丰富

     4.3.1正面

  

     4.3.2侧面

   

   4.3.3旋转

   

   4.3.4相对较远处

    

五,结论以及实验中遇到的问题

 5.1实验结果分析

1. Harris角点具有旋转不变性。

Harris角点检测通过窗口对应的二阶矩阵的特征值得到角点响应值R,从而判断角点。当图像转动时,角点区域的像素点梯度坐标和拟合椭圆对应地发生旋转,但是矩阵的特征值(也可以理解为数据点区域的拟合椭圆)不变,因此图像旋转不影响角点的检测。

2. Harris角点检测算子对亮度和对比度的变化不灵敏
  这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,阈值的选择可能会影响角点检测的结果。

3. Harris角点检测算子不具有尺度不变性

当图像被缩小或放大时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的,角点检测的性能也会发生改变。

 5.2实验中遇到的问题

  PCV,是一个很老的包了,从下载地址:https://github.com/jesolem/PCV (原链接,适用于python2),但在python3的时代里已不适用。需要将原文件里的多个print语句改写成python3的形式才能正常安装。

posted @ 2020-02-25 21:32  cenyan  阅读(4555)  评论(0编辑  收藏  举报