Harris 角点检测原理及实现

article/2025/10/8 2:02:18

1. 图像中角点定义

沿各个方向,图像灰度均发生变化;

2.Harris原理

Harris中也是根据角点定义经角点定义,Harris中使用该像素点周围像素块和其周围的其它像素块的相关性刻画角点,相关性用平方差之和进行计算(SSD),SSD越大,相关性差,中心像素点越有可能成为角点。其数学表达形式为:
在这里插入图片描述在这里插入图片描述
Where Q 是矩阵M的特征向量组成的正交矩阵,向量左乘正交矩阵相当于旋转了一定角度,但是大小保持不变。
在x轴和y轴梯度均增大的点就是梯度点,为了方便,设置相应函数,相应函数的设计原理如下图所示:
在这里插入图片描述
图(1) Harris角点检测原理图
响应函数为:
在这里插入图片描述
Where K是一个经验值,通常取0.04~0.06。

3.Harris代码实现

'''
@Author:noodles
@date:2020-7-17 20:31:46
'''
import cv2
import numpy as np
threshold = 0.01
def responseFunc(M):k = 0.04det = np.linalg.det(M)trace = np.trace(M)R = det - k * trace **2return R
def getHarrisFeaturePoints(src,NMS=False):global thresholdh, w = src.shape[:2]# Step1: convert rgb image grayScalegray_image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)cornerPoint = np.zeros_like(gray_image,dtype=np.float32)# Step2: compute gradient of x,y axis respectivelygrad = np.zeros((h, w, 2), dtype=np.float32)grad[:,:,0] = cv2.Sobel(gray_image,cv2.CV_16S,1,0)grad[:,:,1] = cv2.Sobel(gray_image,cv2.CV_16S,0,1)Ixx = grad[:,:,0] ** 2Iyy = grad[:,:,1] ** 2Ixy = grad[:,:,0] * grad[:,:,1]# gaussian_kernal =cv2.getGaussianKernel(3,2)Ixx = cv2.GaussianBlur(Ixx, (3, 3), sigmaX=2)Iyy = cv2.GaussianBlur(Iyy, (3, 3), sigmaX=2)Ixy = cv2.GaussianBlur(Ixy, (3, 3), sigmaX=2)# print(Ixx, Iyy,Ixy)# Step3: compute structure matrixfor i in range(gray_image.shape[0]):for j in range(gray_image.shape[1]):struture_matrix = [[Ixx[i][j], Ixy[i][j]], [Ixy[i][j], Iyy[i][j]]]# Step4: response calculation,determine weather it is corner or notR = responseFunc(struture_matrix)cornerPoint[i][j] = R# Step5: non-max suppression,reduce the quantity of cornercorners = np.zeros_like(gray_image,dtype=np.float32)counter = 0maxValue = np.max(cornerPoint)for i in range(cornerPoint.shape[0]):for j in range(cornerPoint.shape[1]):if NMS:if cornerPoint[i][j] > threshold * maxValue and cornerPoint[i][j] == np.max(cornerPoint[max(0, i - 1):min(i + 1, h - 1), max(0, j - 1):min(j + 1, w - 1)] ):counter+=1corners[i][j] = 255else:if cornerPoint[i][j] > threshold * maxValue:counter+=1corners[i][j] = 255print('FeaturePoints=', counter)return cornersif __name__ == '__main__':image_path = 'grid.jpg'src = cv2.imread(image_path)img = cv2.resize(src, dsize=(600, 400))NMS = Falsedst = getHarrisFeaturePoints(img,NMS)#print(dst)img[dst == 255] = [0, 0, 255]cv2.imshow('src',img)cv2.waitKey()

实验结果:

在这里插入图片描述
图(2) opencv库函数测试结果
在这里插入图片描述

图(3) 编码实现测试结果
可以看到对于同一张图,调用opencv和和自己编码实现检测的角点的位置和数量一致,验证了自己代码的正确性。

4.疑难和理解

Q1:为什么研究M矩阵?

A1:根据化简式子1,发现M影响E(x,y)变化快慢。

