北航机器视觉第一次作业——八边形识别

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

八边形识别

本文将四个八边形的图像称为源图像(test.jpg),将单个多边形的图像称为待匹配图像(test1.jpg、test2.jpg)。

步骤1:角点检测函数

octagon_corner.m函数是利用课本上提到的Harris角点探测器,对整个图像提取角点。

步骤2:图像的预处理及角点匹配

octagon_search.m和octagon_source.m函数,分别对源图像和待匹配图像处理,用于将检测出的角点与各自归属的八边形匹配。

步骤3:交比计算

octagon_cal_much.m和octagon_cal_one.m函数,分别用于对源图像和待匹配图像计算交比。步骤4:找到最像的八边形

octagon_main.m主函数,将待匹配图像与源图像匹配。

匹配结果1:

匹配结果2:

代码

function theta=angle1(x1,y1,x2,y2,x3,y3)

theta=acosd(dot([x1-x2,y1-y2],[x3-x2,y3-y2])/(norm([x1-x2,y1-y2])*norm([x3-x2,y3-y2]))); functionoctagon_CR=octagon_cal_much(point_devide)

number_octagon=size(point_devide,3);

octagon_angle=zeros(8,4,number_octagon);

octagon_CR=zeros(8,number_octagon);

x=zeros(4,1);

y=zeros(4,1);

l=zeros(4,1);

for i=1:number_octagon

for j=1:8

xx=point_devide(j,1,i);

yy=point_devide(j,2,i);

for k=1:4

if(j+k==8)

x(k)=point_devide(8,1,i);

y(k)=point_devide(8,2,i);

else

x(k)=point_devide(rem(j+k,8),1,i);

y(k)=point_devide(rem(j+k,8),2,i);

end

end

octagon_angle(j,1,i)=sind(angle1(x(1),y(1),xx,yy,x(3),y(3)));

octagon_angle(j,2,i)=sind(angle1(x(2),y(2),xx,yy,x(3),y(3)));

octagon_angle(j,3,i)=sind(angle1(x(1),y(1),xx,yy,x(4),y(4)));

octagon_angle(j,4,i)=sind(angle1(x(2),y(2),xx,yy,x(4),y(4)));

octagon_CR(j,i)=(octagon_angle(j,1,i)/octagon_angle(j,2,i))/(octagon_angle(j,3,i)/octagon_angle(j ,4,i));

end

end

functionoctagon_CR=octagon_cal_one(point_devide)

number_octagon=size(point_devide,3);

octagon_angle=zeros(8,4);

octagon_CR=zeros(8,1);

x=zeros(4,1);

y=zeros(4,1);

l=zeros(4,1);

for j=1:8

xx=point_devide(j,1);

yy=point_devide(j,2);

for k=1:4

if(j+k==8)

x(k)=point_devide(8,1);

y(k)=point_devide(8,2);

else

x(k)=point_devide(rem(j+k,8),1);

y(k)=point_devide(rem(j+k,8),2);

end

end

octagon_angle(j,1)=sind(angle1(x(1),y(1),xx,yy,x(3),y(3)));

octagon_angle(j,2)=sind(angle1(x(2),y(2),xx,yy,x(3),y(3)));

octagon_angle(j,3)=sind(angle1(x(1),y(1),xx,yy,x(4),y(4)));

octagon_angle(j,4)=sind(angle1(x(2),y(2),xx,yy,x(4),y(4)));

octagon_CR(j)=(octagon_angle(j,1)/octagon_angle(j,2))/(octagon_angle(j,3)/octagon_angle(j,4));

end

function [ROW COLUMN]=octagon_corner(Image)

%Image = im2uint8(rgb2gray(Image));

dx = [-1 0 1;-1 0 1;-1 0 1]; %dx:横向Prewitt差分模版

Ix2 = filter2(dx,Image).^2;

Iy2 = filter2(dx',Image).^2;

Ixy = filter2(dx,Image).*filter2(dx',Image);

%生成9*9高斯窗口。窗口越大,探测到的角点越少。

h= fspecial('gaussian',9,2);

A = filter2(h,Ix2); % 用高斯窗口差分Ix2得到A

B = filter2(h,Iy2);

C = filter2(h,Ixy);

nrow = size(Image,1);

ncol = size(Image,2);

Corner = zeros(nrow,ncol); %矩阵Corner用来保存候选角点位置,初值全零,值为1的点是角点

%真正的角点在137和138行由(row_ave,column_ave)得到

%参数t:点(i,j)八邻域的“相似度”参数,只有中心点与邻域其他八个点的像素值之差在

%(-t,+t)之间,才确认它们为相似点,相似点不在候选角点之列

t=20;

%我并没有全部检测图像每个点,而是除去了边界上boundary个像素,

%因为我们感兴趣的角点并不出现在边界上

boundary=8;

for i=boundary:nrow-boundary+1

for j=boundary:ncol-boundary+1

nlike=0; %相似点个数

if Image(i-1,j-1)>Image(i,j)-t && Image(i-1,j-1)

nlike=nlike+1;

end

if Image(i-1,j)>Image(i,j)-t && Image(i-1,j)

相关文档
最新文档