《MATLAB大作业.docx》由会员分享,可在线阅读,更多相关《MATLAB大作业.docx(17页珍藏版)》请在第壹文秘上搜索。
1、基于MATLAB识别图片中的文字学问点:图像识别图像处理计算机视觉试验目的:以MATLAB为工具,识别图片中的文字。问题描述:交通是一个特别重要的问题,红绿灯上的摄像头可以辨别车主的身份。现在,我们是否能够用matlab设计一个图像识别的系统,通过车牌号的来识别相应的数字。问题分析及模型建立:第一步:确定车牌号的区域对于一张图像在matlab中,在处理图像元素时用(x,y,z)三坐标的形式表达的灰度集时,其中,X和y是空间坐标,z是f在坐标(x,y)处的值,就可以表达图像在该坐标轴上的点。再将,将f(x,y)的数值简洁地显示为一个矩阵,就可以定量地表达了一幅数值图像。矩阵中的每个元素称为像素。
2、所以,假如我们想要截取一段车牌号的图像,我们就可以扫描图像每一个点的像素。然后我们进行复原处理,算子边缘检测,腐蚀,闭操作,删除小对象得到我们就可以利用RGB的值找到白色区域的边界,然后我们利用边界,截取我们的原图像就可以得到我们所须要的车牌号的区域了。其次步:进行文字的分割在进行分割之前,就须要将我们所获得的车牌号的区域的图像进行进一步的处理,突出我们须要的文字部分。灰度处理彩色的图片占用的空间比较大,处理睬花费很长的时间,先将图片进行灰度处理二值化再将图片二值化,将图片的256个灰度级强制削减到只有0,2552个灰度级,更加便利了后续的文字识别识别。均值滤波均值滤波是对是对图像进行局部平均
3、,以平均值来代表该像素点的灰度值。矩形滤波器对这个二维矢量的每一个重量进行独立的平滑处理。获得一张比较干净清晰的图像。腐蚀和膨胀腐蚀可以分割独立的图像元素,膨胀用于连接相邻的元素,更加利于图像的分割进行完图像的预处理,就可以起先图像的切割了首先进行边缘的切割,处理完后的图像为黑底白字。其中黑色为0,白色1为。这样我们就可以从四个边缘进行扫描,若行或者列像素之和0的话,就为背景,这样就可以接着向内推移,直到和不为0的位置为止。这样就进行了边缘的切割。接下来,先进行文字的切割,文字和字母、数字在长度和宽度上有较大的差别,所以须要单独的拿出来。因为号码是平铺过来的,所以我们进行列的扫描。先从最左边进
4、行扫描,若列像素之和不为0的话,则说明有文字,直到和为O的时候停止。但是假如扫描出来的宽度太小的话就说明背景可能有白色区域干扰。这时,应当将刚刚扫描出来的区域置黑,再次进行扫描,截取图像。同理,数字和字母可同样按着上面的方式扫描,截取。截取后的图像模板的配对全部的文字数字和字母都截取下来后,我们须要将所得的图片统一的量化为同样大小的图像便利比对。统一量化后的图像完成了这部的操作之后,就须要建立一个小型的模板库。将车牌号常见的文字、十个数字和26个英文字母存储为上面同样大小的二值化图片,并且以对应字符的名称命名。将全部的模板放在一起,依据确定的依次排列。然后,我们就可以调用我们已经切割好的图片和
5、模板内部的图片进行相减,找寻差别最小的图片进行匹配,这样就可以识别出车牌号上的字符了。问题求解:matIab代码:主函数functiond=main(jpg)closeallclcI=imread(,Car.jpg);%读入车牌图像Car.jpgIl=rgb2gray(I);I2=edge(II,roberts,0.15,both,);se=l;l;l;I3=imerode(12,se);se=strel(rectangle,25,25);I4=imclose(13,se);I5=bwareaopen(14,2000);figured),imshow(I5);title(,从对象中移除小对象)
6、;y,x,z二SiZe(15);%图像以(y,x,z)表达灰度集,x,y为坐标,Z为对应位置的值myl=double(15);%转化为双精度,便于确定范围tic%测定算法执行的时间,起先计时BlUe_y=ZeroS(y,1);fori=l:yforj=l:xif(myl(i,j,D=D%找寻y轴方向的白色区域Blue_y(i,1)=Blue_y(i,1)+1;%是蓝色区域的则进行计数endendendtempMaxY=max(Blue_y);%Y方向车牌区域确定temp(最多点数):全部行中,最多的累积PYl=MaxY;while(Blue_y(PYl,1)=5)&(PY11)PYl=PYl-
7、I;end%Y轴方向的上限PY2=MaxY;while(Blue_y(PY2,1)=5)&(PY2y)PY2=PY2+1;end%Y轴方向的的下限IY=I(PYl:PY2,:,:);%X方向%BlUe_X=ZerOS(1,x)进一步确定x方向的车牌区域forj=l:xfori=PYl:PY2%只须要扫描PY1:PY2的部分,简化程序if(myl(i,j,1)=1)Blue_x(l,j)=Blue_x(l,j)+l;endendendPXl=I;while(Blue_x(1,PXl)3)&(PXKx)PXl=PXl+1;end%确定X轴的右边界PX2=x;while(BIUe_x(1,PX2)P
8、X1)PX2=PX2-1;end%确定X轴的左边界PXl=PX1-1;%对车牌区域的校正PX2=PX2+1;dw=I(PYl:PY2-8,PXkPX2,:);%确定图片的截取区域t=toc;%读取程序的运行时间a=imread(,dw.jpg,);%读入已经截取好的图像A=size(a);iflength(八)=3b=rgb2gray(a);elseb=a;endfigure(8);subplot(3,2,1),imshow(b),title(,1.车牌灰度图像)gmax=double(max(max(b);g_min=double(min(min(b);T=round(g_max-(g_ma
9、x-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.均值滤波后)%某些图像进行操作%膨胀或
10、腐蚀se=eye(2);%eye(n)可返回一个2*2单位矩阵m,n=size(d);%图像为二值图像,x,y为坐标ifbwarea(d)mn=0.365%计算二值图像中对象的总面积d=imerode(d,se);%实现图形的腐蚀elseifbwarea(d)mn=O.235d=imdilate(d,se);%实现图像的膨胀endimwrite(d,5.膨胀或腐蚀处理后.jpg);figure(8),subplot(3,2,5),imshow(d),title(,5.膨胀或腐蚀处理后)%找寻连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,须要分割d=qiege(d);%截掉边界黑色
11、的部分m,n=size(d);%图像已经切割的图像的坐标figure,subplot(2,1,1),imshow(d),title(n)kl=l;k2=l;s=sum(d);J=I;whilej=nwhiles(j)=0j=j+l;end%扫过的地方全为黑色,则向右移动,直到不是停止kl=j;%确定截图的左边界whiles(j)=O&j=round(n6.5)val,num=min(sum(d(:,kl+5:k2-5);d(:,kl+num+5)=0;%kl+num+5列的位置赋值为黑色,分endend%再切割d=qiege(d);%切割出7个字符yl=10jy2=0.25;fIag=Ojwo
12、rdl=E;whileflag-0m,n=size(d);Ieft=I;wide=0;whilesum(d(:,wide+l)wide=wide+l;end%扫过的地方不全为黑色,向右移动,直到不是停止ifwidey2fIag=Ijwordl=temp;%WORD1endd(:,l:wide)=O;d=qiege(d);endend%分割出其次个字符word2,d=getword(d);%getword的函数及上面类似,字母、数字和文字在一些微小环节上须要去区分%分割出第三个字符word3,d=getword(d);%分割出第四个字符word4,d=getword(d);%分割出第五个字符wo
13、rd5,d=getword(d);%分割出第六个字符word6,d=getword(d);%分割出第七个字符word7,d=getword(d);subplot(5,7,1),imshow(wordl),title(,);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(wordl);%将生成的图片归一化大小为40*20wordl=imresize(wordl,4020);word2=imresize(word2,4020);word3=imresize(word3,4020);word4=imresize(word4,4020);word5=imresize(word5,4020);word6=imresize(word6,4020);word7=imresize(wo