【图像特征提取】(1) 角点检测

图像特征提取对于图像识别至关重要,其中角点检测是关键的一环。角点是图像中亮度变化剧烈的点,常用于图像识别和定位。本文介绍了图像金字塔、高斯金字塔和拉普拉斯金字塔的概念,重点讲解了基于灰度的Harris角点检测方法,包括计算梯度、构造矩阵、应用高斯函数、Harris响应值计算和非极大值抑制等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在日常生活中,认识、了解一个人就要先了解他的性格、相貌、行为习惯等特征。同样,在对一个图像进行识别和处理中,我们也要提取这幅图像的特征。利用一堆数据来对图像的特征进行描述,即“透过现象看本质”。

对图像的特征分为以下几类:

面特征:

线特征:

局部区域特征:

点特征:

不变点特征:

尺度不变特征:

tuxiangjinzi

图像金字塔

图像经过一个低通滤波器进行平滑,然后对这个图像进行抽样,抽样比例一般为水平方向和竖直方向的1/2,从而能够得到一系列的尺寸缩小、分辨率降低的图像。


高斯金字塔分解:低通滤波和降采样

拉普拉斯金字塔分解:相当于高斯金字塔与其高一级图像内插放大后图像的差,相当于带通滤波。



一 角点检测

1.1 何为角点?

角点并没有很明确的定义,主要指的是轮廓的交点,用数学意义来讲就是图像中亮度变化剧烈的点,或者是边缘中曲率取极大值的点,或者说这个点在邻域中具有两个方向的特征点。角点检测分两类:基于图像边缘的检测方法、基于图像灰度的检测方法。前者往往需要对图像边缘进行编码,这在很大程度上依赖于图像的分割和边缘提取,具有较大的计算量,一旦待检测目标局部发生变化,很可能导致操作失败。后者通过计算点的曲率及梯度来检测角点,避免了第一类方法存在的缺陷,是目前研究的重点,主要有:Moravec算子、Forstner算子、Harris算子、SUSAN算子等。

2 基于灰度的检测方法

2.1 Harris检测方法

算法步骤:

•计算图像x、y两个方向的梯度Ix、Iy
•计算图像两个方向梯度的乘积
•使用高斯函数对Ix.^2、Iy.^2、Ixy进行高斯加权,生成矩阵M的元素A、B、C
•计算每个像元的Harris响应值R,并对小于某阈值的R置为0

•在3X3或者5X5的邻域进行非极大值抑制,局部极大值点即为图像角点

 Harris算法是利用的窗口内图像灰度的自相关性进行的,设定一个窗口,并在图像中移动,计算移动前与移动后窗口所在区域图像的自相关系数。

%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.youkuaiyun.com/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

非极大值抑制操作:

非极大值抑制(NMS)主要是为了更精确的定位某种特征,比如用梯度变化表征边缘时,梯度变化较大的区域通常比较宽,所以利用x和y方向的梯度确定一个法向arctan(y/x),然后在法向上判断当前梯度测量是否是一个峰值(或 局部极大值),如果是就保留,不是极大值就抑制(如设置为0)。这样的话就能将边缘定位在1-2像素宽(相邻像素有时候求极大值的方向恰好互不干扰)。 canny边缘检测中,非极大值抑制用于在初略检测出边缘后,利用边缘梯度的方向和幅值,对检出边缘作进一步精细化操作,将幅度的局部极大值认为是边缘,可以认为使得边缘变得更 “细”。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值