计算机视觉python--Harris角点检测

一. 图像特征匹配

图像的局部特征主要分为以下几类:
角点:Harris算子,SUSAN算子, FAST算子。
梯度特征点: SIFT、SURF、GLOH、ASIFT、PSIFT算子 等。
边缘特征(线型):Canny算子, Marr算子。
纹理特征:灰度共生矩阵,小波Gabor算子

二. Harris角点检测

2.1 何为角点

通常意义上来说,角点就是极值点,即在某方面属性特别突出的点,是在某些属性上强度最大或者最小的孤立点、线段的终点。而对于图像而言,如图所示红点部分,即为图像的角点,其是物体轮廓线的连接点。
在这里插入图片描述

那么对于图像的角点判断,我们假想出一个正方形的小窗口,如果小窗口在图像以任意方向进行移动,导致图像灰度的明显变化,那么我们就可以认为小窗口内部包含了“角点”,或者当窗口足够小时,可以认为该窗口就是角点。下面我们通过一组图来了解一下:
在这里插入图片描述

可以看到:
当窗口位于平坦区时,任意方向移动都没有灰度变化。
当窗口位于边缘区时,沿边缘方向移动无灰度变化。
当窗口位于角点时,沿任意方向移动都会有明显的灰度变化。

2.2 如何检测角点—Harris算法

知道的角点的概念与逻辑判断,那如何转化成计算机能够识别的工具?
人的视觉是具有先天敏感性的,我们可以一眼判断出图像中的所有角点,可以当电脑要识别图像的时候,它们并没有记忆视觉,只能通过严格计算来寻找角点,可见万物离不开数学,因为数学对电脑来说是最友善的朋友了。那么怎么通过数学推理判断角点呢?

答案是Harris算法。Harris算法使用微分运算和自相关矩阵来进行角点检测,具有运算简单、提取的角点特征均匀合理、性能稳定等特点。

假设图像像素点(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和λ2都偏小的时候,表示窗口沿任意方向移动都会使灰度变化很细微,该点处于图像的平坦区域。
当λ1>>λ2或者λ1<<λ2时,说明该点向水平(垂直)方向移动时变化会很明显,而向垂直(水平)方向则变化不明显,该点处于图像的边缘区。
当两个特征值λ1和λ2都很大的时候,表示窗口沿任意方向移动都会使灰度变化很明显,该点位置就是图像角点的位置。
在这里插入图片描述

然而在实际中,经常使用的是角点响应函数CRF这一概念,以此更加准确的计算所需角点,方法如下:
在这里插入图片描述

det M是矩阵M的行列式,Trace(M)为矩阵M的迹。k为修正值,是一个常数,经验取值为0.04-0.06。算出响应值之后,根据R与阈值T的比较来判断是否为角点。

当|R|很小时,R<T , 认为该点处于图像的平坦区域。
当R<0时,R<T , 认为该点处于图像的边缘区。
当R>0时,R>T, 认为该点位置就是图像角点。
在这里插入图片描述

2.3 实现效果

以上着重介绍了Harris角点检测的原理,下面将进行Harris角点检测与特征匹配的实际操作,我拍了一张我本科大学(集美大学)里的建筑物—延奎图书馆。用python语言实现,代码如下:

2.3.1 Harris角点检测代码:
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris

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

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

# Harris响应函数
harrisim1 = 255 - harrisim

figure()
gray()

#画出Harris响应图
subplot(121)
suptitle("Harris corners")
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, 2, 2)
imshow(im)
print (im.shape)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '+c')
axis('off')
show() 
2.3.2 Harris角点检测效果图

1垂直和水平边缘多
在这里插入图片描述
正面

在这里插入图片描述

不同角度
在这里插入图片描述

远处在这里插入图片描述

光照在这里插入图片描述

侧面
在这里插入图片描述

2角点丰富
在这里插入图片描述

正面在这里插入图片描述

不同角度在这里插入图片描述

远处
在这里插入图片描述

光照在这里插入图片描述

侧面在这里插入图片描述

3纹理平坦在这里插入图片描述

正面在这里插入图片描述

不同角度
在这里插入图片描述

远处在这里插入图片描述

光照在这里插入图片描述

在纹理平坦的平面上还是会出现很多角点,说明算法具有一定误差

2.3.3 实验分析

1.Harris角点检测算子对亮度和对比度的变化不灵敏
这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。
2.Harris角点检测算子具有旋转不变性
Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值RR也不发生变化,由此说明Harris角点检测算子具有旋转不变性
3.Harris角点检测算子不具有尺度不变性
如下图所示,当图像被缩小时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的。左侧的图像可能被检测为边缘或曲线,而右侧的图像则可能被检测为一个角点。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值