Harris 角点检测
一 、Motivation
对于做图像处理的人来说,Harris角点检测肯定听过,1988年发表的文章“A combined corner and edge detector”描述了这种角点检测方法,这篇论文朴实无华,对于图像处理入门来说,非常值得读一读。
Harris角点检测的提出是图像匹配问题的需求,在立体视觉(stereo vision)和运动估计(motion estimation)中,常常需要在两个view(立体视觉)或者同一视频的两帧(运动估计)中找到对应的特征(correspondence feature),如下图1.1所示。
图 1.1
以patch matching 为例,若在两个view中提取出来的patch 如下图1.2,那么匹配两幅图中相似的patch是比较容易的,
图 1.2
而如果两个view中提取出来的patch如下图1.3,那么匹配就不那么容易了,
图 1.3
为什么呢?因为图1.2中的patch很独特,信息丰富,图1.3 中的patch单独看来毫无特点,极易混淆。我们称图1.2中的特征为“好特征”,图1.3中的特征是”坏特征“。
那么什么是好特征,什么是坏特征?我认为有两个要考虑的:1 稳定,对缩放,视角变换,光线变化等稳定 2.易区分 。
角点就具有这样的特征,角点如何描述,请看图1.4,
图1.4
上图具体解释是这样的,给定一个窗口,如果包含角点,那么这个窗口平移(u,v)个单位,不管这个平移是往哪个方向,窗口中像素对应位置的变化都比较大,而如果包含的是一条边缘,在沿着边缘平移窗口时,窗口中像素强度变化基本没有,而垂直于边缘移动时,变化强烈,对于平坦区域,怎么移动都没有多大变化,当然,这里的平移都是小范围平移。
二、Mathematics representation
数学描述这种强度变化如下图2.1.
图2.1
可以看到,这个公式表示往各个方向移动时强度变化的累加和,控制w就可以控制平移后强度累加的方式。
然后用一级泰勒展开近似I(x+u,y+v)-I(x,y),并将上图的公式用矩阵的形式表达出来,有:
图2.2
最后 E(u,v) 可以表示为:
图 2.3
注意到此时M是对称矩阵,可以表示为M = Q A QT 的形式 ,A 为对角矩阵,因此,对角中即为M的特征值,因此,一定要M的2个特征值都比较大才能保证E总是很大。
实际计算过程中,用高斯核来表示w(x,y).
Harris 角点检测的过程如下:
图2.4
需要注意的是,求微分图像和第三步的W矩阵都是可以调节或者换成其他形式的,W换成高斯核主要是利用了它各项同性的性质。
三、implementation
最终matlab代码(转自网上)实现如下:
% Harris detector % The code calculates % the Harris Feature Points(FP) % % When u execute the code, the test image file opened % and u have to select by the mouse the region where u % want to find the Harris points, % then the code will print out and display the feature % points in the selected region. % You can select the number of FPs by changing the variables % max_N & min_N % A. Ganoun load Imag I =double(frame); %**************************** imshow(frame); k = waitforbuttonpress; point1 = get(gca,'CurrentPoint'); %button down detected rectregion = rbbox; %%%return figure units point2 = get(gca,'CurrentPoint');%%%%button up detected point1 = point1(1,1:2); %%% extract col/row min and maxs point2 = point2(1,1:2); lowerleft = min(point1, point2); upperright = max(point1, point2); ymin = round(lowerleft(1)); %%% arrondissement aux nombrs les plus proches ymax = round(upperright(1)); xmin = round(lowerleft(2)); xmax = round(upperright(2)); %*********************************** Aj=6; cmin=xmin-Aj; cmax=xmax+Aj; rmin=ymin-Aj; rmax=ymax+Aj; min_N=12;max_N=16; %%%%%%%%%%%%%%Intrest Points %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sigma=2; Thrshold=20; r=6; disp=1; dx = [-1 0 1; -1 0 1; -1 0 1]; % The Mask dy = dx'; %%%%%% Ix = conv2(I(cmin:cmax,rmin:rmax), dx, 'same'); Iy = conv2(I(cmin:cmax,rmin:rmax), dy, 'same'); g = fspecial('gaussian',max(1,fix(6*sigma)), sigma); %%%%%% Gaussien Filter %%%%% Ix2 = conv2(Ix.^2, g, 'same'); Iy2 = conv2(Iy.^2, g, 'same'); Ixy = conv2(Ix.*Iy, g,'same'); %%%%%%%%%%%%%% k = 0.04; R11 = (Ix2.*Iy2 - Ixy.^2) - k*(Ix2 + Iy2).^2; R11=(1000/max(max(R11)))*R11; R=R11; ma=max(max(R)); sze = 2*r+1; MX = ordfilt2(R,sze^2,ones(sze)); R11 = (R==MX)&(R>Thrshold); count=sum(sum(R11(5:size(R11,1)-5,5:size(R11,2)-5))); figure;plot(R11); loop=0; while (((count<min_N)|(count>max_N))&(loop<30)) if count>max_N Thrshold=Thrshold*1.5; elseif count < min_N Thrshold=Thrshold*0.5; end R11 = (R==MX)&(R>Thrshold); count=sum(sum(R11(5:size(R11,1)-5,5:size(R11,2)-5))); loop=loop+1; end R=R*0; R(5:size(R11,1)-5,5:size(R11,2)-5)=R11(5:size(R11,1)-5,5:size(R11,2)-5); [r1,c1] = find(R); PIP=[r1+cmin,c1+rmin];%% IP %%%%%%%%%%%%%%%%%%%% Display Size_PI=size(PIP,1); for r=1: Size_PI I(PIP(r,1)-2:PIP(r,1)+2,PIP(r,2)-2)=255; I(PIP(r,1)-2:PIP(r,1)+2,PIP(r,2)+2)=255; I(PIP(r,1)-2,PIP(r,2)-2:PIP(r,2)+2)=255; I(PIP(r,1)+2,PIP(r,2)-2:PIP(r,2)+2)=255; end imshow(uint8(I)) |
Harris 角点检测的更多相关文章
- Harris角点检测算法优化
Harris角点检测算法优化 一.综述 用 Harris 算法进行检测,有三点不足:(1 )该算法不具有尺度不变性:(2 )该算法提取的角点是像素级的:(3 )该算法检测时间不是很令人满意. 基于以上 ...
- Harris角点检测
代码示例一: #include<opencv2/opencv.hpp> using namespace cv; int main(){ Mat src = imread(); imshow ...
- Harris角点检测算原理
主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601 Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的 ...
- Harris角点检测原理分析
看到一篇从数学意义上讲解Harris角点检测很透彻的文章,转载自:http://blog.csdn.net/newthinker_wei/article/details/45603583 主要参考了: ...
- cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测
参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...
- Opencv学习笔记------Harris角点检测
image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...
- harris角点检测的简要总结
目录 1. 概述相关 2. 原理详解 1) 算法思想 2) 数学模型 3) 优化推导 3. 具体实现 1) 详细步骤 2) 最终实现 4. 参考文献 1. 概述相关 harris角点检测是一种特征提取 ...
- OpenCV-Python:Harris角点检测与Shi-Tomasi角点检测
一.Harris角点检测 原理: 角点特性:向任何方向移动变换都很大. Chris_Harris 和 Mike_Stephens 早在 1988 年的文章<A CombinedCorner an ...
- 第十一节、Harris角点检测原理(附源码)
OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...
随机推荐
- Recommender Systems基于内容的推荐
基于内容的推荐的基本推荐思路是:用户喜欢幻想小说,这本书是幻想小说,则用户有可能喜欢这本小说 两方面要求:(1)知道用户的喜好:(2)知道物品的属性 基于内容的推荐相比协同过滤方法(个人观点):协同过 ...
- [转载]EasyUI Pagination 分页的两种做法
EasyUI 的 datagrid 支持服务器端分页,但是官方的资料比较少,以下总结了两种 datagrid 的服务器端分页机制,可根据情况具体使用. 一:使用 datagrid 默认机制 后台: p ...
- jsp关于include html、jsp等文件出现乱码问题的解决方案
一般来说使用jsp标签<jsp:include>引入一个jsp文件: ①可以在被引入的jsp中加入:<%@ page contentType="text/html;char ...
- P117、面试题18:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构.二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNod ...
- c++编写webui内核 .
http://blog.csdn.net/sx1989827/article/details/8068779 #pragma once #include <mshtmhst.h> #inc ...
- MySQL复制应用中继日志解析
前言:SQL线程应用中继日志,在binlog_format是row格式的时候,是居于主键更新,下面结合一张图来证明 1.从一个大神那边得到一张图片,SQL线程应用中继日志流程,下面就实验验证一下:(P ...
- 微软嵌入式WEC2013产品研讨会(深圳站---2013.10.16)
主要内容如下: 1. Windows Embedded Compact 2013面向的市场 主要面向工业自动化.医疗设备和零售行业这些市场,和物联网关系非常紧密. 2. Windo ...
- poj 1129 Channel Allocation ( dfs )
题目:http://poj.org/problem?id=1129 题意:求最小m,使平面图能染成m色,相邻两块不同色由四色定理可知顶点最多需要4种颜色即可.我们于是从1开始试到3即可. #inclu ...
- 函数page_get_space_id
#define FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID 34 /****************************************************** ...
- bzoj1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
筛法. 枚举每个数,它会对它的倍数的答案有贡献. 数大了以后,倍数相应少了很多.比枚举每个数的约数要好的多. 自己yy了一种分步做法.小于sqrt(m)被当作约数枚举,大于sqrt(m)的枚举倍数. ...