实验一-点特征提取
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
1、理解点特征提取的基本概念;
2、熟悉进行点特征提取的基本方法;
3、掌握用MATLAB语言进行点特征提取的方法。
二、实验原理
特征主要指明显点,如角点、圆点等。提取点特征的算子称为兴趣算子或有利算子,即运用某种算法从影像中提取我们所感兴趣的,即有利于某种目的的点。本次试验使用Moravex算子进行点特征提取。
Moravex算子于1977年提出利用灰度方差提取点特征的算子,其特点是在四个主要方向上选择具有最大---最小灰度方差的点作为特征点。其基本步骤为:
1、计算各像元的兴趣值IV(interest value)。在以像素(c
,r)为中心的w×w的影像窗口中,计算四个方向相邻像素灰度差的平方和;
2、给定一定的阈值,将兴趣值大于该阈值的点作为候选点。阈值的选择应以候选点中包括所需要的特征点,而又不包括过多的非特征点为原则;
3、选取候选点中的极值点作为特征点。在一定大小窗口内,将候选点中不是最大者均去掉,留下一个兴趣值最大者,该像素即为一个特征点。
三、实验要求
1、读取MATLAB图像处理工具箱中提供的这幅图像,并显示。
2、用Moravex算子对图像进行点特征提取
四、运行结果
原图:
提取点特征之后的图像:
五、源程序代码
% clear all
% close all
% clc
tic
I=imread('');
originalmap=I;
%calculate every pixel's IV(Interest value) %divide image I by w*w
w=5;
%divide to m*n
m=floor(size(I,1)/w); %rows,round
n=floor(size(I,2)/w); %columns
%get the coordinate of every centroid
c=ceil(w/2)+(0:n-1)*w; %x coordinate
r=ceil(w/2)+(0:m-1)*w; %y coordinate
%calculate every pixel's IV
step=floor(w/2);
for y_unit=1:m
for x_unit=1:n
%计算横向相邻像素灰度差的平方和
v1=0;v2=0;v3=0;v4=0;
for i=-step:step-1
%计算横向相邻像素灰度差的平方和
v1=v1+(I(r(y_unit),c(x_unit)+i)-I(r(y_u nit),c(x_unit)+i+1))^2;
%计算右斜线方向相邻像素灰度差的平方和
v2=v2+(I(r(y_unit)+i,c(x_unit)+i)-I(r(y _unit)+i+1,c(x_unit)+i+1))^2;
%计算纵向相邻像素灰度差的平方和
v3=v3+(I(r(y_unit)+i,c(x_unit))-I(r(y_u nit)+i+1,c(x_unit)))^2;
%计算左斜线方向相邻像素灰度差的平方和
v4=v4+(I(r(y_unit)-i,c(x_unit)+i)-I(r(y _unit)-i-1,c(x_unit)+i+1))^2;
end
%the min[v1,v2,v3,v4] is the IV of (c,r)
IV_cr(y_unit,x_unit)=min([v1,v2,v3,v4]);
end
end
%introduce a threshold 给定一个经验阈值。阈值的选取应以候选点包含所需要的特征点,而又不包含过多的非特征点为原则.
exper_thr=50;
IV_cr(IV_cr %选择候选点的极值点为特征点 %choose the size of window选择计算窗口大小 wf=9; %divide the feature points对候选点进行分割,分割为mf*nf个区域 mf=floor(m/wf); %rows nf=floor(n/wf); %columns %gain the coordinate of the feature point得到特征点的坐标 xc=[]; yc=[]; for y_unit=1:mf for x_unit=1:nf %计算分割区域中的最大值 [C,I]=max(IV_cr((y_unit-1)*wf+1:y_unit*wf,(x_ unit-1)*wf+1:x_unit*wf));%得到行 [C1,I1]=max(C);%得到列 IV_crch(y_unit,x_unit)=C1; %得到分割区域中的最大值 row=I(I1); col=I1; crch_row(y_unit,x_unit)=(y_unit-1)*wf+row; %得到最大值在候选区域中的行数 crch_col(y_unit,x_unit)=(x_unit-1)*wf+col; %得到最大值在候选区域中的列数 yc=[yc,r((y_unit-1)*wf+row)];xc=[xc,c((x_unit -1)*wf+col)]; IV_cr((y_unit-1)*wf+1:y_unit*wf,(x_unit-1)*wf +1:x_unit*wf)=NaN; %先去掉所有的点 IV_cr((y_unit-1)*wf+row,(x_unit-1)*wf+col)=C1 ; %加上符合要求的候选点 end end