Harris算子
一、Harris介绍
HARRIS角点检测基本思想
1、从图像局部的小窗口观察图像特征
2、角点定义窗口向任意方向的移动都导致图像灰度的明显变化
数学表达
假设图像像素点(x,y)的灰度为 I(x,y),以像素点为中心的窗口沿 x 和 y 方向分别移动 u 和 v 的灰度强度变化的表达式为:
其中 E(u,v)是灰度变化,w(x,y) 是窗口函数,一般是高斯函数,所以可以把w(x,y)看做是高斯滤波器。
收到泰勒公式的启发,在这里我们可以将 I(x+u,y+v)函数在(x,y)处泰勒展开,,整理得到表达式如下:
展开后整理可以用矩阵表达为:
得到E(x,y)的表达式,将其化为二次型后得到:
其中M是一个2X2的矩阵,称为像素点的自相关矩阵,可以由图像的导数求得。M=窗口函数*偏导矩阵,表达式为:
det M是矩阵M的行列式,Trace(M)为矩阵M的迹。k为修正值,是一个常数,经验取值为0.04-0.06。算出响应值之后,根据R与阈值T的比较来判断是否为角点。
当|R|很小时,R<T , 认为该点处于图像的平坦区域。
当R<0时,R<T , 认为该点处于图像的边缘区。
当R>0时,R>T, 认为该点位置就是图像角点。
二、 实验
实验要求
- 需要拍摄纹理平坦、垂直或水平边缘多(如建筑物)、纹理角点丰富的三种场景
- 每种场景至少需要有 正面、侧面、旋转、尺度(远近)变化
- 每种场景实验结果结束后,做实验结果的分析,分析内容需涉及到原理与实验结果的对应关系
代码
# -*- 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(r'C:\Python27\Scripts\pythonhomework\3.4.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.垂直或水平边缘多
1.1原图
运行结果
1.2侧面
运行结果
1.3旋转
运行结果
1.4尺寸(进远)
运行结果
1.5结果分析分析
图片是公寓天台上拍摄的,在本场景中,对于正面与侧面不容易区分,即使走到建筑物侧面,与原图的检测结果区别不大。并且拍摄时候,没考虑到图中瓦片的影响,导致检测结果中,瓦片一块全部被检测。旋转图片中,图片边缘与建筑物垂直边缘的交点被检测。最后近距离拍摄的检测结果,角点数量明显低于原图的角点数量。
2.纹理角点丰富
2.1原图
运行结果
2.2侧面
运行结果
2.3旋转
运行结果
2.4尺寸(进远)
运行结果
2.5结果分析分析
纹理角点丰富的场景选取,我选择了小区的中心树坛,同边缘丰富的建筑一样,对于侧面拍摄的区别并不大。并且可以明显看出,对于4种情况下的图片,由于树叶的占图比例比较大,运行结果中,角点的检测几乎布满整个图片,角点检测数量没有明显的区别
3.纹理平坦
3.1原图
运行结果
3.2侧面
运行结果
3.3旋转
运行结果
3.4尺寸(进远)
运行结果
3.5结果分析分析
对于纹理平坦的图片,我选取了家里有电灯开关的墙面。由于墙面贴有墙纸,在响应值低的情况下,墙面的条纹也会被检测。在纹理平坦的图片中,正面侧面的区别比较明显,侧面的检测角点数明显大于正面。旋转图与原图的区别不大,近远图对比与前两个场景一样,近距离的检测点明显较少。
4.结论
Harris算子是一种有效的点特征提取算子,对于他的特点总结如下
1.在纹理信息丰富的区域,Harris算子可以提取出大量的特征点(树木图)
2.Harris算子在图像旋转和角度的影响下检测结果区别不大
3.在近距离拍摄的情况下,在三个场景下,检测点都明显变少,说明harris算子在对尺寸的影响比较敏感。
4,增大响应值,会减少像素值高于响应值的图像点的数量,从而减少被检测角点的数量;减小响应值,会增大像素值高于响应值的图像点的数量,增加角点检测的灵敏性,从而增加被检测角点的数量。
下一篇: Stack原理讲解