文章目录
一、harris角点检测原理
1.1基本思想
利用卷积窗口滑动的思想,窗口在图像上移动,若出现窗口内的像素灰度出现了较大的变化,则该点为角点。
1.2数学模型
图像窗口平移[u,v]产生灰度变化E(u,v)为:
上式经泰勒展开后的得到
对局部微小的移动量 [u,v],所以 可以近似得到下式
记M的特征值λ1、λ2,可以将图像上的像素点分类成直线、平面与角点:当λ1和λ2 都比较大,且近似相等时,可以认为是角点。对图像点分类如下图:
由于是通过M的两个特征值的大小对图像进行分类,所以,定义角点相应函数R:
于是上图图像点分类图转化为下图:
在判断角点的时候,对角点响应函数R进行阈值处理:R > threshold,提取R的局部极大值。
关于harris角点响应函数R详细讨论见另一篇博客:
计算机视觉——harris角点检测之harris角点响应函数R
二、harris角点检测代码及实现
# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris
import numpy as np
olderr = np.seterr(all='ignore')
"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
# 读入图像
im0 = array(Image.open('data/empire.jpg'))
im = array(Image.open('data/empire.jpg').convert('L'))
# 检测harris角点
harrisim = harris.compute_harris_response(im)
# Harris响应函数
harrisim1 = 255 - harrisim
figure()
gray()
#画出Harris响应图
subplot(151)
title("原图",fontproperties=font)
axis('off')
imshow(im0)
subplot(152)
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, 5, i+3)
imshow(im)
print im.shape
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
show()
下面部分代码为对每个像素计算harris角点响应函数R:
from scipy.ndimage import filters
def compute_harris_response(im,sigma=3):
# 计算导数
imx = zeros(im.shape)
filters.gaussian_filter(im, (sigma,sigma), (0,1), imx)
imy = zeros(im.shape)
filters.gaussian_filter(im, (sigma,sigma), (1,0), imy)
# 计算 Harris 矩阵的分量
Wxx = filters.gaussian_filter(imx*imx,sigma)
Wxy = filters.gaussian_filter(imx*imy,sigma)
Wyy = filters.gaussian_filter(imy*imy,sigma)
# 计算特征值和迹
Wdet = Wxx*Wyy - Wxy**2
Wtr = Wxx + Wyy
return Wdet / Wtr
结果
分析:
后三幅图,由左及右,阈值分别为0.01,0.05,1,由结果可知,阈值越大,harris角点检测到的角点就越少。
三、不同类型图harris角点检测结果
2.1角点多的图
)
分析:
在角点多的图中,同一物体,不同角度中,当阈值=0.01时,五个角度提取到的角点都很多,随着阈值threshold增大,提取的角点明显变少。当阈值=1时,侧面和远角度提取到的角点相对多一些,正面有一小部分角点并未提取到。图中除了主物体的角点外,还有的角点落在了墙上(墙面确实存在污点,并非全白),harris角点检测根据灰度值也检测出了角点,说明harris角点检测的鲁棒性一般。当图像光线变暗,harris角点检测出的角点数无明显变化。因在进行Harris角点检测时,使用了微分算子对图像进行微分运算,图像的亮度变化对微分运算没有很大的影响。
2.2边缘多的图
分析:
在边缘较多的图中,同一物体,不同角度中,随着阈值threshold增大,提取的角点减少并不明显,但也有减少。在每个阈值下远角度提取到的角点较多。因为边缘多的图中,边缘明显,在图中有建筑的地方,像素灰度值产生了较大变化,说明harris角点检测在提取边缘较多图像的角点中可靠性较高。当光线变暗,角点数无明显变化。
2.3纹理平坦的图
分析:
在纹理平坦的图中,同一物体,不同角度中,随着阈值threshold增大,提取的角点减少。在threshold=0.01时,侧面,近角度提取的角点较多。在threshold=0.05和threshold=1时,由结果图可看见远角度中有部分角点未被提取,旋转角度和近角度能提取到的角点多于其他角度,检测出的角点也有一部分落在了墙上。当亮度变暗,角点并无明显变化。
四、小结
- harris角点检测与阈值大小呈反比,阈值越大,能检测出的角点越少。
- harris角点检测在尺度发生变化时,如在近角度和远角度,提取到的角点数量会出现较明显变化。因为图像被放大或缩小后,检测窗口对同一区域及其周围的灰度值检测的的结果产生变化。
- harris角点检测在提取边缘较多图像的角点中,可靠性较高。
- harris角点检测对图像亮暗度对比度不敏感。进行Harris角点检测时,使用了微分算子对图像进行微分运算,图像的亮度变化对微分运算没有很大的影响。
- 查阅资料了解到harris角点检测存在旋转不变性,在本次实验选取的图像中,旋转角度变化,角点数量发生变化还是较明显的,因此这点有待选取更合适的更多的数据验证。
Tips: 实验结果中,检测出的角点存在大量重叠的情况,经验证发现,可能的原因在于图片分辨率较大,把图片调整到合适的大小,检测出的角点位置及数量会更清晰。