Harris角点检测 及 Matlab实验

article/2025/10/8 3:39:07

目录

1 基础知识

1.1 图像变化的类型

1.2 提取点特征的作用

1.3 什么是好的角点检测算法?

2 Harris 角点检测

2.1 Harris角点检测基本思想

2.2 Harris角点检测:数学描述

3 总结

4 Matlab 实验

参考资料


角点是图像重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配和实时处理。下面将介绍Harris角点检测 及 Matlab实验。

 

1 基础知识

1.1 图像变化的类型

 

1.2 提取点特征的作用

图像的点特征是许多计算机视觉算法的基础:使用特征点来代表图像的内容,在运动目标跟踪、物体识别、图像配准、全景图像拼接 和 三维重建 等方向有较多的用处。

有一类重要的点特征:角点(corner points)

角点(corner points):局部窗口沿各方向移动,均产生明显变化的点,图像局部曲率突变的点

典型的角点检测算法:Harris角点检测 , CSS角点检测等。下图展示的是不同学者提出的角点检测算法。

 

下图为不同类型的角点,那么,怎么才算的好的角点检测算法呢?下面将慢慢介绍。

 

1.3 什么是好的角点检测算法?

(1)检测出图像中“真实的”角点;

(2)准确的定位性能;

(3)很高的重复检测率(稳定性好);

(4)具有对噪声的鲁棒性;

(5)具有较高的计算效率。


 

Harris 角点检测

1988年,Harris提出角点检测的方法效果较好。从谷歌学术来看,引用已达到1万6千多次,佩服佩服。

 

2.1 Harris角点检测基本思想

基本思想:从图像局部的小窗口观察图像特征。

角点定义:窗口向任意方向的移动都导致图像灰度的明显变化。

 

 

2.2 Harris角点检测:数学描述

将图像窗口平移 [u,v] 产生灰度变化 E(u,v)

                                                            E(u,v) = \sum\limits_{x,y} {w(x,y){​{\left[ {I(x + u,y + v) - I(x,y)} \right]}^2}}

由:I(x + u,y + v) = I(x,y) + {I_x}u + {I_y}v + O({u^2},{v^2})

得到:

                                                            E(u,v) = \sum\limits_{x,y} {w(x,y){​{\left[ {​{I_x}u + {I_y}v + O({u^2},{v^2})} \right]}^2}}

                                                              {\left[ {​{I_x}u + {I_y}v} \right]^2} = [u,v]\left[ {\begin{array}{*{20}{c}} {I_x^2}&{​{I_x}{I_y}}\\ {​{I_x}{I_y}}&{I_y^2} \end{array}} \right]\left[ {\begin{array}{*{20}{c}} u\\ v \end{array}} \right]

于是对于局部微小的移动量 [u,v] ,可以近似得到下面的表达:

                                                                              E(u,v) \cong \left[ {u,} \right.\left. v \right]\begin{array}{*{20}{c}} {} \end{array}M\begin{array}{*{20}{c}} {} \end{array}\left[ {\begin{array}{*{20}{c}} u\\ v \end{array}} \right]

其中,M2 \times 2 矩阵,可由图像的导数求得:

                                                                         M = \sum\limits_{x,y} {w(x,y)\left[ {\begin{array}{*{20}{c}} {I_x^2}&{​{I_x}{I_y}}\\ {​{I_x}{I_y}}&{I_y^2} \end{array}} \right]}

窗口移动导致的图像变化:实对称矩阵M的特征值分析

                                                                              E(u,v) \cong \left[ {u,} \right.\left. v \right]\begin{array}{*{20}{c}} {} \end{array}M\begin{array}{*{20}{c}} {} \end{array}\left[ {\begin{array}{*{20}{c}} u\\ v \end{array}} \right]

其中,M的特征值{\lambda _{\max }},{\rm{ }}{\lambda _{\min }} 。

 

 

 

