Loading [MathJax]/extensions/TeX/AMSmath.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Harris 像素级角点检测

Harris 像素级角点检测

作者头像
为为为什么
发布于 2023-04-12 05:28:17
发布于 2023-04-12 05:28:17
90600
代码可运行
举报
文章被收录于专栏:又见苍岚又见苍岚
运行总次数:0
代码可运行

图像中存在很多物体拐角,本文记录像素级角点检测算法 Harris 和 Shi Tomasi。

角点简介

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

  1. 角点可以是两个边缘的角点;
  2. 角点是邻域内具有两个主方向的特征点;

一提到角点检测,最常用的方法莫过于Harris角点检测,opencv 中也提供了 Harris 角点检测的接口,即cornerHarris(),但是 Harris 角点检测存在很多缺陷(如角点是像素级别的,速度较慢等),opencv 中有另一个功能更为强大的函数— goodFeaturesToTrack(),它不仅支持 Harris 角点检测,也支持 Shi Tomasi 算法的角点检测。但是,该函数检测到的角点依然是像素级别的。

角点检测基本原理

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

后的自相似性,可以通过自相关函数给出:

其中,

后进行一阶近似:

其中, 的偏导数,这样的话,自相关函数则可以简化为:

其中:

后的自相关函数可以近似为二项函数:

其中:

二次项函数本质上就是一个椭圆函数。椭圆的扁率和尺寸是由 的特征矢量决定的,如下图所示,椭圆方程为:

Harris角点算法实现

根据上述讨论,可以将 Harris 图像角点检测算法归纳如下,共分以下五步:

  1. 计算图象两个方向梯度的乘积。
  1. 使用高斯函数对 进行高斯加权 ( 取 ),生成矩阵 的元素
  2. 计算每个像素的 Harris 响应值 ,并对小于某一阈值的 置为零。
  3. 的邻域内进行非最大值抑制,局部最大值点即为图像中的角点。 其中:

$M$ 矩阵特征值

的特征值由 组成,特征值 与图像中的角点、直线(边缘)和平面之间的关系如下图所示:

分为三种情况:

  1. 图像中的直线。一个特征值大,另一个特征值小, 。自相关函数值在某一方向上大,在其他方向上小。
  2. 图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
  3. 图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。

Harris 角点判定

的计算公式为 :

式中,

影响结果的因素
  1. 增大阈值,检测到的角点会减少;
  2. 增大 的值,将减小角点响应值 ,降低角点检测的灵性,减少被检测角点的数量;
  3. 减小 值,将增大角点响应值 ,增加角点检测的灵敏性,增加被检测角点的数量;
  4. 同时邻域的大小也会影响角点的检测。

Shi Tomasi 算法

Shi Tomasi 算法,与 Harris 角点检测的区别主要是阈值标准不一样。

Harris 角点采用 ;

Shi Tomasi 算法采用 ,与阈值进行比较。

OpenCV 对应算子

,接着它计算如下式子:

cornerHarris

函数定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void cornerHarris( InputArray src, OutputArray dst, int blockSize,
                                int ksize, double k,
                                int borderType=BORDER_DEFAULT );

参数说明:

参数名

描述

src

输入的单通道 8-bit 或浮点图像。

dst

存储着 Harris 角点响应的图像矩阵,大小与输入图像大小相同,是一个浮点型矩阵。

blockSize

邻域大小。

apertureSize

扩展的微分算子大。

k

响应公式中的,参数$α$。

boderType

边界处理的类型。

goodFeaturesToTrack

函数定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void cv::goodFeaturesToTrack(
		cv::InputArray image, // 输入图像(CV_8UC1 CV_32FC1)
		cv::OutputArray corners, // 输出角点vector
		int maxCorners, // 最大角点数目
		double qualityLevel, // 质量水平系数(小于1.0的正数,一般在0.01-0.1之间)
		double minDistance, // 最小距离,小于此距离的点忽略
		cv::InputArray mask = noArray(), // mask=0的点忽略
		int blockSize = 3, // 使用的邻域数
		bool useHarrisDetector = false, // false ='Shi Tomasi metric'
		double k = 0.04 // Harris角点检测时使用
	);

参数说明:

参数名

描述

image

输入图像(8位或32位单通道图)。

corners

