Harris角点检测算法的实现(详细版)

article/2025/10/8 1:59:40


前言

一、角点是神马?

角点被定义为图像边缘曲线上曲率极大值的点或图像亮度变化剧烈的点 ,这些点既保留了图像的重要特征,又有效地减少了信息的数据量。

二、Harris角点检测算法原理

Harris算法以 Morave算法为基础,如果某一点朝任一方向发生小小的偏移都能引起灰度的较大变化 ,那么就认为该点是角点.简单易学的解释,但想要详细了解Harris算法可查看我推荐的博文。

图像特征之Harris角点检测_skycrygg的博客-CSDN博客_harris角点检测

步骤

1.计算x y 方向的梯度值Mat_x,Mat_y

代码如下(示例):

//Step1//1.1 创建x与y方向内核Mat xKernel = (Mat_<double>(1, 3) << -1, 0, 1);//[-1,0,1] x方向Mat yKernel = xKernel.t();//反转矩阵。 该方法通过矩阵表达式进行矩阵求逆。//Mat yKernel = (Mat_<double>(3, 1) << -1, 0, 1);//[-1//    0//    1] y方向//1.2卷积获取x与y方向的梯度值Mat Ix, Iy;filter2D(gray, Ix, CV_64F, xKernel);filter2D(gray, Iy, CV_64F, yKernel);

2.计算Mat_xx,Mat_yy,Mat_xy

代码如下(示例):

//Step2//计算Mat_xx,Mat_yy,Mat_xyMat Ix2, Iy2, Ixy;Ix2 = Ix.mul(Ix);// 执行两个矩阵按元素相乘 获取Mat_xx。Iy2 = Iy.mul(Iy);// 执行两个矩阵按元素相乘 获取Mat_yy。Ixy = Ix.mul(Iy);// 执行两个矩阵按元素相乘 获取Mat_xy。

3.利用高斯函数对Mat_xx,Mat_yy,Mat_xy进行滤波

代码如下(示例):

//Step3//3.1获取高斯滤波内核Mat gaussKernel = getGaussianKernel(7,1);//3.2利用高斯函数对Mat_xx,Mat_yy,Mat_xy进行滤波filter2D(Ix2, Ix2, CV_64F, gaussKernel);filter2D(Iy2, Iy2, CV_64F, gaussKernel);filter2D(Ixy, Ixy, CV_64F, gaussKernel);

4.计算局部特征结果矩阵M的特征值和响应函数

代码如下(示例):

//Step4//计算局部特征结果矩阵M的特征值和响应函数//C(i,j) = Det(M) - k(trace(M)^2) k∈(0.04,0.06]Mat cornerStrength(gray.size(),CV_64F);int width = gray.size().width;int height = gray.size().height;for (int h = 0; h < height; h++){for (int w = 0; w < width; w++){//M = [Ix2,Ixy//       Ixy,Iy2]//det = Ix2 * Ix2 - Ixy^2//trace = Ix2 + Iy2//C = det - k * tracedouble det_m = Ix2.at<double>(h, w) * Iy2.at<double>(h, w) - pow(Ixy.at<double>(h, w), 2);double trace_m = Ix2.at<double>(h, w) + Iy2.at<double>(h, w);cornerStrength.at<double>(h, w) = det_m - k * trace_m * trace_m;}}

5.将计算完的响应函数的值C进行非极大值抑制,滤除边缘与非角点的点,保留满足大于设定的阈值的区域

代码如下(示例):

//Step5//5.1寻找最大值double maxStrength;minMaxLoc(cornerStrength,NULL,&maxStrength,NULL,NULL);//5.2非极大值抑制Mat dilated;dilate(cornerStrength,dilated,Mat());Mat localMax;compare(cornerStrength,dilated,localMax,CMP_EQ);//5.3保留满足大于设定的阈值Mat cornerMap;double qualityLevel = 0.01;double thresh = qualityLevel * maxStrength;cornerMap = cornerStrength > thresh;// 大于标识符重载函数// 等同于threshold(cornerStrength,cornerMap,thresh,255,THRESH_BINARY)bitwise_and(cornerMap,localMax,cornerMap);

6.找出角点

代码如下(示例):

