计算机视觉——Harris角点检测(课堂实验)

2.1Harris角点检测

2.1.1算法简介

2.1.1.1角点及角点检测

角点
通常意义上来说,角点就是极值点,即在某方面属性特别突出的点,是在某些属性上强度最大或者最小的孤立点、线段的终点。 对于图像而言,如图所示圆圈内的部分,即为图像的角点,其是物体轮廓线的连接点。
在这里插入图片描述
角点的特征:
1.轮廓之间的交点;
2.对于同一场景,即使视角发生变化,通常具备稳定性质的特征;
3.该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化;

角点检测
角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。对于同一场景,即使视角发生变化,通常具备稳定性质的特征。我们可以利用这一稳定的性质将角点应用三维场景重建运动估计,目标跟踪、目标识别、图像配准与匹配等计算机视觉领域。

2.1.1.2Harris的基本思想

1.该算法的主要思想是,如果像素周围显示存在多于一个方向的边,我们
认为该点为兴趣点。该点就称为角点。
2.使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

2.1.1.3数学原理

假设图像像素点(x,y)的灰度为 I(x,y),以像素点为中心的窗口沿 x 和 y 方向分别移动 u 和 v 的灰度强度变化的表达式为:
在这里插入图片描述
其中 E(u,v)是灰度变化,w(x,y) 是窗口函数,一般是高斯函数,所以可以把w(x,y)看做是高斯滤波器。I(x,y)是图像灰度, I(x+u,y+v)是平移后的图像灰度。
收到泰勒公式的启发,在这里我们可以将 I(x+u,y+v)函数在(x,y)处泰勒展开,为了提高抗干扰的能力并且简化运算,我们取到了一阶导数部分,后面的无穷小小量O(u2+v2)可以忽略,整理得到表达式如下:
在这里插入图片描述
将[ Ixu+Iyv ]展开后整理可以用矩阵表达为:
在这里插入图片描述
最后可以近似得到E(x,y)的表达式,将其化为二次型后得到:
在这里插入图片描述
其中M是一个2X2的矩阵,称为像素点的自相关矩阵,可以由图像的导数求得。M=窗口函数*偏导矩阵,表达式为:
在这里插入图片描述
因为u,v是局部微小的移动变量,所以对M进行讨论,M是一个2X2的矩阵,M的表达式中与点的位置(x,y)具体强相关性,记M得特征值为λ1,λ2,关于特征值可以简单理解为该点的灰度值变化速度,a1和a2可以分别看做是x方向和y方向的灰度变化速率,就可以用a1,a2两者的大小关系来进行分类:

1.当两个特征值λ1和λ2都偏小的时候,表示窗口沿任意方向移动都会使灰度变化很细微,该点处于图像的平坦区域。
2.当λ1>>λ2或者λ1<<λ2时,说明该点向水平(垂直)方向移动时变化会很明显,而向垂直(水平)方向则变化不明显,该点处于图像的边缘区。
3.当两个特征值λ1和λ2都很大的时候,表示窗口沿任意方向移动都会使灰度变化很明显,该点位置就是图像角点的位置。

实际中,经常使用的是角点响应函数CRF这一概念,以此更加准确的计算所需角点,方法如下:
在这里插入图片描述
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, 认为该点位置就是图像角点。

