机器视觉的道路识别结题报告Word文件下载.docx
《机器视觉的道路识别结题报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《机器视觉的道路识别结题报告Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。
篇二:
机器视觉实验三报告模板匹配法实现车牌识别
实验三报告模板匹配法实现车牌识别
一、实验目的
结合印刷体字符识别方法,用模板匹配法实现车牌识别。
要求:
能实现车牌定位、字符分割和车牌中数字0-9的识别。
二、实验设备
微机
三、实验内容及步骤
1.上机编写程序。
2.调试程序。
3.根据实验结果,撰写实验报告。
四、实验报告
(一)对汽车图像进行图像转换、图像增强和边缘检测等:
1.载入车牌图像:
I=imread('
car1.jpg'
);
figure
(1),imshow(I);
title('
originalimage'
);
%将车牌的原图显示出来,结果如下:
2.将彩图转换为灰度图并绘制直方图:
I1=rgb2gray(I);
%将彩图转换为灰度图
figure
(2),subplot(1,2,1),imshow(I1);
grayimage'
figure
(2),subplot(1,2,2),imhist(I1);
灰度图直方图'
%绘制灰度图的直方图结果如下所示:
3.用roberts算子进行边缘检测:
I2=edge(I1,'
roberts'
0.18,'
both'
%选择阈值0.18,用roberts算子进行边缘检测
figure(3),imshow(I2);
robertsoperatoredgedetectionimage'
结果如下:
4.图像实施腐蚀操作:
se=[1;
1;
1];
I3=imerode(I2,se);
%对图像实施腐蚀操作,即膨胀的反操作
figure(4),imshow(I3);
corrosionimage'
5.平滑图像
se=strel('
rectangle'
[25,25]);
%构造结构元素以正方形构造一个se
I4=imclose(I3,se);
%图像聚类、填充图像
figure(5),imshow(I4);
smothingimage'
结果如下所示:
6.删除二值图像的小对象
I5=bwareaopen(I4,XX);
%去除聚团灰度值小于XX的部分
figure(6),imshow(I5);
removethesmallobjects'
%用imshow函数显示滤波后图像结果如下所示:
(二)车牌定位
[y,x,z]=size(I5);
%返回I5各维的尺寸,存储在x,y,z中
myI=double(I5);
%将I5转换成双精度
tic%tic表示计时的开始,toc表示计时的结束
Blue_y=zeros(y,1);
%产生一个y*1的零阵
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)
%如果myI(i,j,1)即myI的图像中坐标为(i,j)的点值为1,即该点为车牌背景颜色蓝色%则Blue_y(i,1)的值加1
Blue_y(i,1)=Blue_y(i,1)+1;
%蓝色像素点统计
end
[tempMaxY]=max(Blue_y);
%Y方向车牌区域确定
%temp为向量yellow_y的元素中的最大值,MaxY为该值的索引
PY1=MaxY;
while((Blue_y(PY1,1)>
=5)&
&
(PY1>
1))
PY1=PY1-1;
PY2=MaxY;
while((Blue_y(PY2,1)>
(PY2 PY2=PY2+1;
IY=I(PY1:
PY2,:
:
%行方向车牌区域确定
%%%%%%X方向%%%%%%%%%
Blue_x=zeros(1,x);
%进一步确定x方向的车牌区域
fori=PY1:
PY2
篇三:
北航机器视觉第一次作业——八边形识别
八边形识别
本文将四个八边形的图像称为源图像(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:
代码
functiontheta=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);
number_octagon
8
xx=point_devide(j,1,i);
yy=point_devide(j,2,i);
fork=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);
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
functionoctagon_CR=octagon_cal_one(point_devide)
number_octagon=size(point_devide,3);
octagon_angle=zeros(8,4);
octagon_CR=zeros(8,1);
xx=point_devide(j,1);
yy=point_devide(j,2);
x(k)=point_devide(8,1);
y(k)=point_devide(8,2);
x(k)=point_devide(rem(j+k,8),1);
y(k)=point_devide(rem(j+k,8),2);
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));
function[ROWCOLUMN]=octagon_corner(Image)
%Image=im2uint8(rgb2gray(Image));
dx=[-101;
-101;
-101];
%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);
ow=size(Image,1);
ncol=size(Image,2);
Corner=zeros(ow,ncol);
%矩阵Corner用来保存候选角点位置,初值全零,值为1的点是角点
%真正的角点在137和138行由(row_ave,column_ave)得到
%参数t:
点(i,j)八邻域的“相似度”参数,只有中心点与邻域其他八个点的像素值之差在
%(-t,+t)之间,才确认它们为相似点,相似点不在候选角点之列
t=20;
%我并没有全部检测图像每个点,而是除去了边界上boundary个像素,
%因为我们感兴趣的角点并不出现在边界上
boundary=8;
fori=boundary:
ow-boundary+1
forj=boundary:
ncol-boundary+1
nlike=0;
%相似点个数
ifImage(i-1,j-1)>
Image(i,j)-t&
Image(i-1,j-1) nlike=nlike+1;
ifImage(i-1,j)>
Image(i-1,j) nlike=nlike+1;
ifImage(i-1,j+1)>
Image(i-1,j+1) nlike=nlike+1;
ifImage(i,j-1)>
Image(i,j-1) nlike=nlike+1;
ifImage(i,j+1)>
Image(i,j+1) nlike=nlike+1;
ifImage(i+1,j-1)>
Image(i+1,j-1) nlike=nlike+1;
ifImage(i+1,j)>
Image(i+1,j) nlike=nlike+1;
ifImage(i+1,j+1)>
Image(i+1,j+1) nlike=nlike+1;
ifnlike>
=2&
nlike Corner(i,j)=1;
%如果周围有0,1,7,8个相似与中心的(i,j)%那(i,j)就不是角点,所以,直接忽略
end;
CRF=zeros(ow,ncol);
%CRF用来保存角点响应函数值,初值全零
CRFmax=0;
%图像中角点响应函数的最大值,作阈值之用t=0.04;
%建议取0.04(机器视觉)
%计算CRF
%工程上常用CRF(i,j)=det(M)/trace(M)计算CRF,那么此时应该将下面第105行的%比例系数t设置大一些,t=0.1对采集的这几幅图像来说是一个比较合理的经验值fori=boundary:
forj=boundary:
ifCorner(i,j)==1%只关注候选点
M=[A(i,j)C(i,j);
C(i,j)B(i,j)];
CRF(i,j)=det(M)-t*(trace(M))^2;
ifCRF(i,j)>
CRFmax
CRFmax=CRF(i,j);
%CRFmax
count=0;
%用来记录角点的个数
t=0.1;
%下面通过一个3*3的窗口来判断当前位置是否为角点
fori=boundary:
ifCorner(i,j)==1%只关注候选点的八邻域
t*CRFmax&
CRF(i,j)>
CRF(i-1,j-1)......
&
CRF(i-1,j)&
CRF(i-1,j+1)......
CRF(i,j-1)&
CRF(i,j+1)......
CRF(i+1,j-1)&
CRF(i+1,j)......
CRF(i,j)>
CRF(i+1,j+1)
count=count+1;
%这个是角点,count加1
else%如果当前位置(i,j)不是角点,则在Corner(i,j)中删除对该候选角点的记录
Corner(i,j)=0;
%toc(t1)
p=9;
pp=(p-1)/2;
ROW=zeros(1,count);
COLUNM=zeros(1,count);
number=1;
column_ave=0;
row_ave=0;
k=0;
ifCorner(i,j)==1
forx=i-pp:
i+pp%7*7邻域
fory=j-pp:
j+pp
ifCorner(x,y)==1
%用算数平均数作为角点坐标,如果改用几何平均数求点的平均坐标,对角点的提取意义不大
row_ave=row_ave+x;
column_ave=column_ave+y;
k=k+1;