Q2:为什么要求M的特征值?

在这里插入图片描述
图(4) 矩阵特征值和Ix,Iy分布关系图
理解思路1:绘制了特征值和窗口内Ix,Iy的函数,如上图(4),发现了对应结论。
理解思路2:发现M矩阵和PCA中的矩阵很相似,原始数据可以理解为窗口中的Ix,Iy二维数据,M的特征值对应Ix,Iy的主成分,两个主成分都比较大,则认为在像素点周围存在至少两个像素变化的方向。

Q3:响应函数设计的原理?

A3:为了避免计算特征值。
在这里插入图片描述
图(5)原文中响应函数设计原理
在这里插入图片描述
图(6)Harris响应函数的曲线图
结合Harris函数的本身特点和二维矩阵与特征值与矩阵元素的关系设计。
矩阵值和矩阵元素存在如下关系:
在这里插入图片描述

Q4:为什么具有旋转不变性?

A4:图像旋转只会改变特征椭圆的方向,并不会改变椭圆的长短轴的长度,因此R并不会改变。

Q5:Harris角点检测算子对亮度和对比度的变化不灵敏

在这里插入图片描述
该算法通过图像差分计算角点,两种对比度变化如上图所示,可见光照图像差分影响并不大,也不会改变角点在图像中的位置,但是因为阈值设置的原因,会形象特征点的数量。
Note:
交单检测主要分为基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。而Harris角点检测属于基于灰度图像的角点检测。
下面这张图像使用基于灰度检测的角点图像效果就会很差:
在这里插入图片描述
原图
在这里插入图片描述
使用Harris角点检测出来的结果
通过对比发现,角点检测过程,首先需要确定角点的种类,然后选用不同的角点检测算法,这样才能有效准确的检测处图像角点。

5.reference

参考文献:
[1]: https://www.cnblogs.com/zyly/p/9508131.html
[2]: https://www.cnblogs.com/ronny/p/4009425.html
[3]: https://blog.csdn.net/f290131665/article/details/80064479
[4]: A Combined Corner and Edge Detector[J],1988.Jianbo Shi and Carlo Tomasi


http://chatgpt.dhexx.cn/article/vpe6Jbbc.shtml

相关文章

基于Python手动实现Harris角点检测

最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲。 同时作为自己的第一篇博客,在这里记录一下。 一、Harris角点检测 原理(略) 可以参考博…

【OpenCV入门教程之十六】OpenCV角点检测之Harris角点检测

本系列文章由浅墨_毛星云 出品,转载请注明出处。 文章链接: http://blog.csdn.net/poem_qianmo/article/details/29356187 作者:毛星云(浅墨) 微博:http://weibo.com/u/1723155442 知乎:ht…

Harris 角点检测(Harris Corner Detection)(OpenCV实现)

匹配问题 Harris角点检测是Chris Harris和Mike Stephens在1988年提出的。主要用于运动图像的追踪。当时的普遍想法是利用边缘进行追踪,但是当相机或物体运动时你不知道朝哪个方向,相机的几何变换也是未知的,所以边缘匹配很难达到预期的效果。…

图像处理(九)——Harris角点检测

实现Harris角点检测算法,并与OpenCV的cornerHarris函数的结果进行比较。 特征点在图像中一般有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、以及某些梯度特征等。角点可以简单的认为是两条边的交点。如下图所示: 在各个…

Harris角点检测 及 Matlab实验

目录 1 基础知识 1.1 图像变化的类型 1.2 提取点特征的作用 1.3 什么是好的角点检测算法? 2 Harris 角点检测 2.1 Harris角点检测基本思想 2.2 Harris角点检测:数学描述 3 总结 4 Matlab 实验 参考资料 角点是图像重要的特征,对图像…

Harris的角点检测和特征匹配

一.特征检测(提取) 基于特征的图像配准方法是图像配准中最常见的方法之一。它不是直接利用图像像素值,二十通过像素值导出的符号特征(如特征点、特征线、特征区域)来实现图像配准,因此可以克服利用灰度信息…