2.1.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).
"""

# 读入图像
im = array(Image.open('PP.jpg').convert('L'))

# 检测harris角点
harrisim = harris.compute_harris_response(im)

# Harris响应函数
harrisim1 = 255 - harrisim

figure()
gray()

#画出Harris响应图
subplot(221)
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(2, 2, i+2)
    imshow(im)
    print(im.shape)
    plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    axis('off')
show()

2.1.2.1纹理平坦

在这里插入图片描述

2.1.2.1.1正面

在这里插入图片描述

2.1.2.1.2侧面

在这里插入图片描述

2.1.2.1.3旋转

在这里插入图片描述

2.1.2.1.4尺度远近

在这里插入图片描述

2.1.2.1.5光照

在这里插入图片描述
小结:
上述实验分别为阈值为0.01,0.05,0.1所检测出来的结果
1.上述所有条件下,同一幅图的三张图像对比发现,检测点逐渐变少。
2.
在这里插入图片描述
k即为这里的阈值
阈值越大,角点检测响应越少,越精确,标记点数量减少
阈值越小,角点检测响应越多,越宽泛,标记点数量增多
3.本来这组实验的主体是开关,但因为墙纸的凹凸不平导致对整个检测的影响很大,反而墙纸好像变成了主体。
4.正侧对比:因为开关很薄,所有角度的变换并没有什么太大影响,响应点的改变并不明显
5.旋转对比:旋转对墙纸的角点检测十分明显,因为凹凸不平导致反光程度随着角度的改变而发生改变,进而导致开关附近的灰度发生了较大的变化
。Harris角点检测算子就是通过像素周围的灰度变化来检测角点,所以这个结果也证明了Harris的检测原理。
6.远近对比:远近对比对开关的影响就是检测的更加细节,有些当远景是点的部分,可能在角点检测中就连成了一条边缘。
7.明暗对比:这组的明暗对比也受到了墙纸的影响,单看开关部分,细致程度与亮部分很相似。

2.1.2.2垂直边缘多

在这里插入图片描述

2.1.2.2.1正面

在这里插入图片描述

2.1.2.2.2侧面

在这里插入图片描述

2.1.2.2.3旋转

在这里插入图片描述

2.1.2.2.4尺度远近

在这里插入图片描述

2.1.2.2.5光照

在这里插入图片描述
小结:
上述实验分别为阈值为0.01,0.05,0.1所检测出来的结果
1.上述所有条件下,同一幅图的三张图像对比发现,检测点逐渐变少。
2.
在这里插入图片描述
k即为这里的阈值
阈值越大,角点检测响应越少,越精确,标记点数量减少
阈值越小,角点检测响应越多,越宽泛,标记点数量增多
3.这组的图片因为像素过高导致一开始除了近景,其他的都无法检测出角点,这也看出了这个算法的一个弊端。当像素过高时,无法检测。
4.正侧对比:因为高楼比较立体,所以在正侧对比中,比上一组的影响稍大些,转换一个角度,因为视野的影响,标注点会有较上组更多的差异。
5.旋转对比:此组图片的旋转,用到的是侧面的同一张图,用手机制作旋转了一个角度,但从结果可以看出,第3,4组实验结果,标注是非常相似的,但即使是同一张照片,最终标注的点也并不完全相同。Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值R也不发生变化。
6.远近对比:这组拍摄的是近景,因为物体更加明显,所以标注的数量也增多。
7.明暗对比:这组图片中更暗的图片角点相对较少,但不明显,可见Harris角点检测算子对光照的变化不敏感,Harris的数学原理中使用了微分算子对图像进行微分运算,微分对亮度不敏感。所以两组实验看下来Harris算子对亮度的改变会受到很小的影响。

2.1.2.3角点丰富

在这里插入图片描述

2.1.2.3.1正面

在这里插入图片描述

2.1.2.3.2侧面

在这里插入图片描述

2.1.2.3.3旋转

在这里插入图片描述

2.1.2.3.4尺度远近

在这里插入图片描述

2.1.2.3.5光照

在这里插入图片描述
小结:
上述实验分别为阈值为0.01,0.05,0.1所检测出来的结果
1.上述所有条件下,同一幅图的三张图像对比发现,检测点逐渐变少。
2.
在这里插入图片描述
k即为这里的阈值
阈值越大,角点检测响应越少,越精确,标记点数量减少
阈值越小,角点检测响应越多,越宽泛,标记点数量增多
3.这组图片是从网上搜集的。
4.正侧对比:建筑物比较立体,所以在正侧对比中,因为视野的影响,和建筑物本身的形态不规则,标注点会有较上组更多的差别。
5.旋转对比:也是因为这组图片的角度和建筑物角点较多的情况,这组的标注点差距也比上2组多
6.远近对比:因为角点多且比之前2组的图片清晰,所以远近的对比反而没有太大的差距。
7.明暗对比:同第二组的分析,三组实验看下来Harris算子对亮度的改变受到很小的影响。

2.1.3总结(出现的问题及解决)

1.图像像素过高导致算法失效
在这里插入图片描述
解决:通过画图工具讲像素按比例调小,重新跑代码
在这里插入图片描述
2.家里的墙纸并不是完全光滑的,拍摄了有浅色墙纸下的开关钮,并归为纹理平坦一类,结果代码跑完角点的检测比角点较多的那一组响应还大。因为家里的墙纸是凹凸不平的浅色花纹,在人眼看来并没有很明显,可见这个算法还是很敏感的。使用的时候应该充分考虑实际想要得到的效果。

发布了12 篇原创文章 · 获赞 3 · 访问量 1260

猜你喜欢

转载自blog.csdn.net/weixin_43822880/article/details/104495968