在日常生活中,认识、了解一个人就要先了解他的性格、相貌、行为习惯等特征。同样,在对一个图像进行识别和处理中,我们也要提取这幅图像的特征。利用一堆数据来对图像的特征进行描述,即“透过现象看本质”。
对图像的特征分为以下几类:
面特征:
线特征:
局部区域特征:
点特征:
不变点特征:
尺度不变特征:
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
非极大值抑制操作: