北航机器视觉第一次作业——八边形识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)