计算机视觉——harris角点检测

一、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: 实验结果中,检测出的角点存在大量重叠的情况,经验证发现,可能的原因在于图片分辨率较大,把图片调整到合适的大小,检测出的角点位置及数量会更清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值