检测到的所有角点,类型为vector或数组,由实际给定的参数类型而定。如果是vector,那么它应该是一个包含cv::Point2f的vector对象;如果类型是cv::Mat,那么它的每一行对应一个角点,点的x、y位置分别是两列。

maxCorners

用于限定检测到的点数的最大值。

qualityLevel

表示检测到的角点的质量水平(通常是0.10到0.01之间的数值,不能大于1.0)。

minDistance

用于区分相邻两个角点的最小距离(小于这个距离得点将进行合并)。

mask

如果指定,它的维度必须和输入图像一致,且在 mask 值为 0 处不进行角点检测。

blockSize

表示在计算角点时参与运算的区域大小,常用值为3,但是如果图像的分辨率较高则可以考虑使用较大一点的值。

useHarrisDetector

用于指定角点检测的方法,如果是 true 则使用 Harris 角点检测,false 则使用Shi Tomasi 算法。

k

在使用Harris算法时使用,最好使用默认值0.04。

Python 实现

测试图像:

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2

img = cv2.imread('sketch.jpg', 0)
orb = cv2.ORB_create()
# detection
pts = cv2.goodFeaturesToTrack(img, 300, qualityLevel=0.22, minDistance=20, useHarrisDetector=False)

# extraction
kps = [cv2.KeyPoint(x=f[0][0], y=f[0][1], size=20) for f in pts]
kps, des = orb.compute(img, kps)

img_with_kp = cv2.drawKeypoints(img, kps, None, color=(0, 255, 0), flags=0)
cv2.imshow('ORB keypoints', img_with_kp)
cv2.waitKey()
pass

结果展示:

参考资料

