MATLAB大作业.docx
- 文档编号:3024673
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:14
- 大小:20.13KB
MATLAB大作业.docx
《MATLAB大作业.docx》由会员分享,可在线阅读,更多相关《MATLAB大作业.docx(14页珍藏版)》请在冰点文库上搜索。
MATLAB大作业
基于MATLAB识别图片中的文字
知识点:
图像识别图像处理计算机视觉
实验目的:
以MATLAB为工具,识别图片中的文字。
问题描述:
交通是一个十分重要的问题,红绿灯上的摄像头可以辨别车主的身份。
现在,我们是否能够用matlab设计一个图像识别的系统,通过车牌号的来识别相应的数字。
问题分析及模型建立:
第一步:
确定车牌号的区域
对于一张图像
在matlab中,在处理图像元素时用(x,y,z)三坐标的形式表达的灰度集时,其中,x和y是空间坐标,z是f在坐标(x,y)处的值,就可以表达图像在该坐标轴上的点。
再将,将f(x,y)的数值简单地显示为一个矩阵,就可以定量地表达了一幅数值图像。
矩阵中的每个元素称为像素。
所以,如果我们想要截取一段车牌号的图像,我们就可以扫描图像每一个点的像素。
然后我们进行恢复处理,算子边缘检测,腐蚀,闭操作,删除小对象得到
我们就可以利用RGB的值找到白色区域的边界,然后我们利用边界,截取我们的原图像就可以得到我们所需要的车牌号的区域了。
第二步:
进行文字的分割
在进行分割之前,就需要将我们所获得的车牌号的区域的图像进行进一步的处理,突出我们需要的文字部分。
灰度处理
彩色的图片占用的空间比较大,处理会花费很长的时间,先将图片进行灰度处理
二值化
再将图片二值化,将图片的256个灰度级强制减少到只有{0,255}2个灰度级,更加方便了后续的文字识别识别。
均值滤波
均值滤波是对是对图像进行局部平均,以平均值来代表该像素点的灰度值。
矩形滤波器对这个二维矢量的每一个分量进行独立的平滑处理。
获得一张比较干净清晰的图像。
腐蚀和膨胀
腐蚀可以分割独立的图像元素,膨胀用于连接相邻的元素,更加利于图像的分割
进行完图像的预处理,就可以开始图像的切割了
首先进行边缘的切割,处理完后的图像为黑底白字。
其中黑色为0,白色1为。
这样我们就可以从四个边缘进行扫描,若行或者列像素之和0的话,就为背景,这样就可以继续向内推移,直到和不为0的位置为止。
这样就进行了边缘的切割。
接下来,先进行文字的切割,文字和字母、数字在长度和宽度上有较大的差别,所以需要单独的拿出来。
因为号码是平铺过来的,所以我们进行列的扫描。
先从最左边进行扫描,若列像素之和不为0的话,则说明有文字,直到和为0的时候停止。
但是如果扫描出来的宽度太小的话就说明背景可能有白色区域干扰。
这时,应该将刚刚扫描出来的区域置黑,再次进行扫描,截取图像。
同理,数字和字母可同样按着上面的方式扫描,截取。
截取后的图像
模板的配对
所有的文字数字和字母都截取下来后,我们需要将所得的图片统一的量化为同样大小的图像方便比对。
统一量化后的图像
完成了这部的操作之后,就需要建立一个小型的模板库。
将车牌号常见的文字、十个数字和26个英文字母存储为上面同样大小的二值化图片,并且以对应字符的名称命名。
将所有的模板放在一起,按照一定的顺序排列。
然后,我们就可以调用我们已经切割好的图片和模板内部的图片进行相减,寻找差别最小的图片进行匹配,这样就可以识别出车牌号上的字符了。
问题求解:
matlab代码:
主函数
function[d]=main(jpg)
closeall
clc
I=imread('');%读入车牌图像
I1=rgb2gray(I);
I2=edge(I1,'roberts',,'both');
se=[1;1;1];
I3=imerode(I2,se);
se=strel('rectangle',[25,25]);
I4=imclose(I3,se);
I5=bwareaopen(I4,2000);
figure
(1),imshow(I5);title('从对象中移除小对象');
[y,x,z]=size(I5);%图像以(y,x,z)表达灰度集,x,y为坐标,z为对应位置的值
myI=double(I5);%转化为双精度,便于确定范围
tic%测定算法执行的时间,开始计时
Blue_y=zeros(y,1);
fori=1:
y
forj=1:
x
if(myI(i,j,1)==1)
%寻找y轴方向的白色区域
Blue_y(i,1)=Blue_y(i,1)+1;%是蓝色区域的则进行计数
end
end
end
[tempMaxY]=max(Blue_y);%Y方向车牌区域确定temp(最多点数):
所有行中,最多的累积
PY1=MaxY;
while((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end%Y轴方向的上限
PY2=MaxY;
while((Blue_y(PY2,1)>=5)&&(PY2 PY2=PY2+1; end%Y轴方向的的下限 IY=I(PY1: PY2,: : ); %%%%%%X方向%%%%%%%%% Blue_x=zeros(1,x);%进一步确定x方向的车牌区域 forj=1: x fori=PY1: PY2%只需要扫描PY1: PY2的部分,简化程序 if(myI(i,j,1)==1) Blue_x(1,j)=Blue_x(1,j)+1; end end end PX1=1; while((Blue_x(1,PX1)<3)&&(PX1 PX1=PX1+1; end%确定x轴的右边界 PX2=x; while((Blue_x(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end%确定x轴的左边界 PX1=PX1-1;%对车牌区域的校正 PX2=PX2+1; dw=I(PY1: PY2-8,PX1: PX2,: );%确定图片的截取区域 t=toc;%读取程序的运行时间 a=imread('');%读入已经截取好的图像 A=size(a); iflength(A)==3 b=rgb2gray(a); else b=a; end figure(8);subplot(3,2,1),imshow(b),title('1.车牌灰度图像') g_max=double(max(max(b))); g_min=double(min(min(b))); T=round(g_max-(g_max-g_min)/3);%T为二值化的阈值 [m,n]=size(b); d=(double(b)>=T);%d: 二值图像 imwrite(d,'2.车牌二值图像.jpg'); figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像') figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前') %滤波 h=fspecial('average',3);%进行均值滤波 imwrite(d,'4.均值滤波后.jpg'); figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后') %某些图像进行操作 %膨胀或腐蚀 se=eye (2);%eye(n)可返回一个2*2单位矩阵 [m,n]=size(d);%图像为二值图像,x,y为坐标 ifbwarea(d)/m/n>=%计算二值图像中对象的总面积 d=imerode(d,se);%实现图形的腐蚀 elseifbwarea(d)/m/n<= d=imdilate(d,se);%实现图像的膨胀 end imwrite(d,'5.膨胀或腐蚀处理后.jpg'); figure(8),subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后') %寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割 d=qiege(d);%截掉边界黑色的部分 [m,n]=size(d);%图像已经切割的图像的坐标 figure,subplot(2,1,1),imshow(d),title(n) k1=1; k2=1; s=sum(d); j=1; whilej~=n whiles(j)==0 j=j+1; end%扫过的地方全为黑色,则向右移动,直到不是停止 k1=j;%确定截图的左边界 whiles(j)~=0&&j<=n-1 j=j+1; end%继续扫描,扫过的地方不全为黑色,向右移动,直到不是停止 k2=j-1;%确定截图的右边界 ifk2-k1>=round(n/ [val,num]=min(sum(d(: [k1+5: k2-5]))); d(: k1+num+5)=0;%k1+num+5列的位置赋值为黑色,分割 end end %再切割 d=qiege(d); %切割出7个字符 y1=10;y2=;flag=0;word1=[]; whileflag==0 [m,n]=size(d); left=1;wide=0; whilesum(d(: wide+1))~=0 wide=wide+1; end%扫过的地方不全为黑色,向右移动,直到不是停止 ifwide d(: [1: wide])=0;%将此片区域全部转化为黑色,继续进行切割 d=qiege(d); else temp=qiege(imcrop(d,[11widem]));%返回已经切割好的区域 [m,n]=size(temp); all=sum(sum(temp)); two_thirds=sum(sum(temp([round(m/3): 2*round(m/3)],: ))); iftwo_thirds/all>y2 flag=1;word1=temp;%WORD1 end d(: [1: wide])=0;d=qiege(d); end end %分割出第二个字符 [word2,d]=getword(d);%getword的函数与上面类似,字母、数字和文字在一些细节上需要去区分 %分割出第三个字符 [word3,d]=getword(d); %分割出第四个字符 [word4,d]=getword(d); %分割出第五个字符 [word5,d]=getword(d); %分割出第六个字符 [word6,d]=getword(d); %分割出第七个字符 [word7,d]=getword(d); subplot(5,7,1),imshow(word1),title('1'); subplot(5,7,2),imshow(word2),title('2'); subplot(5,7,3),imshow(word3),title('3'); subplot(5,7,4),imshow(word4),title('4'); subplot(5,7,5),imshow(word5),title('5'); subplot(5,7,6),imshow(word6),title('6'); subplot(5,7,7),imshow(word7),title('7'); [m,n]=size(word1); %将生成的图片归一化大小为40*20 word1=imresize(word1,[4020]); word2=imresize(word2,[4020]); word3=imresize(word3,[4020]); word4=imresize(word4,[4020]); word5=imresize(word5,[4020]); word6=imresize(word6,[4020]); word7=imresize(word7,[4020]); subplot(5,7,15),imshow(word1),title('1'); subplot(5,7,16),imshow(word2),title('2'); subplot(5,7,17),imshow(word3),title('3'); subplot(5,7,18),imshow(word4),title('4'); subplot(5,7,19),imshow(word5),title('5'); subplot(5,7,20),imshow(word6),title('6'); subplot(5,7,21),imshow(word7),title('7'); imwrite(word1,''); imwrite(word2,''); imwrite(word3,''); imwrite(word4,''); imwrite(word5,''); imwrite(word6,''); imwrite(word7,''); liccode=char(['0': '9''A': 'Z''苏豫陕鲁晋']);%建立自动识别字符代码表 SubBw2=zeros(40,20);%40*20的零矩阵 l=1; forI=1: 7 ii=int2str(I);%int2str整型转换字符串 t=imread([ii,'.jpg']); SegBw2=imresize(t,[4020],'nearest');%改变图片的大小 ifl==1%第一位汉字识别 kmin=37; kmax=41;%模板中汉字所在的位置 elseifl==2%第二位A~Z字母识别 kmin=11; kmax=36;%模板中数字所在的位置 elsel>=3%第三位以后是字母或数字识别 kmin=1; kmax=36;%模板中字母所在的位置 end fork2=kmin: kmax fname=strcat('字符模板\',liccode(k2),'.jpg'); SamBw2=imread(fname); Error(k2)=sum(sum(abs(SegBw2-SamBw2))); %将现有字符逐个与模板字符相减,认为相减误差最小的现有字符与该模板字符匹配 end Error1=Error(kmin: kmax); MinError=min(Error1); findc=find(Error1==MinError);%寻找最匹配的字符 Code(l*2-1)=liccode(findc (1)+kmin-1);%将上述找到的字符位置与liccode中的字符链接上 Code(l*2)='';%在字符之间加空格 l=l+1; end figure(10),imshow(a),title(['车牌号码: ',Code],'Color','b'); 函数getword function[word,result]=getword(d) word=[];flag=0;y1=8;y2=; whileflag==0 [m,n]=size(d); wide=0; whilesum(d(: wide+1))~=0&&wide<=n-2 wide=wide+1; end temp=qiege(imcrop(d,[11widem])); [m1,n1]=size(temp); ifwide d(: [1: wide])=0; ifsum(sum(d))~=0 d=qiege(d);%切割出最小范围 elseword=[];flag=1; end else word=qiege(imcrop(d,[11widem])); d(: [1: wide])=0; ifsum(sum(d))~=0; d=qiege(d);flag=1; elsed=[]; end end end %end result=d; qiege函数 functione=qiege(d) [m,n]=size(d); top=1;%下端 bottom=m;%下端 left=1;%左端 right=n;%右端 whilesum(d(top,: ))==0&&top<=m%如果矩阵d的第top行的和为0的话 top=top+1; end whilesum(d(bottom,: ))==0&&bottom>=1%如果矩阵d的第bottom行的和为0的话 bottom=bottom-1; end whilesum(d(: left))==0&&left<=n%如果矩阵d的第left列的和为0的话 left=left+1; end whilesum(d(: right))==0&&right>=1%如果矩阵d的第right列的和为0的话 right=right-1; end dd=right-left;%切割的宽度 hh=bottom-top;%切割的高度 e=imcrop(d,[lefttopddhh]);%返回该截取的区域 结果分析: 1,这种垂直扫描的方式,图像的中车的牌照需要接近水平,如果倾斜的比较厉害,很难只截取车牌号的区域。 2,扫描字符的时候,如果扫描左右结构的字符时,比如“沪”,则会截出‘氵’和‘户’两个部分,就无法匹配字符。 3,如果遇到受污染很严重的图片,就难切割图片的和模板中的图片匹配。 参考文献 [1]艾冬梅,李艳晴,张丽静,刘琳MATLAB与数学实验[M]机械工业出版社 [2]RafaelRichard数字图像处理[M]电子工业出版社 [3]樊昀,王润生.从图像中提取文字[J].国防科技大学学报,2002,24 (1): 59-62. [4]邹浩,余龙,邹勇博,刘宇童,和振乔,李少梅.基于MATLAB的图片中文字的提取及识别[J].西安电子科技大学电子工程学院,西安,710126
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 作业