Harris角点及Shi-Tomasi角点检测

一、角点定义 有定义角点的几段话: 1、角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。也称为特征点检测。 角点通常被定义为两条边的交点&#xff0…

Harris角点检测算法详解

Harris角点算法 特征点检测广泛应用到目标匹配、目标跟踪、三维重建等应用中,在进行目标建模时会对图像进行目标特征的提取,常用的有颜色、角点、特征点、轮廓、纹理等特征。现在开始讲解常用的特征点检测,其中Harris角点检测是特征点检测的基…

Harris角点检测算子

Harris角点检测算子是于1988年由CHris Harris & Mike Stephens提出来的。在具体展开之前,不得不提一下Moravec早在1981就提出来的Moravec角点检测算子。 1.Moravec角点检测算子 Moravec角点检测算子的思想其实特别简单,在图像上取一个W*W的“滑动窗…

特征检测之Harris角点检测

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达特征点又叫兴趣点或者角点。常被用于目标匹配,目标跟踪,三维重建等应用中。点特征主要指图像中的明显点,如突出的角点、边缘端点、极值…

Harris角点检测原理分析

主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601 Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的补充,以方便对数学已经生疏的小伙伴们参考理解。由于补充的内容还挺多,所以还是将本文标…

【理解】经典角点检测算法--Harris角点

目录 什么是角点角点检测算法的原始思想:Harris角点检测原理Harris角点算法的基本步骤实践:Harris角点检测可能会用到的OpenCV API:手写API:1.展示图片:2.手写Harris特征:3.手写非极大值抑制:4.在原图标注角…

角点检测(Harris角点检测法)

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录 原理讲解【1】为何选取角点作为特征?【2】角点的定义&#xff1a…

Harris角点检测原理详解

关于角点的应用在图像处理上比较广泛,如图像匹配(FPM特征点匹配)、相机标定等。网上也有很多博客对Harris角点检测原理进行描述,但基本上只是描述了算法流程,而其中相关细节并未作出解释,这里我想对有些地方做出补充说明&#xff…

OpenCV——Harris角点检测

目录 一、Harris角点检测二、C代码三、python代码四、结果展示1、原始图像2、Harris角点 一、Harris角点检测 角点原理来源于人对角点的感性判断,即图像在各个方向灰度有明显变化。算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化,所以…

Harris角点检测

目录 一.基本原理 1.基本思想 2.数学模型 二.实现代码 三.实验结果与分析 1.场景一:纹理平坦场景 2.场景二:多水平边缘场景 3.场景三:角点丰富场景 四.实验总结 一.基本原理 1.基本思想 判断图像的角点,可以利用卷积窗…

harris角点检测原理

目录 1、角点概述 2、数学知识 3、Harris角点检测基本原理 4、优化改进 1、角点概述 如果一个点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点,也就是一阶导数(即灰度图的梯度)中的局部最大所对应的像素点就是角点。在现…

计算机视觉(角点检测)- 1 - Harris角点检测

计算机视觉(角点检测)- 1 - Harris角点检测 学习前言一、Harris角点检测  1、什么是角点?  2、Harris角点检测的基本原理&基本思想  3、Harris角点检测的数学表达  4、获取点数据后,计算 I x , I y I_x&#x…

Visual Studio的sln工程设置VTK、ITK项目

Visual Studio的sln工程设置VTK、ITK项目 最近在学习使用VTK和ITK,使用Visual Studio新建Qt项目时发现项目不是使用过去使用的CMake组织,而是使用的Visual Studio默认的.sln文件,便学习了一下使用Visual Studio的sln工程设置VTK、ITK项目&am…

windows sln的qt 工程

看起来应该vs开发 qt项目不需要qtcreator? 画界面应该还是需要的。装一个vs的插件 2019的如果打开的工程跟你本地的qt不一致 在工程名字上右键change qt version弹出一个框框,里面有俩这里应该选第一个,这个是我本地安装的,vs2015 x86 版本windows sln 工程【这个新建一个q…