车牌识别代码

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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('切割前面空白部分后

相关文档
最新文档