篇一:机器视觉的车辆牌照识别
深圳稻草人自动化培训
机器视觉的车辆牌照识别,更具自动化与智
能化
之前在提起自动化或是智能化时,人们会不自觉的想到工业生产,这是因为自动化这个字眼进入中国,确实是以工业领域为登陆平台的。但是,随着时代的进步,自动化已经不再局限于工业领域,而是广泛的存在于各种领域,甚至与我们的生活息息相关。智能化交通系统是交通领域科学技术发展的产物,不管是对道路行驶车辆的监控拍照,还是公路收费领域的电子自动化收费系统,都是智能化的表现。与此同时,我们也不难发现,不管智能化交通系统应用在哪里,其都是通过对车辆牌照的识别来实现的,而目前基于机器视觉的车辆牌照识别系统,是最为自动化与智能化的。
就像公民的身份证件一样,车辆牌照就是车辆的身份证明,是最真实、清晰的标志。车辆牌照识别系统能够自动获取车辆行进过程中的动态数据,准确识别车辆牌照字符,并进行快速的判断与处理。基于机器视觉的车辆牌照识别系统主要包括图像采集与处理、车牌定位、字符分割与识别等几个部分。
其一:图像采集与处理
机器视觉系统的主要功能就是将被摄目标转换成图像信号,再由图像处理系统转变成数字信号,最终根据这些信号进行各种的运算来抽取目标的特征进行比对。那么,基于机器视觉的车辆牌照识别系统就可以将车牌图像由模拟信号转换为数字信号,通过图像处理对车牌图像进行增强或是变换,突出车牌的主要特征,为下一步的车牌定位打好基础。
其二:车牌定位
车牌定位是基于机器视觉的车辆牌照识别系统的关键点,也是难点,噪声等都会影响到定位的精确度。其主要包括图像预处理,车辆牌照粗定位,车辆牌照精确定位等几个过程。图像预处理主要是区分已经变成电信号的信息、去除信号中的噪声与杂质信号、对文字格式进行规范,使获取的信息变得条理清晰。车牌照粗定位部分的作用就是大体选出几个待判断识别的候选车牌区域,为精确定位缩小判断范围。最后,车牌的精确定位便可以从候选区域判断出真正的区域并给出相应坐标。
(转自:wWw.XiAocAoFanWeN.cOm 小 草 范文网:机器视觉的道路识别结题报告)其三:字符分割与识别
车辆牌照的字符分割就是将定位后的车牌区域中的每个字符从整个图像中分割出来,使其成为单个字符,以便于字符的识别。而字符识别就是基于机器视觉的车辆牌照识别系统最重要、最终的目的,它将对前面所有环节共同所得到的结果进行识别处理,最终得到需求的清晰准确的车辆牌照字符。
篇二:机器视觉 实验三报告 模板匹配法实现车牌识别
实验三报告模板匹配法实现车牌识别
一、实验目的
结合印刷体字符识别方法,用模板匹配法实现车牌识别。
要求:能实现车牌定位、字符分割和车牌中数字0-9的识别。
二、实验设备
微机
三、实验内容及步骤
1. 上机编写程序。
2. 调试程序。
3. 根据实验结果,撰写实验报告。
四、实验报告
(一)对汽车图像进行图像转换、图像增强和边缘检测等:
1.载入车牌图像:
I=imread('car1.jpg');
figure(1),imshow(I);title('original image');%将车牌的原图显示出来,结果如下:
2.将彩图转换为灰度图并绘制直方图:
I1=rgb2gray(I);%将彩图转换为灰度图
figure(2),subplot(1,2,1),imshow(I1);title('gray image');
figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图 结果如下所示:
3.用roberts算子进行边缘检测:
I2=edge(I1,'roberts',0.18,'both');%选择阈值0.18,用roberts算子进行边缘检测
figure(3),imshow(I2);title('roberts operator edge detection image');
结果如下:
4.图像实施腐蚀操作:
se=[1;1;1];
I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作
figure(4),imshow(I3);title('corrosion image');
5.平滑图像
se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个se
I4=imclose(I3,se);%图像聚类、填充图像
figure(5),imshow(I4);title('smothing image');
结果如下所示:
6.删除二值图像的小对象
I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分
figure(6),imshow(I5);title('remove the small objects');%用imshow函数显示滤波后图像 结果如下所示:
(二)车牌定位
[y,x,z]=size(I5);%返回I5各维的尺寸,存储在x,y,z中
myI=double(I5);%将I5转换成双精度
tic%tic表示计时的开始,toc表示计时的结束
Blue_y=zeros(y,1);%产生一个y*1的零阵
for i=1:y
for j=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
end
end
[temp MaxY]=max(Blue_y);%Y方向车牌区域确定
%temp为向量yellow_y的元素中的最大值,MaxY为该值的索引
PY1=MaxY;
while ((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end
PY2=MaxY;
while ((Blue_y(PY2,1)>=5)&&(PY2<y))
PY2=PY2+1;
end
IY=I(PY1:PY2,:,:);
%行方向车牌区域确定
%%%%%% X方向 %%%%%%%%%
Blue_x=zeros(1,x);%进一步确定x方向的车牌区域
for j=1:x
for i=PY1:PY2
if(myI(i,j,1)==1)
篇三:北航机器视觉第一次作业——八边形识别
八边形识别
本文将四个八边形的图像称为源图像(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);
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;
for i=boundary:ow-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)<Image(i,j)+t
nlike=nlike+1;
end
if Image(i-1,j)>Image(i,j)-t && Image(i-1,j)<Image(i,j)+t
nlike=nlike+1;
end
if Image(i-1,j+1)>Image(i,j)-t && Image(i-1,j+1)<Image(i,j)+t
nlike=nlike+1;
end
if Image(i,j-1)>Image(i,j)-t && Image(i,j-1)<Image(i,j)+t
nlike=nlike+1;
end
if Image(i,j+1)>Image(i,j)-t && Image(i,j+1)<Image(i,j)+t
nlike=nlike+1;
end
if Image(i+1,j-1)>Image(i,j)-t && Image(i+1,j-1)<Image(i,j)+t
nlike=nlike+1;
end
if Image(i+1,j)>Image(i,j)-t && Image(i+1,j)<Image(i,j)+t
nlike=nlike+1;
end
if Image(i+1,j+1)>Image(i,j)-t && Image(i+1,j+1)<Image(i,j)+t
nlike=nlike+1;
end
ifnlike>=2 &&nlike<=6
Corner(i,j)=1;%如果周围有0,1,7,8个相似与中心的(i,j) %那(i,j)就不是角点,所以,直接忽略
end;
end;
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对采集的这几幅图像来说是一个比较合理的经验值 for i = boundary:ow-boundary+1
for j = boundary:ncol-boundary+1
if Corner(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;
if CRF(i,j) >CRFmax
CRFmax = CRF(i,j);
end;
end
end;
end;
%CRFmax
count = 0; % 用来记录角点的个数
t=0.1;
% 下面通过一个3*3的窗口来判断当前位置是否为角点
for i = boundary:ow-boundary+1
for j = boundary:ncol-boundary+1
if Corner(i,j)==1 %只关注候选点的八邻域
if CRF(i,j) > t*CRFmax&& CRF(i,j) >CRF(i-1,j-1) ......
&& CRF(i,j) > CRF(i-1,j) && CRF(i,j) > CRF(i-1,j+1) ......
&& CRF(i,j) > CRF(i,j-1) && CRF(i,j) > CRF(i,j+1) ......
&& CRF(i,j) > CRF(i+1,j-1) && CRF(i,j) > 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;
end;
end;
end;
end;
% toc(t1)
p=9;
pp=(p-1)/2;
ROW=zeros(1,count);
COLUNM=zeros(1,count);
number=1;
for i=boundary:ow-boundary+1
for j=boundary:ncol-boundary+1
column_ave=0;
row_ave=0;
k=0;
if Corner(i,j)==1
for x=i-pp:i+pp %7*7邻域
for y=j-pp:j+pp
if Corner(x,y)==1
% 用算数平均数作为角点坐标,如果改用几何平均数求点的平均坐标,对角点的提取意义不大
row_ave=row_ave+x;
column_ave=column_ave+y;
k=k+1;
end
end
end
end