Harris角点检测(实验)
作者:互联网
1. 实验原理及目的
1.1实验原理
在 1988 年的文章《A CombinedCorner and Edge Detector》中就已经提出了焦点检测的方法,被称为Harris 角点检测。他把这个简单的想法转换成了数学形式。将窗口向各个方向移动(u,v)然后计算所有差异的总和。表达式如下:
窗口函数可以是正常的矩形窗口也可以是对每一个像素给予不同权重的高斯窗口
角点检测中要使 E (μ,ν) 的值最大。这就是说必须使方程右侧的第二项的取值最大。对上面的等式进行泰勒级数展开然后再通过几步数学换算(可以参考其他标准教材),我们得到下面的等式:
这里I x 和 I y 是图像在 x 和 y 方向的导数。然后就是主要部分了。他们根据一个用来判定窗口内是否包含角点的等式进行打分。
其中:
det( M)是矩阵M的行列式,Trace(M)为矩阵M的迹。k为修正值,是一个常数,经验取值为0.04-0.06。算出响应值之后,根据R与阈值T的比较来判断是否为角点。
结论:
1.当|R|很小时,R<T , 认为该点处于图像的平坦区域。
2.当R<0时,R<T , 认为该点处于图像的边缘区。
3.当R>0时,R>T, 认为该点位置就是图像角点。
1.2 实验目的(要求)
- 需要拍摄纹理平坦、垂直或水平边缘多(如建筑物)、纹理角点丰富的三种场景
- 每种场景,至少需要有 正面、侧面、旋转、尺度(远近)变化,最好能再加光照变化
- 每种场景实验结果结束后,做实验结果的分析,分析内容需涉及到原理与实验结果的对应关系
2. 实验源代码
# -*- 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).
"""
figure()
gray()
# 读入图像
im = array(Image.open('.../img/img.jpg').convert('L'))
im_1 = Image.open('D:/ComputerVision_code/img/jzz.jpg')
subplot(221)#展示原图
imshow(im_1)
# 检测harris角点
harrisim = harris.compute_harris_response(im)
# Harris响应函数
harrisim1 = 255 - harrisim
#画出Harris响应图
subplot(222)
imshow(harrisim1)
print (harrisim1.shape)
axis('off')
axis('equal')
threshold = [0.01, 0.05]#, 0. [0.01,0.05,0.1]
for i, thres in enumerate(threshold):
filtered_coords = harris.get_harris_points(harrisim, 6, thres)
subplot(2, 2, i+3)
imshow(im)
print (im.shape)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
plt.tight_layout()
show()
3.实验过程
3.1.纹理丰富,边缘较多的区域
(1)实验结果
1.建筑近景:
2.建筑远景:
3.建筑旋转:
4.建筑暗光
5.建筑曝光
(2)实验分析
在这一组测试素材中,只有近景和暗光两种情况下检测出了角点,其他三种情况都没有标出角点,而在光线弱的条件下检测角点效果比近景好,线条更清晰些。
3.2 纹理角点丰富的区域
(1)实验结果
1.玩具正面
2.玩具侧面
3.玩具旋转
4.玩具远景
5.玩具暗光
(2)实验分析
玩具身上的棱角设计较多,检测结果效果比较好,5种情况下都检测出了角点,这五种情况相较,正面近拍的效果最好,旋转画面对检测结果几乎没有影响,正面拍摄图检测到的角点旋转后也能检测到,远景的效果相对会差些,原因估计与远景拍摄的像素有关,玩具身上的线条区分不明显,导致角点都堆聚在一起,还有可能是标记点比较大,远景标出来的角点都挨一起了。
3.3 纹理平坦,不明显的区域
(1)实验结果
1.杯子正面
2.杯子侧面
3.杯子旋转
4.杯子曝光
5.杯子远景
(2)实验分析
该场景是相较前两种情况纹理平缓的场景,不同角度的标记情况同上一场景一样,只是纹理平缓的区域里,角点标记的数量会少很多,在这种情况下不同阈值的标点效果区别更明显。
4. 实验总结
1.阈值决定检测点数量
在本次试验中:阈值都分别为0.01,0.05,0.1。从三组实验可以得到:增大k的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量,检测效果更精确;减小k值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量
2.Harris角点检测算子对亮度变化不敏感
因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。对亮度的改变不改变Harris响应的极值点出现的位置。
3.Harris角点检测算子对旋转角度变化不敏感
经过三组素材测试,发现旋转过后的检测效果与正面拍摄检测到的角点基本相同,不懂角度拍摄的图片,会由于展现的形状不同而产生角点标记个数不同的情况,并不影响标记。
遇到的问题:第一组图片有三个情况都检测不出角点,尝试改变图片的亮度,结果不变,尚未找到原因。
参考:
https://www.cnblogs.com/polly333/p/5416172.html#11
https://www.cnblogs.com/DOMLX/p/8763369.html
标签:检测,角点,harris,Harris,im,实验 来源: https://blog.csdn.net/DeerDolphin/article/details/104494302