Matlab实现Harris角点检测算法

角点

一般的角点检测都是对有具体定义的、或者是能够具体检测出来的兴趣点的检测。这意味着兴趣点可以是角点,也可以是在某些属性上强度最大或者最小的孤立点、线段的终点,或者是曲线上局部曲率最大的点。在实践中,通常大部分称为角点检测的方法检测的都是兴趣点,而不是独有的角点。因此,如果只要检测角点的话,需要对检测出来的兴趣点进行局部检测,以确定出哪些是真正的角点。

目前的角点检测算法可归纳为3类:基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。对灰度图像、二值图像、边缘轮廓曲线的角点检测算法进行综述,分析了相关的算法,并对各种检测算法给出了评价。(源自百度百科)

Harris角点检测算法步骤

  1. 利用水平、竖直差分算子对图像每个像素进行滤波以求得Ix、Iy,进而求得M中的四个元素的值(可以使用filter2,也可以使用imfilter,不过后者需要转double类型,因为det输入为double型矩阵)

在这里插入图片描述

  1. 对M的四个元素进行高斯平滑滤波,为的是消除一些不必要的孤立点和凸起,得到新的矩阵M(M实际上只能算得上是2x2矩阵,Ix2等代表图像变换矩阵中的点)
  2. 计算M对应每个像素的角点响应函数R的值,R的不同值代表的意义如下:

在这里插入图片描述
4. 取适当阈值,当R(i,j)大于该阈值,且为邻域中最大值,则认为该点为角点。

Matlab实现

clc;clear;close all;

img=imread('test.png');
subplot(121),imshow(img),title('原图');
img_gray=rgb2gray(img);

psf=fspecial('gaussian',[5,5],1);
Ix=filter2([-1,0,1],img_gray);
Iy=filter2([-1,0,1]',img_gray);
Ix2=filter2(psf,Ix.^2);
Iy2=filter2(psf,Iy.^2);
Ixy=filter2(psf,Ix.*Iy);

[m,n]=size(img_gray);
R=zeros(m,n);
max=0;
for i=1:m
    for j=1:n
        M=[Ix2(i,j),Ixy(i,j); Ixy(i,j),Iy2(i,j)];
        R(i,j)=det(M)-0.05*(trace(M))^2;
        if R(i,j)>max
            max=R(i,j);
        end
    end
end

thresh=0.1;%阈值可调
tmp=zeros(m,n);
neighbours=[-1,-1;-1,0;-1,1;0,-1;0,1;1,-1;1,0;1,1];
for i=2:m-1
    for j=2:n-1
        if R(i,j)>thresh*max
            for k=1:8
                if R(i,j)<R(i+neighbours(k,1),j+neighbours(k,2))
                    break;
                end
            end
            if k==8
                tmp(i,j)=1;
            end
        end
    end
end

subplot(122),imshow(img),title('角点检测');
hold on;
for i=2:m-1
    for j=2:n-1
        if tmp(i,j)==1
            plot(j,i,'rx')
        end
    end
end
hold off;      

代码效果如下:

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值