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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Harris角点检测计算机视觉领域中一种常用的特征检测算法,可以在图像中检测到角点。在Python中,可以使用OpenCV库提供的cornerHarris()函数来实现Harris角点检测。该函数的参数包括输入图像、输出图像、块大小、卷积核大小、k值和边界类型等。通过调用该函数,可以得到图像中的角点信息。\[1\]\[2\] Harris角点检测的基本原理是通过计算图像中每个像素点的梯度和响应值来判断是否为角点。具体的算法流程包括梯度计算、响应值计算和角点提取。在梯度计算阶段,通过计算图像的水平和垂直方向的梯度来获取每个像素点的梯度信息。在响应值计算阶段,根据梯度信息计算每个像素点的响应值,响应值越大则越有可能是角点。最后,在角点提取阶段,通过设定一个阈值来筛选出响应值大于阈值的像素点作为角点。\[3\] 使用Harris角点检测算法可以在图像中找到边缘丰富区域和纹理角点丰富区域等特征。通过调整参数和阈值,可以适应不同场景下的角点检测需求。在实际应用中,Harris角点检测算法可以用于图像匹配、跟踪和三维重建等领域。 #### 引用[.reference_title] - *1* [Python实现Harris角点检测算法及完整源码](https://blog.csdn.net/qq_33885122/article/details/130352237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于Python手动实现Harris角点检测](https://blog.csdn.net/weixin_46585836/article/details/128129608)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Python计算机视觉——Harris角点检测](https://blog.csdn.net/Alex0714/article/details/117194388)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值