1、function d=car(jpg)clcclearclose allfn,pn,fi=uigetfile(*.jpg,选择图片);I=imread(pn fn);subplot(3,2,1),imshow(I);title(原始图像);% 显示原始图像I1=rgb2gray(I);%转化为灰度图像subplot(3,2,2),imshow(I1),title(灰度图像);I2=edge(I1,sobel,0.08,both);%采用 robert 算子进行边缘检测subplot(3,2,3),imshow(I2),title(边缘检测后图像);se=1;1;1; %线型结构元素I3=ime
2、rode(I2,se); %腐蚀图像subplot(3,2,4),imshow(I3),title(腐蚀后边缘图像);se=strel(rectangle,25,25); %矩形结构元素I4=imclose(I3,se);%图像聚类、填充图像subplot(3,2,5),imshow(I4),title(填充后图像);I5=bwareaopen(I4,1600);%去除聚团灰度值小于 1600 的部分subplot(3,2,6),imshow(I5),title(形态滤波后图像)%图像定位%5y,x,z=size(I5);I6=double(I5);Y1=zeros(y,1);for i=1:
3、y%逐行扫描for j=1:xif(I6(i,j,1)=1)Y1(i,1)= Y1(i,1)+1;endendend%取行和值最大值temp MaxY=max(Y1);figure;subplot(3,2,1),plot(0:y-1,Y1),title(行方向像素点灰度值累计和),xlabel(行值),ylabel(像素);PY1=MaxY;%从和值最大行向前遍历和值点数大于 50 的行,直到最上面一行while (Y1(PY1,1)=50)endfprintf(PY1=%d,PY1);%从和值最大行向后遍历和值点数大于 50 的行,直到最下面一行PY2=MaxY;while (Y1(PY2,
4、1)=50)endPX1=PX1-1;PX2=PX2+1;% PX1=MaxX;% %从和值最大列向前遍历和值点数大于 10 的行,直到最上面一行% while (X1(1,PX1)=3)% end% fprintf(PX1=%d,PX1);% %从和值最大行向后遍历和值点数大于 50 的行,直到最下面一行% PX2=MaxX;% while (X1(1,PX2)=3) % d:二值图像imwrite(d,车牌二值图像.jpg); %将图像数据写入到图像文件中figure(4);subplot(4,2,2),imshow(d),title(车牌二值图像)figure(4),subplot(4,
5、2,3),imshow(d),title(均值滤波前)% 滤波h=fspecial(average,3); %建立预定义的滤波算子,average 指定算子的类型,3 为相应的参数d=im2bw(round(filter2(h,d); %转换为二值图像imwrite(d,均值滤波后.jpg); %将图像数据写入到图像文件中figure(4),subplot(4,2,4),imshow(d),title(均值滤波后)% 膨胀或腐蚀se=eye(2); % 2 阶单位矩阵m,n=size(d); %返回矩阵 b 的尺寸信息, 并存储在 m、 n 中。其中 m 中存储的是行数,n中存储的是列数if
6、bwarea(d)/m/n=0.365 %计算二值图像中对象的总面积d=imerode(d,se); %图像的腐蚀elseif bwarea(d)/m/n=round(n/6.5)val,num=min(sum(d(:,k1+5:k2-5);d(:,k1+num+5)=0; % 分割endend% figure;imshow(d);title(切割后后);% 再切割d=qiege(d);% 切割出 7 个字符% figure;imshow(d);title(切割后哈哈-);y1=10;y2=0.25;flag=0;word1=;while flag=0m,n=size(d);left=1;wi
7、de=0;while sum(d(:,wide+1)=0wide=wide+1;endif widey2flag=1;word1=temp; % WORD 1endd(:,1:wide)=0;d=qiege(d);endendword2,d=getword(d);% 分割出第二个字符word3,d=getword(d);% 分割出第三个字符word4,d=getword(d);% 分割出第四个字符word5,d=getword(d);% 分割出第五个字符word6,d=getword(d);% 分割出第六个字符word7,d=getword(d);% 分割出第七个字符m,n=size(word
8、1); %返回矩阵 b 的尺寸信息, 并存储在 m、n 中。其中 m 中存储的是行数,n 中存储的是列数word1=imresize(word1,40 20); %对图像做缩放处理,高 40,宽 20word2=imresize(word2,40 20);word3=imresize(word3,40 20);word4=imresize(word4,40 20);word5=imresize(word5,40 20);word6=imresize(word6,40 20);word7=imresize(word7,40 20);figure(5),subplot(3,7,8),imshow(
9、word1),title(车牌号为:);subplot(3,7,9),imshow(word2);subplot(3,7,10),imshow(word3);subplot(3,7,11),imshow(word4);subplot(3,7,12),imshow(word5);subplot(3,7,13),imshow(word6);subplot(3,7,14),imshow(word7);imwrite(word1,1.jpg);imwrite(word2,2.jpg);imwrite(word3,3.jpg);imwrite(word4,4.jpg);imwrite(word5,5.j
10、pg);imwrite(word6,6.jpg);imwrite(word7,7.jpg);%子程序:(getword 子程序)liccode=char(0:9 A:Z 皖); %建立自动识别字符代码表,将 t0:9 A:Z 皖多个字符串组成一个字符数组,每行对应一个字符串,字符数不足的自动补空格SubBw2=zeros(32,16);l=1;for I=1:7SubBw2=zeros(32,16); %产生 32*16 的全 0 矩阵ii=int2str(I);%转换为串t=imread(ii .jpg);%读取图片文件中的数据SegBw2=imresize(t,32 16,nearest)
11、; %对图像做缩放处理,高 32,宽 16,nearest: 这个参数,是默认的, 即改变图像尺寸时采用最近邻插值算法SegBw2=double(SegBw2)20;if l=1 %第一位汉字识别kmin=37;%10+26kmax=37;elseif l=2 %第二位 AZ 字母识别kmin=11;kmax=36;else l=3 %第三位以后是字母或数字识别kmin=1;kmax=36;endfor k2=kmin:kmaxfname=strcat(ku,liccode(k2),.jpg); %把一个行向量转化成字符串SamBw2 = imread(fname);%读取图片文件中的数据Sa
12、mBw2=double(SamBw2)1;for i=1:32for j=1:16SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);endend% 以上相当于两幅图相减得到第三幅图Dmax=0;for k1=1:32for l1=1:16if ( SubBw2(k1,l1) 0 | SubBw2(k1,l1) 0 )Dmax=Dmax+1;endendendError(k2)=Dmax;endError1=Error(kmin:kmax);MinError=min(Error1);findc=find(Error1=MinError);Code(l*2-1)=liccode(findc(1)+kmin-1);Code(l*2)= ;l=l+1;endfigure(6),subplot(2,1,2),imshow(dw),title (车牌号码:, Code,Color,b);