文档章节

Matlab图像处理学习笔记(五):Harris角点检测

c
 chenyn2014
发布于 2015/01/12 23:39
字数 1010
阅读 243
收藏 2

本文将从Harries角点检测的原理出发,讲述怎么用matlab一步步实现Harris角点检测算法。

matlab可以用corner直接调用Harris角点检测算法,但为了学习如何提取特征点,本文用matlab将其实现,纯粹出于学习目的。由于harris角点特征点相对比较简单,容易实现,这位学习别的特征点检测打下基础。程序中出现的定常数均采用Matlab中corner实现该算法时的默认值。

在实现的过程中,主要是参考了Chris Harris & Mike Stephens在1988年发表的那篇文章A COMBINED CORNER AND EDGE DETECTOR。

本文一部分图像及公式来源于百度文库的一篇PPT:Harris角点检测,可自行检索获得。

转载请注明出处:http://blog.csdn.net/u010278305

本文涉及到的知识点如下:

1、高斯卷积。

2、Harris角点检测。

程序设计流程如下:

1、先将论文涉及该算法的主要部分给出截图:


设计程序时,首先要完成论文的这一部分,计算出A、B、C。

2、运用高斯窗对其进行滤波。

高斯函数如下:

用matlab生成一个高斯卷积核的方法:

h=fspecial('gaussian',[5 1],1.5);
w=h*h';

3、遍历图像的每一点,求其M矩阵,并计算出R(之后用于判断是否是角点)。

M矩阵为:


R的计算方法为:

4、判断是否是角点。

如果R大于0且大于Q*RMax,则认为它是角点,RMax为R的最大值,Q为一个常数系数。

5、对角点进行筛选。只有在8邻域内是最大值的店才会被认为是角点。

下面给出源代码:

%function:
%       Harris角点检测
%注意:
%       matlab自带的corner函数即可实现harris角点检测。但考虑到harris角点的经典性,本程序将其实现,纯粹出于学习目的,了解特征点检测的方法。
%       其中所有参数均与matlab默认保持一致
%referrence:
%      Chris Harris & Mike Stephens,A COMBINED CORNER AND EDGE DETECTOR
%date:2015-1-11
%author:chenyanan
%转载请注明出处:http://blog.csdn.net/u010278305

%清空变量,读取图像
clear;close all
src= imread('images/girl.jpg');

gray=rgb2gray(src);  
gray = im2double(gray);
%缩放图像,减少运算时间
gray = imresize(gray, 0.2);

%计算X方向和Y方向的梯度及其平方
X=imfilter(gray,[-1 0 1]);
X2=X.^2;
Y=imfilter(gray,[-1 0 1]');
Y2=Y.^2;
XY=X.*Y;

%生成高斯卷积核,对X2、Y2、XY进行平滑
h=fspecial('gaussian',[5 1],1.5);
w=h*h';
A=imfilter(X2,w);
B=imfilter(Y2,w);
C=imfilter(XY,w);

%k一般取值0.04-0.06
k=0.04;
RMax=0;
size=size(gray);
height=size(1);
width=size(2);
R=zeros(height,width);
for h=1:height
    for w=1:width
        %计算M矩阵
        M=[A(h,w) C(h,w);C(h,w) B(h,w)];
        %计算R用于判断是否是边缘
        R(h,w)=det(M) - k*(trace(M))^2;
        %获得R的最大值,之后用于确定判断角点的阈值
        if(R(h,w)>RMax)
            RMax=R(h,w);
        end
    end
end

%用Q*RMax作为阈值,判断一个点是不是角点
Q=0.01;
R_corner=(R>=(Q*RMax)).*R;

%寻找3x3邻域内的最大值,只有一个交点在8邻域内是该邻域的最大点时,才认为该点是角点
fun = @(x) max(x(:)); 
R_localMax = nlfilter(R,[3 3],fun); 

%寻找既满足角点阈值,又在其8邻域内是最大值点的点作为角点
%注意:需要剔除边缘点
[row,col]=find(R_localMax(2:height-1,2:width-1)==R_corner(2:height-1,2:width-1));

%绘制提取到的角点
figure('name','Result');
subplot(1,2,1),imshow(gray),title('my-Harris'),
hold on
plot(col,row, 'b*'),
hold off

%用matlab自带的edge函数提取Harris角点,对比效果
C = corner(gray);
subplot(1,2,2),imshow(gray),title('matlab-conner'),
hold on
plot(C(:,1), C(:,2), 'r*');
hold off

下面给出本程序运行效果与matlab的corner运行效果的对比图:


测试文件你可以仔细选取,或者在之前发布的博客中找到。

转载请注明出处:http://blog.csdn.net/u010278305

© 著作权归作者所有

c
粉丝 6
博文 5
码字总数 3545
作品 0
成都
私信 提问

hjimce算法类博文目录 个人博客:http://blog.csdn.net/hjimce 个人qq:1393852684 知乎:https://www.zhihu.com/people/huang-jin-chi-28/activities 一、深度学习 深度学习(七十)darknet...

hjimce
2016/01/24
0
0
数据科学和人工智能技术笔记 四、图像预处理

四、图像预处理 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 图像二值化 图像模糊 图像剪裁 边缘检测 增强彩色图像的对比度 增强灰度图像的对比度 Harris 角点检测 Harris 角点检测...

ApacheCN_飞龙
2018/11/10
0
0
Win8 Metro(C#)数字图像处理--2.36角点检测算法

原文:Win8 Metro(C#)数字图像处理--2.36角点检测算法  [函数名称] Harris角点检测函数 HarrisDetect(WriteableBitmap src, int CRF) [算法说明] 目前的角点检测算法可归纳为3类:基于灰度...

杰克.陈
2018/03/13
0
0
“我爱智能”原创性博客索引

不知不觉,博客也写出了一点小体系,新的阶段已经开始,未来希望再接再厉继续补充这一体系,在成长中写博客,在博客中成长,在此先做一个小的梳理,谢谢大家的支持。 一)关于深度学习系列 ...

on2way
2015/08/29
0
0
[翻译]Harris Corner Detection

这是opencv3.0.0的python版官方文档,原文在这里 目标 这一章节,将 理解Harris角点检测算法背后的原理 学习两个函数:、 理论 上一章,我们知道了角点是图像中各个方向变化强度都很大的区域...

刘开心_8a6c
2018/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)

文字检测是文字识别过程中的一个非常重要的环节,文字检测的主要目标是将图片中的文字区域位置检测出来,以便于进行后面的文字识别,只有找到了文本所在区域,才能对其内容进行识别。 文字检...

雪饼
今天
15
0
思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
今天
10
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
今天
10
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
14
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
13
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部