基于MATLAB的点特征提取
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MATLAB点特征提取实习报告
一、实习内容与目的
理解影像中每个像素灰度值的概念;理解点特征在灰度方面的特点;掌握常用的点特征提取算子及其对应的点特征提取方法,例如Harris算子。
利用MATLAB软件分析任意一种应用于数字图像处理中的边缘检测算子,研究它的提取方法以及实现提取特征点。
二、实习原理
基本思想:从图像局部的小窗口观察图像特征。
角点定义:窗口向任意方向的移动都导致图像灰度的明显变化。
Harris角点检测:数学描述
将图像窗口平移[u,v]产生灰度变化E[u,v]
由:
得到:
于是对于局部微小的移动量[u,v],可以近似得到下面的表达:
其中,M是2*2矩阵,可由图像的导数求得:
窗口移动导致的图像变化:实对称矩阵的特征值分析
其中,的特征值M的特征值λmax、λmin。
定义角点响应函数:R
其中
Harris角点检测结果如下图所示:
三、实习步骤及相关代码
filename='yuantu2.jpg';
X=imread(filename);%读取图像
%imshow(X);
Info=imfinfo(filename);%获取图像相关信息
if(Info.BitDepth>8)
f=rgb2gray(X);
end
%《基于特征点的图像配准与拼接技术研究》
%计算图像亮度f(x,y)在点(x,y)处的梯度-----------------------------------------------
%fx=[50-5;80-8;50-5];%高斯函数一阶微分,x方向(用于改进的Harris角点提取算法) ori_im=double(f)/255;%unit8转化为64为双精度double64
fx=[-2-1012];%x方向梯度算子(用于Harris角点提取算法)
Ix=filter2(fx,ori_im);%x方向滤波
%fy=[585;000;-5-8-5];%高斯函数一阶微分,y方向(用于改进的Harris角点提取算法) fy=[-2;-1;0;1;2];%y方向梯度算子(用于Harris角点提取算法)
Iy=filter2(fy,ori_im);%y方向滤波
%构造自相关矩阵---------------------------------------------------------------
Ix2=Ix.^2;
Iy2=Iy.^2;
Ixy=Ix.*Iy;
clearIx;
clearIy;
h=fspecial('gaussian',[77],2);%产生7*7的高斯窗函数,sigma=2
Ix2=filter2(h,Ix2);
Iy2=filter2(h,Iy2);
Ixy=filter2(h,Ixy);
%提取特征点---------------------------------------------------------------
height=size(ori_im,1);
width=size(ori_im,2);
result=zeros(height,width);%纪录角点位置,角点处值为1
R=zeros(height,width);
Rmax=0;%图像中最大的R值
k=0.06;%k为常系数,经验取值范围为0.04~0.06
fori=1:height
forj=1:width
M=[Ix2(i,j)Ixy(i,j);Ixy(i,j)Iy2(i,j)];%autocorrelationmatrix
R(i,j)=det(M)-k*(trace(M))^2;%计算R
ifR(i,j)>Rmax
Rmax=R(i,j);
end;
end;
end;
%T=0.01*Rmax;%固定阈值,当R(i,j)>T时,则被判定为候选角点
T=0.1*Rmax;%固定阈值,当R(i,j)>T时,则被判定为候选角点
%在计算完各点的值后,进行局部非极大值抑制-------------------------------------
cnt=0;
fori=2:height-1
forj=2:width-1
%进行非极大抑制,窗口大小3*3
if(R(i,j)>T&&R(i,j)>R(i-1,j-1)&&R(i,j)>R(i-1,j)&&R(i,j)>R(i-1,j+1)&&R(i,j)>R(i,j-1)&&... R(i,j)>R(i,j+1)&&R(i,j)>R(i+1,j-1)&&R(i,j)>R(i+1,j)&&R(i,j)>R(i+1,j+1))
result(i,j)=1;
cnt=cnt+1;
end;
end;
end;
i=1;
forj=1:height
fork=1:width
ifresult(j,k)==1;
corners1(i,1)=j;
corners1(i,2)=k;
i=i+1;
end;
end;
end;
[posc,posr]=find(result==1);
figure,imshow(ori_im);
holdon;
plot(posr,posc,'r+');
>>filename='yuantu.jpg';
X=imread(filename);%读取图像
%imshow(X);
Info=imfinfo(filename);%获取图像相关信息
if(Info.BitDepth>8)
f=rgb2gray(X);
end