【图像检测】基于 Harris算法实现角点特征检测matlab代码

221 阅读2分钟

1 简介

Harris 算子是一种计算简单、应用广泛的角点检测算子,只使用灰度的一阶差分和滤波,可以定量地提取特征角点并且提取的角点特征均匀。由于计算过程用到图像的一阶导数,故对存在灰度变化、图像旋转、视点变换和噪声干扰的图像也能稳定地提取角点。因此本文提出的算法采用 Harris 角点作为兴趣点,并提取每个兴趣点为中心的邻域内空域的五个均值特征形成特征向量,通过位置转移向量的频率统计连接标志匹配点。

2 完整代码

clc; clear all; close all;
I = checkerboard(50,3,3);
I=rgb2gray(imread('1.png'));
h = fspecial('gaussian',[5 5],2);
% harris(I,0.05,0.01,h);
cp=corner(I);
  imshow(I)
  hold on
  plot(cp(1,1),cp(1,2),'ro');hold on
  plot(cp(2,1),cp(2,2),'ro');hold on
    plot(cp(3,1),cp(3,2),'ro');hold on
    
      plot(cp(4,1),cp(4,2),'ro');hold on
        plot(cp(5,1),cp(5,2),'ro');hold on
  plot(cp(10,1),cp(10,2),'ro');
%     title('MATLAB自带CORNER函数')
function varargout=harris(I,k,q,h)
narginchk(0,4);
nargoutchk(0,2);
if nargin<1
  I=checkerboard(50,2,2);
end
if nargin<2
  k=0.04;
end
if nargin<3
  q=0.01;
end
if nargin<3
  h=fspecial('gaussian',[5 5],1.5);
end
fx=[-2,-1,0,1,2];
Ix=filter2(fx,I);
fy=[-2,-1,0,1,2]';
Iy=filter2(fy,I);
Ix2=filter2(h,Ix.^2);
Iy2=filter2(h,Iy.^2);
Ixy=filter2(h,Ix.*Iy);
rfcn=@(a,b,c)(a*b-c^2)-k*(a+b)^2;
R=arrayfun(rfcn,Ix2,Iy2,Ixy);
R(R < q*max(R(:)))=0;
[xp,yp]=find(imregionalmax(R,8));
if nargout==0
  subplot(121)
  imshow(I);
  hold on;
  plot(xp,yp,'ro');
  title('自己编写HARRIS算法')
  subplot(122)
  cp=corner(I);
  imshow(I)
  hold on
  plot(cp(:,1),cp(:,2),'ro');
  title('MATLAB自带CORNER函数')
elseif nargout==1
  varargout={[xp,yp]};
elseif nargout==2
  varargout={xp,yp};
end

3 仿真结果

4 参考文献

[1]滕书娟, 李琳琳, & 唐春鸽. (2011). 基于harris角点的视频图像检测算法的研究. 辽宁大学学报:自然科学版(3), 4.

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页