文章链接: https://cloud.tencent.com/developer/article/2262527

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年4月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenCV 之 角点检测
角点 (corners) 的定义有两个版本:一是 两条边缘的交点,二是 邻域内具有两个主方向的特征点。
用户8408908
2021/03/18
6430
harris角点检测_那就更详细一点吧
在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义:
全栈程序员站长
2022/11/07
1.4K0
角点检测集锦(Harris,Shi-Tomasi,亚像素级角点检测)原理及相关实现
一个像素所在的区域一般情况下可以分为以下三种情况,平坦,边,角点三种情况,如下图最右边。 在角点处,沿任意方向运动都会引起像素颜色的明显变化等价于:在角点附近,图像梯度具有至少两个主方向。
种花家的奋斗兔
2020/11/13
1.2K0
OpenCV:特征及角点检测
大多数人都会玩拼图游戏。会得到很多小图像,需要正确组装它们以形成大的真实图像。问题是,你是如何去拼图的?同样地,将相同的理论投影到计算机程序上,以使得计算机也可以玩拼图游戏呢?如果计算机可以玩拼图游戏,为什么不能给计算机提供很多自然风光的真实图像,并告诉计算机将所有这些图像拼接成一个大图像呢?如果计算机可以将多个自然图像缝合在一起,那么如何给建筑物或任何结构提供大量图片并告诉计算机从中创建3D模型呢?
用户3578099
2023/09/01
5470
OpenCV:特征及角点检测
Sober算子边缘检测与Harris角点检测1「建议收藏」
Harris opencv 的对应代码 cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) 参数类型 src – 输入灰度图像,float32类型 blockSize – 用于角点检测的邻域大小,就是上面提到的窗口的尺寸 ksize – 用于计算梯度图的Sobel算子的尺寸 k – 用于计算角点响应函数的参数k,取值范围常在0.04~0.06之间
全栈程序员站长
2022/09/14
5150
Sober算子边缘检测与Harris角点检测1「建议收藏」
计算机视觉 OpenCV Android | 特征检测与匹配之角点检测——Harris角点检测与Shi-Tomasi角点检测
Harris角点检测与Shi-Tomasi角点检测都是经典的角点特征提取算法, 但两者在API的使用上有出入(详见文中代码或GitHub项目);
凌川江雪
2019/03/04
1.2K0
计算机视觉 OpenCV Android | 特征检测与匹配之角点检测——Harris角点检测与Shi-Tomasi角点检测
opencv角点检测学习总结[通俗易懂]
如果一个点在两个正交方向上都有明显的导数,则我们认为此点更倾向于是独一无二的,所以许多可跟踪的特征点都是角点。
全栈程序员站长
2022/09/27
1K0
亚像素角点检测
前面已经提及 goodFeaturesToTrack() 提取到的角点 只能达到像素级别,获取的角点坐标是整数,但是通常情况下,角点的真实位置并不一定在整数像素位置,因此为了获取更为精确的角点位置坐标,需要角点坐标达到亚像素(subPixel)精度。这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。
为为为什么
2023/04/12
1K0
亚像素角点检测
Opencv学习笔记------Harris角点检测
原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7391511
流川疯
2022/05/06
8840
Opencv学习笔记------Harris角点检测
【OpenCV入门之十九】Harris与Shi-Tomasi角点检测
学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更加容易理解。如果小伙伴觉得有帮助,请点击一下文末的“在看”鼓励一下小白。
小白学视觉
2019/05/30
1.1K0
harris角点检测的简要总结
harris角点检测是一种特征提取的方法,而特征提取正是计算机视觉的一种重要手段。尽管它看起来很复杂,其实也是基于数学原理和简单的图像处理来实现的。 本文之前可以参看笔者写的几篇图像处理的文章,将会有助于更深入了解harris角点检测的实现。
charlee44
2019/08/13
1.8K0
OpenCV 角点检测(三) Shi-Tomasi
就像Harrise算子是在Moravec算子的基础上改进得到的一样: http://blog.csdn.net/chaipp0607/article/details/54692818 Shi-Tomasi算子是在Harrise算子的基础上改进的,改进之处在于他们使用了不同的响应函数。
chaibubble
2022/05/07
3920
OpenCV 角点检测(三) Shi-Tomasi
Harris角点检测原理与流程
1. 角点概述 角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。角点在三维场景重建运动估计,目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。 在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义: a. 角点可以是两个边缘的角点; b. 角点是邻域内具有两个主方向的特征
智能算法
2018/04/02
3.1K0
Harris角点检测原理与流程
特征检测之Harris角点检测
如果有n阶矩阵A,其矩阵的元素都为实数,且矩阵A的转置等于其本身,则称A为实对称矩阵。
Datawhale
2020/07/09
1.4K0
特征检测之Harris角点检测
Shi-Tomasi角点检测
算法:Shi-Tomasi角点检测是史建波(Jianbo Shi)和卡罗·托马西(Carlo Tomasi)在哈里斯角点检测基础上提出的改进角点检测的方法。
裴来凡
2022/09/21
3920
Shi-Tomasi角点检测
通俗易懂的Harris 角点检测
如果这个特征点具有局部差异性,那么以这个特征点为中心,把窗口向360度任意一个方向移动,窗口的变化比较大,则这个特征点的周围环境变化比较大。
3D视觉工坊
2020/12/11
8320
通俗易懂的Harris 角点检测
OpenCV角点检测源代码分析(Harris和ShiTomasi角点)
OpenCV中常用的角点检测为Harris角点和ShiTomasi角点。 以OpenCV源代码文件 .\opencv\sources\samples\cpp\tutorial_code\TrackingMotion\cornerDetector_Demo.cpp为例,主要分析其中的这两种角点检测源代码。角点检测数学原理请参考我之前转载的一篇博客 http://www.cnblogs.com/riddick/p/7645904.html,分析的很详细,不再赘述。本文主要分析其源代码: 1. Harris角点检
一棹烟波
2018/03/19
2.1K0
OpenCV角点检测源代码分析(Harris和ShiTomasi角点)
cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测
参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014.
徐飞机
2018/05/15
8.9K0
图像匹配中Harris角点特征提取
在进行图像检测或者是识别的时候,我们需要提取出一些有特征的点加以识别,最常用的就是基于点的识别。这里所谓的点,其实就是一些重要的点,比如轮廓的拐角,线段的末端等。这些特征比较容易识别,而且不容易受到光照等环境的影响,因此在许多的特征匹配算法中十分常见。
mythsman
2022/11/14
8880
图像匹配中Harris角点特征提取
C++ OpenCV特征提取之自定义角点检测器(一)
我们在前面学习了《C++ OpenCV特征提取之Harris角点检测》和《C++ OpenCV特征提取之Shi-Tomasi角点检测》,今天我们再来学习一下自定义角点检测器。
Vaccae
2019/07/24
1.5K0
推荐阅读
相关推荐
OpenCV 之 角点检测
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验