一 、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 角点检测的更多相关文章

  1. Harris角点检测算法优化

    Harris角点检测算法优化 一.综述 用 Harris 算法进行检测,有三点不足:(1 )该算法不具有尺度不变性:(2 )该算法提取的角点是像素级的:(3 )该算法检测时间不是很令人满意. 基于以上 ...

  2. Harris角点检测

    代码示例一: #include<opencv2/opencv.hpp> using namespace cv; int main(){ Mat src = imread(); imshow ...

  3. Harris角点检测算原理

    主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601  Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的 ...

  4. Harris角点检测原理分析

    看到一篇从数学意义上讲解Harris角点检测很透彻的文章,转载自:http://blog.csdn.net/newthinker_wei/article/details/45603583 主要参考了: ...

  5. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...

  6. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  7. harris角点检测的简要总结

    目录 1. 概述相关 2. 原理详解 1) 算法思想 2) 数学模型 3) 优化推导 3. 具体实现 1) 详细步骤 2) 最终实现 4. 参考文献 1. 概述相关 harris角点检测是一种特征提取 ...

  8. OpenCV-Python:Harris角点检测与Shi-Tomasi角点检测

    一.Harris角点检测 原理: 角点特性:向任何方向移动变换都很大. Chris_Harris 和 Mike_Stephens 早在 1988 年的文章<A CombinedCorner an ...

  9. 第十一节、Harris角点检测原理(附源码)

    OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...

随机推荐

  1. windows下游戏服务器端框架Firefly安装说明及demo运行

    原地址:http://blog.csdn.net/wangqiuyun/article/details/11150503 本来公司一个网游服务器端选定了pomelo框架,后来出了个Firefly,为做 ...

  2. hbase总结:如何监控region的性能

    转载:http://ju.outofmemory.cn/entry/50064 随着大数据表格应用的驱动,我们的HBase集群越来越大,然而由于机器.网络以及HBase内部的一些不确定性的bug,使得 ...

  3. 阿里云 EDAS-HSF 用户指南

    阿里云 EDAS-HSF 用户指南 针对 EDAS v2.3.0©Alibaba EDAS 项目组2015/8/19 1 前言本文档旨在描述阿里云 EDAS 产品中应用服务化模块的基本概念,以及如何使 ...

  4. BZOJ 4003 JLOI2015 城池攻占

    做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...

  5. java内存模型 年轻代/年老代 持久区

    jvm中的年轻代 老年代 持久代 gc   虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generatio ...

  6. HeadFirst设计模式之适配器模式

    一. 1. 2.The Adapter Pattern converts the interface of a class into another interface the clients exp ...

  7. Ubuntu 学习笔记

    1.   ubuntu开启root账号,设置分配很简单,只要为root设置一个root密码就行了: $ sudo passwd root 之后会提示要输入root用户的密码,连续输入root密码,再使 ...

  8. CentOS 命令随笔

     linux下敲命令时:快速删除当前行已经敲的命令: CTR+U  或者 CTR+/                         快速删除当前行刚输入接近鼠标当前位置的单词:CTR+W 以上在XS ...

  9. AIDL与stub

     Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了.  stub是为了方便client,service交互而生成出来的代码.A ...

  10. WINCE6.0 error C2220: warning treated as error问题解决

    今天在编译IMX515的BSP的时候,发现下面的编译错误问题: BUILD: [00:0000002476:PROGC ] BuildingCOMPILE Pass in F:\WINCE600\PL ...