车牌识别代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [d]=car(jpg)
clc
clear
close all
[fn,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=imerode(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('形态滤波后图像
')
%%%%%%%%%%%%%%%%%%%%图像定位%%%%%%%%%%%%%%%%5
[y,x,z]=size(I5);
I6=double(I5);
Y1=zeros(y,1);
for i=1:y%逐行扫描
for j=1:x
if(I6(i,j,1)==1)
Y1(i,1)= Y1(i,1)+1;
end
end
end
%取行和值最大值
[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)&&(PY1>1))
PY1=PY1-1;
end
fprintf('PY1=%d',PY1);
%从和值最大行向后遍历和值点数大于50的行,直到最下面一行
PY2=MaxY;
while ((Y1(PY2,1)>=50)&&(PY2 PY2=PY2+1; end fprintf('PY2=%d',PY2); %行范围确定 IY=I(PY1:PY2,:,:); % figure; % imshow( IY);titile('行图像'); %列扫描 X1=zeros(1,x); for j=1:x for i=PY1:PY2 if(I6(i,j,1)==1) X1(1,j)= X1(1,j)+1; end end end %取行和值最大值 [temp MaxX]=max(X1); subplot(3,2,2),plot(0:x-1,X1),title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('像数'); PX1=1; while ((X1(1,PX1)<3)&&(PX1 PX1=PX1+1; end PX2=x; while ((X1(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end PX1=PX1-1; PX2=PX2+1; % PX1=MaxX; % %从和值最大列向前遍历和值点数大于10的行,直到最上面一行% while ((X1(1,PX1)>=3)&&(PX1>1)) % PX1=PX1-1; % end % fprintf('PX1=%d',PX1); % %从和值最大行向后遍历和值点数大于50的行,直到最下面一行% PX2=MaxX; % while ((X1(1,PX2)>=3)&&(PX2 % PX2=PX2+1; % end % fprintf('PX2=%d',PX2); %分割出车牌图像% dw=I(PY1:PY2,PX1:PX2,:); subplot(3,2,3),imshow(dw),title('定位剪切后的彩色车牌图像 ') a=dw; %读取图片文件中的数据 b=rgb2gray(a); %将真彩色图像转换为灰度图像 imwrite(b,'车牌灰度图像.jpg'); %将图像数据写入到图像文件中 figure(4);subplot(4,2,1),imshow(b),title('车牌灰度图像'); 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); %返回矩阵b的尺寸信息,并存储在m、n中。其中m中存储的是行数,n 中存储的是列数。 d=(double(b)>=T); % d:二值图像 imwrite(d,'车牌二值图像.jpg'); %将图像数据写入到图像文件中 figure(4);subplot(4,2,2),imshow(d),title('车牌二值图像') figure(4),subplot(4,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 bwarea(d)/m/n>=0.365 %计算二值图像中对象的总面积 d=imerode(d,se); %图像的腐蚀 elseif bwarea(d)/m/n<=0.235 %计算二值图像中对象的总面积 d=imdilate(d,se); %实现膨胀操作 end imwrite(d,'膨胀或腐蚀处理后.jpg'); %将图像数据写入到图像文件中 figure(4),subplot(4,2,5),imshow(d),title('膨胀或腐蚀处理后') I2=bwareaopen(d,200); subplot(4,2,6); imshow(I2),title('形态学滤波后的二值化图像') % 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割 d=qiege(I2); %切割 [m,n]=size(d); %返回矩阵b的尺寸信息,并存储在m、n中。其中m中存储的是行数,n 中存储的是列数 figure(4),subplot(4,2,7),imshow(d),title('切割前面空白部分后