一篇文章讲明白Harris角点

简介: 一篇文章讲明白Harris角点

1. 不同类型的角点

在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义:

角点可以是两个边缘的角点;

角点是邻域内具有两个主方向的特征点;

前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割与边缘提取,具有相当大的难度和计算量,且一旦待检测目标局部发生变化,很可能导致操作的失败。早期主要有Rosenfeld和Freeman等人的方法,后期有CSS等方法。

基于图像灰度的方法通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺陷,此类方法主要有Moravec算子、Forstner算子、Harris算子、SUSAN算子等。

这篇文章主要介绍的Harris角点检测的算法原理,比较著名的角点检测方法还有jianbo Shi和Carlo Tomasi提出的Shi-Tomasi算法,这个算法开始主要是为了解决跟踪问题,用来衡量两幅图像的相似度,我们也可以把它看为Harris算法的改进。OpenCV中已经对它进行了实现,接口函数名为GoodFeaturesToTrack()。另外还有一个著名的角点检测算子即SUSAN算子,SUSAN是Smallest Univalue Segment Assimilating Nucleus(最小核值相似区)的缩写。SUSAN使用一个圆形模板和一个圆的中心点,通过圆中心点像素与模板圆内其他像素值的比较,统计出与圆中心像素近似的像元数量,当这样的像元数量小于某一个阈值时,就被认为是要检测的角点。我觉得可以把SUSAN算子看为Harris算法的一个简化。这个算法原理非常简单,算法效率也高,所以在OpenCV中,它的接口函数名称为:FAST() 。

2. Harris角点

2.1 基本原理

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。

对于图像I(x,y)I(x,y)I(x,y),当在点(x,y)(x,y)(x,y)处平移(Δx,Δy)(Δx,Δy)(\Delta x,\Delta y)后的自相似性,可以通过自相关函数给出:

c(x,y;Δx,Δy)=∑(u,v)∈W(x,y)w(u,v)(I(u,v)–I(u+Δx,v+Δy))2c(x,y;Δx,Δy)=∑(u,v)∈W(x,y)w(u,v)(I(u,v)–I(u+Δx,v+Δy))2c(x,y;\Delta x,\Delta y) = \sum_{(u,v)\in W(x,y)}//代码效果参考: – I(u+\Delta x,v+\Delta y))^2

其中,W(x,y)W(x,y)W(x,y)是以点(x,y)(x,y)(x,y)为中心的窗口,w(u,v)w(u,v)w(u,v)为加权函数,它既可是常数,也可以是高斯加权函数。

根据泰勒展开,对图像I(x,y)I(x,y)I(x,y)在平移(Δx,Δy)(Δx,Δy)(\Delta x,\Delta y)后进行一阶近似:

I(u+Δx,v+Δy)=I(u,v

相关文章
|
算法 计算机视觉
OpenCV(四十三):Shi-Tomas角点检测
OpenCV(四十三):Shi-Tomas角点检测
529 0
|
算法 机器人 Linux
开源项目推荐:3D点云处理软件CloudCompare,基于Qt和OpenGL
开源项目推荐:3D点云处理软件CloudCompare,基于Qt和OpenGL
6634 0
开源项目推荐:3D点云处理软件CloudCompare,基于Qt和OpenGL
|
测试技术
QT --- VS2017+Qt5.12 编译报错【E2512 功能测试宏的参数必须是简单标识符 】的解决方法
QT --- VS2017+Qt5.12 编译报错【E2512 功能测试宏的参数必须是简单标识符 】的解决方法
1365 0
|
存储 算法 计算机视觉
OpenCV(四十二):Harris角点检测
OpenCV(四十二):Harris角点检测
610 0
|
监控 前端开发 UED
理解 MVVM 中的数据双向绑定
【10月更文挑战第21天】数据双向绑定是 MVVM 架构中的一个核心特性,它为前端开发带来了诸多便利和优势。理解并熟练运用数据双向绑定,有助于我们构建更加高效、交互性更强的应用程序。同时,我们也需要在实际应用中注意性能和复杂性等方面的问题,以确保应用的良好运行和用户体验。还可以结合具体的项目经验和实际案例,进一步深入探讨数据双向绑定在不同场景下的应用和优化策略。
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
2779 3
|
数据采集 人工智能 监控
证券行业数据治理:构建安全、高效的金融体系
证券行业数据治理是构建安全、高效的金融体系的关键环节。面对日益复杂的数据环境和业务需求,我们需要加强数据安全保护、提高数据质量、推进数据整合、强化法规遵从、适应技术更新并培养组织文化,以推动证券行业的健康发展。
|
算法
简单的KMP的next、nextval数组求解办法(存档自己用来复习)
简单的KMP的next、nextval数组求解办法(存档自己用来复习)
1384 2
错误码:CONTEXT_INCONSISTENT-自查方案
CONTEXT_INCONSISTENT 交易信息被篡改   错误原因: 该笔订单已经请求过一次且在支付宝这边创建交易了,商户未使用与上一次请求相同的参数去调用接口导致此报错。   解决方案: 1、请检查本次请求与之前请求后已存交易的参数是否一致,如商品名称、金额、买卖家等信息。
3162 13
|
存储 JSON JavaScript
【嵌入式开源库】cJSON的使用,高效精简的json解析库
【嵌入式开源库】cJSON的使用,高效精简的json解析库
847 0