定义角点响应函数R

                                                                             R = \det M - k{\left[ {​{\mathop{\rm trace}\nolimits} (M)} \right]^2}

其中,\det M = {\lambda _1}{\lambda _2}{\text{ , trace (}}M) = {\lambda _1} + {\lambda _2} 。

 

 

Harris角点检测结果如下图所示:


 

3 总结

上面是Harris角点检测的数学推导,通过查阅相关文献,对Harris角点检测的推导过程进行整理,其简要步骤如下:

Harris角点检测器分为三步:梯度计算矩阵形成 特征值计算。首先,计算 x 和 y 方向上的平滑 (使用高斯函数) 梯度来检测给定灰度图像 I(x,y) 中的角点,由下面的式子给出:

                                                                           {g_x}(x,y) = \frac{​{ - x}}{​{2\pi \tau _g^4}}\exp \left( { - \frac{​{​{x^2} + {y^2}}}{​{2\tau _g^2}}} \right)

                                                                           {g_y}(x,y) = \frac{​{ - y}}{​{2\pi \tau _g^4}}\exp \left( { - \frac{​{​{x^2} + {y^2}}}{​{2\tau _g^2}}} \right)

其中,{\tau _g} 是平滑参数。

计算图像I(x,y) 的平滑梯度为:

                                                                               {I_x} = {g_x}(x,y) \otimes I(x,y)

                                                                              {I_y} = {g_y}(x,y) \otimes I(x,y)

其中,“ \otimes ” 表示二维卷积运算。

Harris角点检测器依赖于计算一个矩阵(与自相关函数有关),由下面的式子给出:

                                                                              A(x,y) = \left( {\begin{array}{*{20}{c}} {​{a_{xx}}}&{​{a_{xy}}}\\ {​{a_{xy}}}&{​{a_{yy}}} \end{array}} \right)

其中,

                                                                              {a_{xx}} = {\sum\limits_{​{x_i} \in W} {\sum\limits_{​{​{\text{y}}_i} \in W} {[{I_x}({x_i},{y_i})]} } ^2}

                                                                              {a_{yy}} = {\sum\limits_{​{x_i} \in W} {\sum\limits_{​{​{\text{y}}_i} \in W} {[{I_y}({x_i},{y_i})]} } ^2}

                                                                        {a_{xy}} = \sum\limits_{​{x_i} \in W} {\sum\limits_{​{​{\text{y}}_i} \in W} {​{I_x}({x_i},{y_i})} } {I_y}({x_i},{y_i})

从上面的式子可以看出,{a_{xx}},{a_{yy}} 和 {a_{xy}} 表示平均梯度幅值,矩阵A 的特征值提供关于给定位置的边缘的信息。如果给定位置的矩阵的特征值都很大,那么大部分区域均为角点。Harris通过计算响应函数可以避免精确的特征值计算,由下面的式子给出:

                                                                               R = \det A - k{\left[ {​{\mathop{\rm trace}\nolimits} (A)} \right]^2}

其中,\det A = {\lambda _1}{\lambda _2}{\text{ , trace (}}A) = {\lambda _1} + {\lambda _2} , k是可调参数,一般设置在区间 [0.04, 0.06] 内。通过判定 R 大小来判断像素点是否为角点,对于角点\left| R \right| 的值很;而平坦的区域\left| R \right| 的值很

 


 

4 Matlab 实验

 