// Iterate over the pixels to obtain all feature points 迭代像素以获得所有特征点for (int y = 0; y < cornerMap.rows; y++) {const uchar* rowPtr = cornerMap.ptr<uchar>(y); //行指针for (int x = 0; x < cornerMap.cols; x++) {// if it is a feature point 如果是特征点(像素值非0值为特征点)if (rowPtr[x]) {points.push_back(cv::Point(x, y));}}}

三、Harris角点算法的实现(完整版)

//算法原理步骤
//1.计算x y 方向的梯度值Mat_x,Mat_y
//2.计算Mat_xx,Mat_yy,Mat_xy
//3.利用高斯函数对Mat_xx,Mat_yy,Mat_xy进行滤波
//4.计算局部特征结果矩阵M的特征值和响应函数
//C(i,j) = Det(M) - k(trace(M)^2) k∈(0.04,0.06]
//5.将计算完的响应函数的值C进行非极大值抑制,滤除边缘与非角点的点,保留满足大于设定的阈值的区域
//6.找出角点void myDetecHarrisCornerAlgorithm(const Mat& src, vector<cv::Point> &points, double k)
{Mat gray;if (src.channels() == 3){cvtColor(src, gray, COLOR_BGR2GRAY);}else if (src.channels() == 1){gray = src.clone();}else{cout << "Image channnels is Error! " << endl;return ;}gray.convertTo(gray,CV_64F);//Step1//1.1 创建x与y方向内核Mat xKernel = (Mat_<double>(1, 3) << -1, 0, 1);//[-1,0,1] x方向Mat yKernel = xKernel.t();//反转矩阵。 该方法通过矩阵表达式进行矩阵求逆。//Mat yKernel = (Mat_<double>(3, 1) << -1, 0, 1);//[-1//	0//	1] y方向//1.2卷积获取x与y方向的梯度值Mat Ix, Iy;filter2D(gray, Ix, CV_64F, xKernel);filter2D(gray, Iy, CV_64F, yKernel);//Step2//计算Mat_xx,Mat_yy,Mat_xyMat Ix2, Iy2, Ixy;Ix2 = Ix.mul(Ix);// 执行两个矩阵按元素相乘 获取Mat_xx。Iy2 = Iy.mul(Iy);// 执行两个矩阵按元素相乘 获取Mat_yy。Ixy = Ix.mul(Iy);// 执行两个矩阵按元素相乘 获取Mat_xy。//Step3//3.1获取高斯滤波内核Mat gaussKernel = getGaussianKernel(7,1);//3.2利用高斯函数对Mat_xx,Mat_yy,Mat_xy进行滤波filter2D(Ix2, Ix2, CV_64F, gaussKernel);filter2D(Iy2, Iy2, CV_64F, gaussKernel);filter2D(Ixy, Ixy, CV_64F, gaussKernel);//Step4//计算局部特征结果矩阵M的特征值和响应函数//C(i,j) = Det(M) - k(trace(M)^2) k∈(0.04,0.06]Mat cornerStrength(gray.size(),CV_64F);int width = gray.size().width;int height = gray.size().height;for (int h = 0; h < height; h++){for (int w = 0; w < width; w++){//M = [Ix2,Ixy//	   Ixy,Iy2]//det = Ix2 * Ix2 - Ixy^2//trace = Ix2 + Iy2//C = det - k * tracedouble det_m = Ix2.at<double>(h, w) * Iy2.at<double>(h, w) - pow(Ixy.at<double>(h, w), 2);double trace_m = Ix2.at<double>(h, w) + Iy2.at<double>(h, w);cornerStrength.at<double>(h, w) = det_m - k * trace_m * trace_m;}}//Step5//5.1寻找最大值double maxStrength;minMaxLoc(cornerStrength,NULL,&maxStrength,NULL,NULL);//5.2非极大值抑制Mat dilated;dilate(cornerStrength,dilated,Mat());Mat localMax;compare(cornerStrength,dilated,localMax,CMP_EQ);//5.3保留满足大于设定的阈值Mat cornerMap;double qualityLevel = 0.01;double thresh = qualityLevel * maxStrength;cornerMap = cornerStrength > thresh;// 大于标识符重载函数// 等同于threshold(cornerStrength,cornerMap,thresh,255,THRESH_BINARY)bitwise_and(cornerMap,localMax,cornerMap);//Step6// Iterate over the pixels to obtain all feature points 迭代像素以获得所有特征点for (int y = 0; y < cornerMap.rows; y++) {const uchar* rowPtr = cornerMap.ptr<uchar>(y); //行指针for (int x = 0; x < cornerMap.cols; x++) {// if it is a feature point 如果是特征点(像素值非0值为特征点)if (rowPtr[x]) {points.push_back(cv::Point(x, y));}}}}

四.角点检测效果

          

总结


http://chatgpt.dhexx.cn/article/4ab5u2LI.shtml

相关文章

harris角点检测算法实现

算法流程&#xff1a; 1、将图像转换为灰度图像&#xff1b; 2、利用Sobel滤波器求出 海森矩阵 (Hessian matrix) : 3、将高斯滤波器分别作用于Ix、Iy、IxIy&#xff1b; 4、计算每个像素的 R det(H) - k(trace(H))。det(H)表示矩阵H的行列式&#xff0c;trace表示矩阵H的迹。通…

Python计算机视觉——Harris角点检测

Python计算机视觉——Harris角点检测 文章目录 Python计算机视觉——Harris角点检测写在前面1 Harris角点检测基本思想2 Harris角点检测公式推导3 实验分析 写在前面 在传统目标识别中&#xff0c;特征提取是最终目标识别效果好坏的一个重要决定因素&#xff0c;因此&#xff…

Harris角点检测原理-

本文是本人看bilibili教学结合官方文档的观后笔记&#xff0c;链接在下&#xff1a; &#xff08;全&#xff09;基于python的Opencv项目实战_哔哩哔哩_bilibili 如果有什么理解不到位的地方&#xff0c;欢迎指正。 理论&#xff1a; 先放角点定义&#xff08;百度百科&…

计算机视觉(二)HARRIS角点检测算法与SIFT

文章目录 前言一、HARRIS角点检测算法1.什么是角点&#xff08;corner points&#xff09;2.角点检测算法的基本思想3.什么是好的角点检测算法4.角点特征的数学刻画5.度量角点响应6.HARRIS角点检测器的响应函数7.HARRIS角点检测算法的优点8.HARRIS角点检测算法的缺点9.HARRIS角…

【特征检测】Harris角点检测中的数学推导

简介 本文主要是对Harris角点检测的数学公式进行推导&#xff0c;更加深入的掌握原理性的理论知识。 预备知识 椭圆的矩阵方程表示 在高中课本中&#xff0c;我们学习到标准椭圆及其方程&#xff08;如下图所示&#xff09;&#xff1a; 其实&#xff0c;矩阵在运算中使用非…

Matlab实现Harris角点检测

一、代码 close all; clc; % 读取图像信息&#xff08;原图为灰度图&#xff09; img imread(lena.bmp); [m,n] size(img); % 先在原图外围扩展一圈 tmp zeros(m2,n2); tmp(2:m1,2:n1) img; % 初始化各一阶偏导矩阵 Ix zeros(m2,n2); Iy zeros(m2,n2); E zeros(m2,n2);…

角点检测和匹配之Harris与FAST角点检测

这一章主要内容&#xff1a; 1. Harris角点检测 2. FAST特征检测 3. 尺度不变的SURF特征检测 4.SURF检测描述 一、引言 在计算机视觉中&#xff0c;特征点或称兴趣点&#xff0c;角点(即图像的极值点&#xff0c;线段的终点&#xff0c;曲线曲率最大的点或水平、竖直方向上属性…

Matlab实现Harris角点检测算法

角点 一般的角点检测都是对有具体定义的、或者是能够具体检测出来的兴趣点的检测。这意味着兴趣点可以是角点&#xff0c;也可以是在某些属性上强度最大或者最小的孤立点、线段的终点&#xff0c;或者是曲线上局部曲率最大的点。在实践中&#xff0c;通常大部分称为角点检测的…

Harris 角点检测原理及实现

1. 图像中角点定义 沿各个方向&#xff0c;图像灰度均发生变化&#xff1b; 2.Harris原理 Harris中也是根据角点定义经角点定义&#xff0c;Harris中使用该像素点周围像素块和其周围的其它像素块的相关性刻画角点&#xff0c;相关性用平方差之和进行计算(SSD)&#xff0c;SS…

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

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

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

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

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

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

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

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

Harris角点检测 及 Matlab实验

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

Harris的角点检测和特征匹配

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

Harris角点及Shi-Tomasi角点检测

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

Harris角点检测算法详解

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

Harris角点检测算子

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

特征检测之Harris角点检测

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

Harris角点检测原理分析

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