图像局部描述符-Harris角点检测
Harris角点检测
图像特征类型
图像特征类型可以分为三种:
角点是个很特殊的存在。它们在图像中可以轻易定位,同时它们在人造物体中场景中,如门窗,桌子等中随处可见。因为角点位于两条边缘的交点处,代表了两个边缘变化的方向上的点,所以它们是可以精确定位的二维特征,甚至可以达到亚像素的精度。且其图像梯度有很高的变化,这种变化是可以用来帮助检测角点的。需要注意的是,角点与位于相同强度区域上的点不同,与物体轮廓上的点也不同,因为轮廓点难以在相同的其他物体上精确定位
角点的定义
‘如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点’
关于角点的具体描述可以有几种:
1、一阶导数(即灰度的梯度)的局部最大所对应的像素点
2、两条及两条以上边缘的点
3、图像中的梯度值和梯度方向的变化速率都很高的点
4、角点处的一阶导数最大,二阶导数为0,指示物体边缘变化不连续的方向
角点特征
- 轮廓之间的交点。
- 对于同一场景,即使视角发生变化,通常具备稳定性质的特征。
- 该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化。
- 角点处的一阶导数最大,二阶导数为0。
- 角点指示了物体边缘变化不连续的方向。
Harris角点算法
算法思想
harris角点检测实例代码
# -*- coding: utf-8 -*- from pylab import * from PIL import Image from PCV.localdescriptors import harris """ Example of detecting Harris corner points (Figure 2-1 in the book). """ # 读入图像 im = array(Image.open('../data/empire.jpg').convert('L')) # 检测harris角点 harrisim = harris.compute_harris_response(im) # Harris响应函数 harrisim1 = 255 - harrisim figure() gray() #画出Harris响应图 subplot(141) imshow(harrisim1) print harrisim1.shape axis('off') axis('equal') threshold = [0.01, 0.05, 0.1] for i, thres in enumerate(threshold): filtered_coords = harris.get_harris_points(harrisim, 6, thres) subplot(1, 4, i+2) imshow(im) print im.shape plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*') axis('off') #原书采用的PCV中PCV harris模块 #harris.plot_harris_points(im, filtered_coords) # plot only 200 strongest # harris.plot_harris_points(im, filtered_coords[:200]) show()
测试场景1-奖杯(边缘丰富区域)
原图
正面图片
侧面图片
稍近距离图片
照明情况下图片
threshold = [0.01, 0.05, 0.1]
随着 α的值增大,角点检测的数量随之减少,也就是角点的检测灵敏度降低了。
同一事物的不同角度也会影响角点的检测,比如侧面的照片在α值为0.1的情况下仍然在奖杯的底部检测到了大量的角点,相较于正面图片的检测数量增加了很多,我觉得这是因为侧面图片让本来从正面看不明显的边缘显得更加立体明显,从而导致即使α的值很大,仍然能够检测到大量的角点。
照明条件更好的一组中,角点检测数量并没有和没有照明的一组出现太大的差别,这是因为Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会一定程度影响角点检测的数量
测试场景2-墙面开关(平坦区域)
正面图片
侧面图片
旋转图片
近距离图片
光照图片
针对平坦区域,角点检测的效果不是很好,大面积的平面也别检测成角点,也有可能是因为我拍的墙面有很多凸起,凹凸不平,导致出现大量的角点,开关位置的角点在侧面照片中,左下角和右上角的角点检测明显更优于正面中的效果,侧面的图片在平坦区域中更能体现出角点的位置。
在近距离拍摄的照片中,角点的检测相较于正常距离拍摄的图片更易检测出角点,数量和位置也更精确,可能是因为像素的提高吧。
测试场景3-马路(角点丰富区域)
正面图片
侧面图片
旋转图片
稍远距离图片
对于这种细节多的图片,角点检测的数量很多,即使α的值设置到了0.1仍然能检测出很多角点。
Harris角点检测算法具有旋转不变性,即椭圆转过一定角度但是其形状保持不变(特征值保持不变),所以可以发现,当同一街景旋转一定角度拍摄的图片,角点检测的位置数量都是相近的,并没有因为旋转后判定两张图片不是同一事物。
因为Harris角点检测算法提取的角点是像素级的,所以当我把照片放大或者缩小拍摄的时候,像素发生了改变,使得检测出的角点位置和数量也发生了变化。
总结
每个像素的Harris响应值R
对每一个窗口计算得到一个分数RR,根据RR的大小来判定窗口内是否存在harris特征角,分数RR根据下面公式计算得到
α是一个经验参数,需要实验确定它的合适大小,通常它的值在0.04和0.06之间,它的存在只是调节函数的形状而已。增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。可以通过R的大小来判断像素是否为角点,当R为大数值正数的时候,表示为角点。当α的值过大时,角点的检测数量明显减少,最好不要设置的过大,以免影响检测结果。
Harris角点检测算法优点
- 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)。
- 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;
- 对于图像灰度尺度变化不变。
Harris角点检测算法缺点
- 它对尺度很敏感,不具备几何尺度不变性。
- 提取的角点是像素级的。
参考网址:
http://yongyuan.name/pcvwithpython/chapter2.html
https://www.cnblogs.com/polly333/p/5416172.html#8
https://blog.csdn.net/jia20003/article/details/16908661