Harris角点检测算法

Harris角点检测算法

    • 一、算法原理
    • 二、代码
    • 三、运行结果与分析
      • (一)纹理、角点丰富场景
      • (二)纹理平坦场景
      • (三)垂直或水平边缘多场景
    • 四、总结
    • PS:为了消除参数k的影响,也可采用商来计算响应

Harris角点检测算法

一、算法原理

哈里斯角点是在任意方向上移动(u,v),都会有很明显的变化。如下图一个局部很小的区域,如果是在图片区域中移动灰度值没有变化,那么窗口内不存在角点。如果在某一个方向上移动,一个发生很大变化而另一侧没有变化,那么说明这个区域是位于该对象的边缘区域。
Harris角点检测算法_第1张图片
其表达式如下图:
在这里插入图片描述
其含义是对于图像I(x,y),在点(x,y)处平移(u,v)后的自相似性。其中w(x,y)是加权函数,它可以是常数,也可以是高斯加权函数。如图2所示。
Harris角点检测算法_第2张图片
根据泰勒展开和一些数学步骤后可得到如下结果:
在这里插入图片描述
其中
在这里插入图片描述
公式中Ix和Iy是在x和y方向获取的区域。
最后转化为R=det(M) - k(trace(M))^2,该公式决定了一个区域内是否包含角特征。
公式中:
det(M) = λ1λ2
trace(M) = λ1+λ2
λ1和λ2是M的特征值。
这些特征值决定了一个区域是角,边缘还是平面。
当|R|很小时,即λ1和λ2很小时,该区域时平面。
当 R < 0时,即λ1远远大于λ2或者λ2远远大于λ1时,该区域时直线。
当 R很大时,即λ1和λ2都很大且近似相等,该区域时角点。
他们的关系可以表示为下图。
Harris角点检测算法_第3张图片
哈里斯角点的性质
该算法算子对亮度和对比度的变化不敏感。
算子具有旋转不变性。
算子不具有尺度不变性。
HARRIS角点检测
角点计算流程:
对角点响应函数R进行阈值处理: R > threshold
提取R的局部极大值
PS:为了消除参数k的影响,也可采用商来计算响应:
Harris角点检测算法_第4张图片

二、代码

# -*- 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('F:\计算机视觉\博客二\平坦正.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()

三、运行结果与分析

(一)纹理、角点丰富场景

①:正面
原图
Harris角点检测算法_第5张图片
运行结果
Harris角点检测算法_第6张图片
②:侧面
原图
Harris角点检测算法_第7张图片
运行结果
Harris角点检测算法_第8张图片
③:旋转
原图
Harris角点检测算法_第9张图片
运行结果
Harris角点检测算法_第10张图片
④:光照
原图
Harris角点检测算法_第11张图片
运行结果
Harris角点检测算法_第12张图片
⑤:远近
原图
Harris角点检测算法_第13张图片
运行结果
Harris角点检测算法_第14张图片
运行结果分析:
对于纹理丰富的场景,由于角点易被检测,即改变视角时会产生较大影响,能够明显看出角点检测数在不同视角下的变化。亮度变化时,对于角点的检测有相当的影响,明亮场景下角点易被检测,黑暗环境下角点不易被检测。距离远近变化时,角点检测的变化较小,拉远会使角点检测数变少,反之变多。由于角点数较多,当进行对比时,很难保证能够确认为同一事物。

(二)纹理平坦场景

①:正面
原图
Harris角点检测算法_第15张图片
运行结果
Harris角点检测算法_第16张图片
②:侧面
原图
Harris角点检测算法_第17张图片
运行结果
Harris角点检测算法_第18张图片
③:旋转
原图
Harris角点检测算法_第19张图片
运行结果
Harris角点检测算法_第20张图片
④:光照
原图
Harris角点检测算法_第21张图片
运行结果
Harris角点检测算法_第22张图片
⑤:远近
原图
Harris角点检测算法_第23张图片
运行结果
Harris角点检测算法_第24张图片
运行结果分析:
首先,对于纹理平坦的场景,最明显的一点,背景中的部分杂物,当视角变换时原本边缘的事物位置也会产生变动,容易被检测为密集的角点,产生一定的不必要的影响。其次,当图中事物因远近变化而放大缩小时,可能使原本不够明显的东西被检测为角点或者原本能够被检测为角点的东西被忽略。当视角变换时,对于原本就能够被检测的角点不易产生影响,亮度变换时,对于角点的检测可能会产生一定的影响,但该影响并不大。

(三)垂直或水平边缘多场景

①:正面
原图
Harris角点检测算法_第25张图片
运行结果
Harris角点检测算法_第26张图片
②:侧面
原图
Harris角点检测算法_第27张图片
运行结果
Harris角点检测算法_第28张图片
③:旋转
原图
Harris角点检测算法_第29张图片
运行结果
Harris角点检测算法_第30张图片
④:光照
原图
Harris角点检测算法_第31张图片
运行结果
Harris角点检测算法_第32张图片
⑤:远近
原图
Harris角点检测算法_第33张图片
运行结果
Harris角点检测算法_第34张图片
运行结果分析:

对于垂直或水平边缘较多的场景而言,由于特征明显,角点易于检测,在不同视角下对比明显,易得出结果的不同,较为明显的一点是,距离拉远后,原本处于一条线上的角点可能只被检测少数或一个,变换视角,对于角点的检测不易产生影响,变换视角后,角点基本上都能被成功的检测出来。在亮度变暗的部分被检测到的角点明显减少,因此亮度条件对于该场景的角点检测有较大的影响。

四、总结

通过如上实验,在不同类型的场景下,角点检测的结果类型不尽相同,各种条件对各种场景角点检测的影响幅度也各不相同,Harris角点检测算法是对Moravec算法的改进和提高,Harris算法是利用高斯窗函数和泰勒展开式,增加了角点检测算法的准确性,Harris角点检测子对图像的旋转变化、视角变化以及图像噪声具有比同类检测子更好的稳定性。然而Harris角点检测子对图像的尺度变化非常敏感,小的尺度变化就会造成Harris角点的复现率快速下降。这个特点在上面的实验可以看出来。图像的尺度伸缩将使得由Harris检测子提取的特征不具有可重复性。
Harris角点检测的性质:
1、阈值对角点检测的影响
增大阈值,降低角点检测的灵敏度,减少被检测角点的数量;减少阈值,增加角点检测的灵敏度,增加被检测角点的数量。
2、Harris角点检测算子对亮度和对比度的变化不灵敏
这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。
3、Harris角点检测算子具有旋转不变性
Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值R也不发生变化,由此说明Harris角点检测算子具有旋转不变性。
4、Harris角点检测算子不具有尺度不变性
当图像被缩小时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的。

PS:为了消除参数k的影响,也可采用商来计算响应

Harris角点检测算法_第35张图片
待补充

你可能感兴趣的:(计算机视觉课程)