Harris角点检测 Matlab 代码如下:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Harris角点检测算法 Matlab code
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; clc ;tic;ori_im = imread('lena.tiff');     % 读取图像if(size(ori_im,3)==3)ori_im = rgb2gray(uint8(ori_im));  %转为灰度图像
end% fx = [5 0 -5;8 0 -8;5 0 -5];          % 高斯函数一阶微分,x方向(用于改进的Harris角点提取算法)
fx = [-2 -1 0 1 2];                 % x方向梯度算子(用于Harris角点提取算法)
Ix = filter2(fx,ori_im);              % x方向滤波
% fy = [5 8 5;0 0 0;-5 -8 -5];          % 高斯函数一阶微分,y方向(用于改进的Harris角点提取算法)
fy = [-2;-1;0;1;2];                 % y方向梯度算子(用于Harris角点提取算法)
Iy = filter2(fy,ori_im);              % y方向滤波
Ix2 = Ix.^2;
Iy2 = Iy.^2;
Ixy = Ix.*Iy;
clear Ix;
clear Iy;h= fspecial('gaussian',[7 7],2);      % 产生7*7的高斯窗函数,sigma=2Ix2 = filter2(h,Ix2);
Iy2 = filter2(h,Iy2);
Ixy = filter2(h,Ixy);height = size(ori_im,1);
width = size(ori_im,2);
result = zeros(height,width);         % 纪录角点位置,角点处值为1R = zeros(height,width);
for i = 1:heightfor j = 1:widthM = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)];             % auto correlation matrixR(i,j) = det(M)-0.06*(trace(M))^2;   end
end
cnt = 0;
for i = 2:height-1for j = 2:width-1% 进行非极大抑制,窗口大小3*3if  R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1)result(i,j) = 1;cnt = cnt+1;endend
end
Rsort=zeros(cnt,1);
[posr, posc] = find(result == 1);
for i=1:cntRsort(i)=R(posr(i),posc(i));
end
[Rsort,ix]=sort(Rsort,1);
Rsort=flipud(Rsort);
ix=flipud(ix);
ps=100;
posr2=zeros(ps,1);
posc2=zeros(ps,1);
for i=1:psposr2(i)=posr(ix(i));posc2(i)=posc(ix(i));
endimshow(ori_im);
hold on;
plot(posc2,posr2,'g+');toc;

 

运行结果如下图所示:

 

C++实验代码可参见:https://blog.csdn.net/linqianbi/article/details/78930239


 

参考资料

[1] C.Harris, M.Stephens. “A Combined Corner and Edge Detector”. Proc. of 4th Alvey Vision Conference, 1988.

[2] Harris角点检测 PPT

[3] https://blog.csdn.net/u010703122/article/details/49308153

[4] https://blog.csdn.net/woxincd/article/details/60754658

[5] https://blog.csdn.net/linqianbi/article/details/78930239

 


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

相关文章

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…

Visual studio 2015修改项目文件名及.sln文件名

Visual studio 2015修改项目文件名及.sln文件名: 问题描述 提示:在使用原有的项目代建一个新项目时,为了方便区分与原项目,故要修改该项目的项目名。 如图: 需要将QtGuiApplication1.vcxproj修改成CARFILM.vcxproj&…

C# 解析 sln 文件

我的项目,编码工具 需要检测打开一个工程,获取所有项目。 但是发现原来的方法,如果存在文件夹,把项目放在文件夹中,那么是无法获得项目,于是我就找了一个方法去获得sln文件的所有项目。 原先使用的方法dte…

Visual studio无法打开C#\.sln文件,不兼容

23/7/19文章更新:后来我总结了我这个问题出现的原因,是因为我的VS是2015版本,本来安装在笔记本电脑上,为了转到台式机,直接U盘复制过来的,然后复制过来安装的时候提示某个东西安装失败,我就点击…

.sln图标异常修复

.sln图标显示异常 本人就喜欢新版本的东西,电脑上安装过vs2017,vs2019,想体验最新的vs2022是什么感觉,之后sln图标显示异常,不太顺眼 这是由于该文件VSFileHandler_64.dll异常带来的问题,下载我提供的文件&#xff0c…

Visual Studio打开无sln项目,修复无效sln文件

Visual Studio打开无sln项目,修复无效sln文件 打开项目文件地址(可在项目名右键-在文件资源管理器中打开文件夹) 打开-项目名.vcxproj文件 VC左上角点击全部保存,选择保存位置储存新的sln头文件 4.sln文件修复完成