文档库 最新最全的文档下载
当前位置:文档库 › matlab车牌识别例子(好好看看提取字符部分)

matlab车牌识别例子(好好看看提取字符部分)

matlab车牌识别例子(好好看看提取字符部分)
matlab车牌识别例子(好好看看提取字符部分)

图像分割、边缘检测(车牌识别)

例子一

Matlab代码

% function [d]=main()

close all

clc % 清空命令窗口的所有输入和输出,类似于清屏

%自动弹出提示框读入图像

[filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');% 直接自动读入%

file=strcat(filepath,filename); %strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名

I=imread(file);

figure('name','原图'),imshow(I);title('原图')

%图像增强

% h=ones(5,5)/25; %过滤器h

% I=imfilter(I,h);%真彩色增强

% figure('name','真彩色增强');imshow(I);title('真彩色增强');

I1=rgb2gray(I); % RGB图像转灰度图像

figure('name','灰度处理前'),subplot(1,2,1),imshow(I1);title('灰度处理前的灰度图');

subplot(1,2,2),imhist(I1);title('灰度处理前的灰度图直方图');

%线性灰度变换

I1=imadjust(I1,[0.3,0.7],[]);

figure('name','灰度处理后'),subplot(1,2,1),imshow(I1);title('灰度处理后的灰度图');

subplot(1,2,2),imhist(I1);title('灰度处理后的灰度图直方图');

%进行中值滤波

I1=medfilt2(I1);

figure,imshow(I1);title('中值滤波');

%边缘检测:sobel,roberts,canny,prewitt等

I2=edge(I1,'roberts',0.25,'both'); %边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both'两个方向检测(缺省默认)

figure('name','边缘检测'),imshow(I2);title('robert算子边缘检测')

se=[1;1;1];

I3=imerode(I2,se);% 腐蚀Imerode(X,SE).其中X是待处理的图像,SE是结构元素对象

figure('name','腐蚀后图像'),imshow(I3);title('腐蚀后的图像');

se=strel('rectangle',[20,20]);% 25X25的矩形strel???

I4=imclose(I3,se);% 用25*25的矩形对图像进行闭运算(先膨胀后腐蚀)有平滑边界作用figure('name','平滑处理'),imshow(I4);title('平滑图像的轮廓');

I5=bwareaopen(I4,1000);% 从二进制图像中移除所有少于2000像素的连接对象,消失的是连续的白色像素数量少于2000的字符

figure('name','移除小对象'),imshow(I5);title('从对象中移除小对象');

[y,x,z]=size(I5);% y是行数,x是列数,z是维数

myI=double(I5);% 转成双精度型

tic % 开始计时

Blue_y=zeros(y,1);% zeros(M,N) 表示的是M行*N列的全0矩阵

for i=1:y

for j=1:x

if(myI(i,j,1)==1) %% 判断蓝色像素

Blue_y(i,1)= Blue_y(i,1)+1;% 蓝色像素点统计

end

end

end

[temp MaxY]=max(Blue_y);% Y方向车牌区域确定[temp MaxY]临时变量MaxY

PY1=MaxY; % 以下为找车牌Y方向最小值

while ((Blue_y(PY1,1)>=5)&&(PY1>1))%% 为什么判断蓝色像素点>=5(才算蓝色)????

PY1=PY1-1;

end

PY2=MaxY; % 以下为找车牌Y方向最大值???难道最大值不是MaxY????

while ((Blue_y(PY2,1)>=5)&&(PY2

PY2=PY2+1;

end

% IY=I(PY1:PY2,:,:);

%%%%%%%%%%%%%%%%% X方向%%%%%%%%%

Blue_x=zeros(1,x);% 进一步确定x方向的车牌区域

for j=1:x

for i=PY1:PY2 % 只需扫描的行

if(myI(i,j,1)==1) %% 判断蓝色像素

Blue_x(1,j)= Blue_x(1,j)+1; % 蓝色像素点统计

end

end

end

PX1=1;% 以下为找车牌X方向最小值

while ((Blue_x(1,PX1)<3)&&(PX1

PX1=PX1+1;

end

PX2=x;% 以下为找车牌X方向最大值

while ((Blue_x(1,PX2)<3)&&(PX2>PX1))

PX2=PX2-1;

end

PY1=PY1-2;% 对车牌区域的校正为什么要这么+-???

PX1=PX1-2;

PX2=PX2+3;

PY2=PY2+10;

dw=I(PY1:PY2-8,PX1:PX2,:);% 裁剪图像

toc %t=toc; % 停止计时

%figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域');

figure('name','定位剪切后的彩色车牌图像'),%subplot(1,2,2),

imshow(dw),title('定位剪切后的彩色车牌图像')

imwrite(dw,'dw.jpg');

% 直接自动读入%[filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像');

%jpg=strcat(filepath,filename); % strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名

a=imread('dw.jpg');

b=rgb2gray(a);

imwrite(b,'1.车牌灰度图像.jpg');

figure('name','车牌处理');subplot(3,2,1),imshow(b),title('1.车牌灰度图像')

%g_max=double(max(max(b)));% 以下作阈值化(灰度图转二值图)

%g_min=double(min(min(b)));% max(a)求的每列的最大值,是一维数据;max(max(a)) 是求这一维数据的最大值。

%T=round(g_max-(g_max-g_min)/2); % T 为二值化的阈值round:取整为最近的整数

%[m,n]=size(b);% m:b的行向量数n:b的列向量数

%d=(double(b)>=T); % d:二值图像

%imwrite(d,'2.车牌二值图像.jpg');

%线性灰度变换

b=imadjust(b,[0.3,0.7],[]);

subplot(3,2,2),imshow(b);title('2.线性灰度处理后的灰度图');

%进行二值化处理

d=im2bw(b,0.4);%将灰度图像进行二值化处理

imwrite(d,'2.车牌二值图像.jpg');

subplot(3,2,3),imshow(d),title('3.车牌二值图像');%显示二值化图像

%进行中值滤波

d=medfilt2(d);

imwrite(d,'4.均值滤波后.jpg');

subplot(3,2,4),imshow(d);title('4.中值滤波后');

% 均值滤波

%h=fspecial('average',3);

%d=im2bw(round(filter2(h,d)));% 滤波后,im2bw():将图像转成二值图像(可以不用round 函数也是一样的)

%imwrite(d,'4.均值滤波后.jpg');

%subplot(3,2,4),imshow(d),title('4.均值滤波后')

% 某些图像进行操作

% 膨胀或腐蚀???感觉没什么效果咧???

% se=strel('square',3); % 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀

% 'line'/'diamond'/'ball'/'square'/'dish'... 线/菱形/球/正方形/圆

se=eye(2); % eye(n) 返回n乘n单一矩阵;单位矩阵

[m,n]=size(d);

if bwarea(d)/m/n>=0.365 % 函数bwarea 计算目标物的面积,单位是像素;bwarea/m/n即为单个像素??

d=imerode(d,se);% 腐蚀

elseif bwarea(d)/m/n<=0.235

d=imdilate(d,se);% 膨胀

end

imopen(d,se);

%se=eye(7);

%imopen(d,se);

imwrite(d,'5.膨胀或腐蚀处理后.jpg');

subplot(3,2,5),imshow(d),title('5.膨胀或腐蚀处理后')

% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割

d=qiege(d);% 调用qiege()子程序

[m,n]=size(d);

figure,subplot(2,1,1),imshow(d),title(n)

%k1=1;k2=1;

j=1;

s=sum(d);%sum(x)就是竖向相加,求每列的和,结果是行向量;sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。sum(X(:))表示矩阵求和

while j~=n %%%%% 什么原理???

while s(j)==0 %% 无文字???为什么???

j=j+1;

end

k1=j;

while s(j)~=0 && j<=n-1

j=j+1;

end

k2=j-1;

if k2-k1>=round(n/6.5)

[val,num]=min(sum(d(:,[k1+5:k2-5])));

d(:,k1+num+5)=0; % 分割

end

end

% 再切割

%d=qiege(d);

% 切割出7 个字符

y1=10;y2=0.25;flag=0;word1=[];

while flag==0 % flag为自定义,以便标记循环用

[m,n]=size(d);

%left=1;

wide=0;

while sum(d(:,wide+1))~=0 % 二值图像:黑色像素代表感兴趣的对象而白色像素代表背景。逻辑矩阵只包括0(显示为黑色)和1(显示为白色)

wide=wide+1;% ?wide的意义?

end

if wide

d(:,[1:wide])=0; % 将白色汉字前的白色弄成黑色

% figure,imshow(d);

d=qiege(d); % 处理干扰后再次调用切割子程序

else

temp=qiege(imcrop(d,[1 1 wide m]));% imcrop函数截取图像[xmin ymin width height]

[m,n]=size(temp);

all=sum(sum(temp));

two_thirds=sum(sum(temp([round(m/3):2*round(m/3)],:)));

if two_thirds/all>y2 %??什么意思??

flag=1;word1=temp; %第一个字符

end

d(:,[1:wide])=0;d=qiege(d); %?为什么又处理一次?

end

end

% 分割出第二个字符

[word2,d]=getword(d);

% 分割出第三个字符

[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,[40 20]);%imresize对图像做缩放处理,常用调用格式为:B=imresize(A,ntimes,method);其中method可选nearest,bilinear(双线性),bicubic,box,lanczors2,lanczors3等

word2=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]);

subplot(5,7,15),imshow(word1),title('11');

subplot(5,7,16),imshow(word2),title('22');

subplot(5,7,17),imshow(word3),title('33');

subplot(5,7,18),imshow(word4),title('44');

subplot(5,7,19),imshow(word5),title('55');

subplot(5,7,20),imshow(word6),title('66');

subplot(5,7,21),imshow(word7),title('77');

imwrite(word1,'1.jpg'); % 创建七位车牌字符图像

imwrite(word2,'2.jpg');

imwrite(word3,'3.jpg');

imwrite(word4,'4.jpg');

imwrite(word5,'5.jpg');

imwrite(word6,'6.jpg');

imwrite(word7,'7.jpg');

liccode=char(['0':'9' 'A':'Z' '京辽桂陕苏渝浙']); %建立自动识别字符代码表;'京津沪渝港澳吉辽鲁豫冀鄂湘晋青皖苏赣浙闽粤琼台陕甘云川贵黑藏蒙桂新宁'

% 编号:0-9分别为1-10;A-Z分别为11-36;

% 京津沪渝港澳吉辽鲁豫冀鄂湘晋青皖苏

% 赣浙闽粤琼台陕甘云川贵黑藏蒙桂新宁

% 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

% 60 61 62 63 64 65 66 67 68 69 70

SubBw2=zeros(40,20); % 创建一个40行20列的0矩阵

l=1;

for I=1:7

ii=int2str(I); % 将整型数据转换为字符串型数据

t=imread([ii,'.jpg']);% 依次读入七位车牌字符

SegBw2=imresize(t,[40 20],'nearest'); % 对读入的字符进行缩放

if I==1 % 第一位汉字识别

kmin=37;

kmax=43;

elseif I==2 % 第二位A~Z 字母识别

kmin=11;

kmax=36;

else % 第三位以后是字母或数字识别;即I>=3

kmin=1;

kmax=36;

end

for k2=kmin:kmax

fname=strcat('字符模板\',liccode(k2),'.jpg'); % strcat函数:连接字符串

SamBw2 = imread(fname);

for i=1:40

for j=1:20

SubBw2(i,j)=SegBw2(i,j)-SamBw2(i,j);

end

end

% 以上相当于两幅图相减得到第三幅图进行匹配

Dmax=0; % 与模板不同的点个数

for k1=1:40

for l1=1:20

if ( SubBw2(k1,l1) > 10 || SubBw2(k1,l1) < -10 ) % "|"/"||" 或操作(>2 15)20以上无区别

Dmax=Dmax+1;

end

end

end

Error(k2)=Dmax; % 记录下字符与模板k2不同的点个数

end

Error1=Error(kmin:kmax);

MinError=min(Error1); % 差别最小的

findc=find(Error1==MinError); % 找出差别最小的模板

Code(l)=liccode(findc(1)+kmin-1); % 此处用2*l-1且后面的2*l=' ',第隔一空格输出一个字符

Code(3)=' ';Code(4)=' ';

l=l+1;

if l==3;% 后五位与前两位字符隔开

l=l+2;

end

end

figure(10),subplot(5,7,1:7),imshow(dw),title('第一步:车牌定位'),

xlabel({'第二步:车牌分割'}); %'',

subplot(6,7,15),imshow(word1);

subplot(6,7,16),imshow(word2);

subplot(6,7,17),imshow(word3);

subplot(6,7,18),imshow(word4);

subplot(6,7,19),imshow(word5);

subplot(6,7,20),imshow(word6);

subplot(6,7,21),imshow(word7);

subplot(6,7,22:42),imshow('dw.jpg');%

xlabel(['第三步:识别结果为: ', Code],'Color','b'); 图片:

我做的是神经网络车牌识别,我用自己的程序可以识别两块车牌,但是当识别别的车牌时候却一直报错。我两块车牌一块640*480可以识别,另一块就不能识别。报错内容如下求大神指点该怎么改!:??? Attempted to access X1(1,405); index out of bounds becausesize(X1)=[1,404].

Error in ==> main1 at 120 while ((X1(1,Px0)<5)&&(Px0

%% 了去除不是字符的部分,例如:

代码二:

%%%% 选择车牌图片%%%%

[filename, pathname] = uigetfile({'*.jpg';'*.bmp';'*.gif'},'选择图片');

str = [pathname filename];

I =imread(str); %将选择的图片读取,并赋于I

figure(1),subplot(3,2,1),imshow(I);title('原始图像');

I1=rgb2gray(I);%转化为灰度图像

figure(1),subplot(3,2,2),imshow(I1),title('灰度图像');

I2=edge(I1,'roberts',0.09,'both');%采用robert算子进行边缘检测

figure(1),subplot(3,2,3),imshow(I2),title('边缘检测后图像');

se=[1;1;1]; %线型结构元素

I3=imerode(I2,se); %腐蚀图像

figure(1),subplot(3,2,4),imshow(I3),title('腐蚀后边缘图像');

se=strel('rectangle',[25,25]); % 矩形结构元素

I4=imclose(I3,se);%图像聚类、填充图像

figure(1),subplot(3,2,5),imshow(I4),title('填充后图像');

I5=bwareaopen(I4,2000);%去除聚团灰度值小于2000的部分

figure(1),subplot(3,2,6),imshow(I5),title('形态滤波后图像');

%车牌定位%

[y,x]=size(I5);%获取滤波后图像的尺寸,及长宽

I6=double(I5);

Y1=zeros(y,1);%创建一个y行1列的0矩阵

for i=1:y

for j=1:x

if(I6(i,j)==1)

Y1(i,1)= Y1(i,1)+1;

end

end

end

[temp MaxY]=max(Y1);

figure(2),subplot(2,2,1),plot(0:y-1,Y1);

title('行方向像素点灰度值累计和'),xlabel('行值'),ylabel('像素');

%%%%%%%求的车牌的行起始位置和终止位置%%%%%%%%%

PY1=MaxY;

while ((Y1(PY1,1)>=50)&&(PY1>1))

PY1=PY1-1;

end

PY2=MaxY;

while ((Y1(PY2,1)>=50)&&(PY2

PY2=PY2+1;

end

IY=I(PY1:PY2,:,:);

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

figure(2),subplot(2,2,2),plot(0:x-1,X1);

title('列方向像素点灰度值累计和');xlabel('列值');ylabel('像数'); %%%%%%%求的车牌的列起始位置和终止位置%%%%%%%%%

PX1=1;

while ((X1(1,PX1)<5)&&(PX1

PX1=PX1+1;

end

PX2=x;

while ((X1(1,PX2)<5)&&(PX2>PX1))

PX2=PX2-1;

end

%分割出车牌图像%

dw=I(PY1:PY2,PX1:PX2,:);

imwrite(dw,'dw.jpg','jpg');

figure(2),subplot(2,2,3),imshow(dw);title('定位剪切后的彩色车牌图像'); figure(3),subplot(2,2,1),imshow(dw);title('定位后的车牌图像');

I1 = rgb2gray(dw); %将RGB图像转化为灰度图像

g_max=double(max(max(I1))); %获取I1中灰度最大值

g_min=double(min(min(I1))); %获取I1中灰度最小值

T=round(g_max-(g_max-g_min)/3); % 计算二值化的阈值后赋值于T

I1=im2bw(I1,T/256);

subplot(2,2,2);imshow(I1),title('二值化车牌图像');

I2=bwareaopen(I1,20);%删除面积小于20的区域

figure(3),subplot(2,2,3),imshow(I2);title('形态学滤波后的二值化图像'); [y1,x1]=size(I2);

I3=double(I2);

%%%%%%%去除图像顶端和底端的不感兴趣区域%%%%%

Y1=zeros(y1,1);

for i=1:y1

for j=1:x1

if(I3(i,j,1)==1)

Y1(i,1)= Y1(i,1)+1 ;

end

end

end

Py0=1;

while ((Y1(Py0,1)<20)&&(Py0

Py0=Py0+1;

end

Py1=Py0;

while((Y1(Py1,1)>=20)&&(Py1

Py1=Py1+1;

end

I2=I2(Py0:Py1,:,:);

figure(3),subplot(2,2,4),imshow(I2);title('目标车牌区域');

%%%%%% 分割字符按行积累量%%%%%%%

X1=zeros(1,x1);

for j=1:x1

for i=1:y1

if(I3(i,j)==1)

X1(1,j)= X1(1,j)+1;

end

end

end

figure(4),plot(0:x1-1,X1);

title('列方向像素点灰度值累计和'),xlabel('列值'),ylabel('累计像素量'); %%%%%%%%%%%%分割字符%%%%%%%%%%%%%%%%%%

Px0=1;

k=1; %记录存储图片的个数

for i=1:7

while ((X1(1,Px0)<5)&&(Px0

Px0=Px0+1;

end

Px1=Px0;

while (((X1(1,Px1)>=5)&&(Px1

Px1=Px1+1;

end

if((Px1-Px0)<15) %% 此处加一个if语句作用是除去识

Px0=Px1+1; %% 别时区域X轴区域小于15的部分,为

while ((X1(1,Px0)<5)&&(Px0

Px0=Px0+1; %% [ 豫A * A 3

7 5 G ] 中两个A之间

end %% 的那个点,由于滤波不能滤掉这个比较

Px1=Px0; %% 大一点的点,所以在此去除。不足是:

while (((X1(1,Px1)>=5)&&(Px1

Px1=Px1+1; %% 个渝字的偏旁‘氵’,所以识别出来的

end %% 渝少‘氵’。将错就错,我在样本中用

end

%% 的也是少‘氵’的渝。

Z=I2(:,Px0:Px1,:);

Z=imresize(Z,[40 20]); %将图像Z转换成尺寸为40*20的图片

Px0=Px1;

imwrite(Z,strcat('分割符号/PIN',num2str(k),'.jpg'),'jpg');

%分割出来的赴澳以‘.jpg’格式存储为图片

k=k+1; %表示需要存储的下一张图片

figure(5),subplot(1,7,i),imshow(Z);

end

%%%%归一化训练样本%%%%

I=zeros(43,800); %创建一个由43个拥有800个元素行向量组成的矩阵

for i=1:43

I(i,:)=pretreatment(imread(strcat('识别样本/',num2str(i-1),'.jpg')));

%将识别样本中的每个样本转换成一个行向量存储

end %在矩阵I的每一行中

P=I'; %将的到的矩阵I转置赋于P

%参数设置%

T=eye(43,43);

net=newff(minmax(P),[1000,32,43],{'logsig','logsig','logsig'},'trainrp');

net.inputWeights{1,1}.initFcn ='randnr';

https://www.wendangku.net/doc/4b5038392.html,yerWeights{2,1}.initFcn ='randnr';

net.trainparam.epochs=5000;

net.trainparam.show=50;

net.trainparam.goal=0.0000000001;

net=init(net);

[net,tr]=train(net,P,T);

%%%%%%%%%%%测试字符,得到识别数值%%%%

PIN=zeros(7,800); %定义一个有7个拥有800个元素组成的行向量组成的矩阵

for i=1:7

PIN(i,:)=pretreatment(imread(strcat('分割符号/PIN',num2str(i),'.jpg')));

%将分割符号中的每个分离图片转换成一个行向量存储在矩阵PIN的每一行中

end

P0=PIN'; %将得到的矩阵PIN转置后赋于P0

Str=cell(1,7); %定义一个拥有7个元素字符串

for i=1:7

T0 = sim(net ,P0(:,i));

T1 = compet (T0) ;

d = find(T1 == 1) - 1;

if (d<10) %当d<10,说明符号识别为一个数字,再将数字d转换成

str=num2str(d); %与之相对应的字符赋值于str

elseif((d>=10)&&(d<=35)) %当d>=10且d<=35,说明符号识别为一个字母,由于A 的

str=char(d+55); %ASCII值为65,所以与之对应的d都要加55,再由char()

else %函数转换成对应的ASCII字符赋值于str

switch d %在样本中找到与之相应的汉字,并将汉字字符赋值于str

case 36, str='豫';

case 37, str='京';

case 38, str='苏';

case 39, str='辽';

case 40, str='鲁';

case 41, str='陕';

case 42, str='渝';

otherwise , str=' '; %那个都不符合的话,默认为空格

end

end

Str{i}=str;

end

carname=strcat(Str{1},Str{2},Str{3},Str{4},Str{5},Str{6},Str{7});

%将识别出来的各个字符串成字符串

figure(6);imshow(dw),title(carname);%赋值于s并输出图片相对比

例子三

交通摄像头图像的机车目标分割与提取Matlab源代码

【业务案例002】交通摄像头图像的机车目标分割与提取Matlab源代码.doc clc

clear all

close all

%--------------------------------------------------------------------

dir = pwd;

cd([pwd,'\DataSet'])

[file,path] = uigetfile('*.jpg','Select a jpg file');

cd(dir);

%--------------------------------------------------------------------

load('buffer.mat'); % 加载变量b,w

userdata = https://www.wendangku.net/doc/4b5038392.html,erdata;

b = userdata(:,1:end/2);

w = userdata(:,end/2+1:end);

%--------------------------------------------------------------------

% 读入图像,转成灰度图,再直方图均衡

J1 = imread([path,file]); % 读入图像

figure(1); imshow(J1,'InitialMagnification','fit'); title(file);

J2 = rgb2gray(J1);

% figure(2); imshow(J2,'InitialMagnification','fit'); title(file);

J3 = histeq(J2);

figure(3); imshow(J3,'InitialMagnification','fit'); title(file);

%--------------------------------------------------------------------

% 加窗处理,减去背景,再灰度调整

J4 = min(J3,w);

% figure(4); imshow(J4,'InitialMagnification','fit'); title(file);

J5 = imabsdiff(J4,b);

% figure(5); imshow(J5,'InitialMagnification','fit'); title(file);

J6 = imadjust(J5,[.2 .6],[],3);

figure(6); imshow(J6,'InitialMagnification','fit'); title(file);

%--------------------------------------------------------------------

% 最小值滤波

x = mean(J6);

y = mean(J6,2);

c = length(x);

r = length(y);

n = 51;

tmp1 = zeros(1,c);

for i = 1:c

aa = max(i-(n-1)/2,1);

bb = min(i+(n-1)/2,c);

tmp1(i) = min(x(aa:bb));

end

x1 = tmp1;

tmp2 = zeros(1,r);

for i = 1:r

aa = max(i-(n-1)/2,1);

bb = min(i+(n-1)/2,r);

tmp2(i) = min(y(aa:bb));

end

y1 = tmp2;

%--------------------------------------------------------------------

% 区域裁剪

k = .2;

gx = mean(x1)*k;

gy = mean(y1)*k;

x2 = x1>gx;

y2 = y1>gy;

% figure(7)

% subplot(321); plot(1:c,x,'b'); ylabel('x'); axis tight

% subplot(322); plot(1:r,y,'b'); ylabel('y'); axis tight

% subplot(323); plot(1:c,x1,'b',1:c,repmat(gx,1,c),'r'); ylabel('x1'); axis tight % subplot(324); plot(1:r,y1,'b',1:r,repmat(gy,1,r),'r'); ylabel('y1'); axis tight % subplot(325); plot(1:c,x2,'b.-'); ylabel('x2'); axis tight

% subplot(326); plot(1:r,y2,'b.-'); ylabel('y2'); axis tight

i = find(x2==1);

j = find(y2==1);

width = max(i)-min(i)+n;

height = max(j)-min(j)+n;

xmin = min(i)-(n-1)/2;

ymin = min(j)-(n-1)/2;

J8 = imcrop(J6,[xmin,ymin,width,height]);

% figure(8); imshow(J8,'InitialMagnification','fit'); title(file);

%--------------------------------------------------------------------

% 影子处理

x = mean(J8(1:round(end/2),:));

c = length(x);

k = 1;

x1 = x>k;

% figure(9);

% subplot(211); plot(1:c,x,'b',1:c,repmat(k,1,c),'r'); axis tight

% subplot(212); plot(1:c,x0,'b.-'); axis tight

i = find(x1==1);

xmin = xmin+min(i);

width = max(i)-min(i);

%--------------------------------------------------------------------

% 区域微调

xmin = xmin-10;

height = height-10;

tmp = uint8(zeros(size(J1)));

tmp(ymin:ymin+height-1,xmin:xmin+width-1,:) = 255;

J10 = min(J1,tmp);

figure(10); imshow(J10,'InitialMagnification','fit'); title(file); disp('****************** over! **********************') 处理结果如下:

车牌识别地matlab程序

( 附录 车牌识别程序 clear ; close all; %Step1 获取图像装入待处理彩色图像并显示原始图像 Scolor = imread('');%imread函数读取图像文件 %将彩色图像转换为黑白并显示 Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图 " figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图 figure,imshow(Sgray),title('原始黑白图像'); %Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数 Bgray=imopen(Sgray,s);%打开sgray s图像 figure,imshow(Bgray);title('背景图像');%输出背景图像 %用原始图像与背景图像作减法,增强图像 Egray=imsubtract(Sgray,Bgray);%两幅图相减 ¥ figure,imshow(Egray);title('增强黑白图像');%输出黑白图像 %Step3 取得最佳阈值,将图像二值化 fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型 fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型 level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值 bw22=im2bw(Egray,level);%转换图像为二进制图像 bw2=double(bw22); %Step4 对得到二值图像作开闭操作进行滤波 、 figure,imshow(bw2);title('图像二值化');%得到二值图像 grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界

基于MATLAB的车牌识别

liccode=char(['0':'9' 'A':'Z' '京津沪渝冀晋辽吉黑苏浙皖闽赣鲁豫鄂湘粤琼川贵云陕甘蒙新青藏桂宁港']); %建立自动识别字符代码表 l=1; [m2,n2]=size(subcol); for k=findmax-4:findmax+3 cleft=markcol5(k)-maxwidth/2; cright=markcol5(k)+maxwidth/2-2; if cleft<1 cleft=1; cright=maxwidth; end if cright>n2 cright=n2; cleft=n2-maxwidth; end SegBw1=sbw(rowtop:rowbot,cleft:cright); SegBw2 = imresize(SegBw1,[32 16]); %变换为32行*16列标准子图 if l==1 %第一位汉字识别 kmin=37; kmax=68; elseif l==2 %第二位A~Z 字母识别 kmin=11; kmax=36; elseif l>=3 & l<=5 %第三、四位0~9 A~Z字母和数字识别 kmin=1; kmax=36; else %第五~七位0~9 数字识别 kmin=1; kmax=10; end for k2=kmin:kmax fname=strcat('D:\sample\',liccode(k2),'.bmp'); SamBw2 = imread(fname,'bmp'); SubBw2 = SamBw2-SegBw2; Dmax=0; for k1=1:32 for l1=1:16 if ( SubBw2(k1,l1) > 0 | SubBw2(k1,l1) <0 ) Dmax=Dmax+1; end end end Error(k2)=Dmax;

基于matlab的车牌号码识别程序代码

基于matlab的汽车牌照识别程序 摘要:本次作业的任务是设计一个基于matlab的汽车牌照识别程序,能够实现车牌图像预处理,车牌定位,字符分割,然后通过神经网络对车牌进行字符识别,最终从一幅图像中提取车牌中的字母和数字,给出文本形式的车牌号码。 关键词:车牌识别,matlab,神经网络 1 引言 随着我国交通运输的不断发展,智能交通系统(Intelligent Traffic System,简称ITS)的推广变的越来越重要,而作为ITS的一个重要组成部分,车辆牌照识别系统(vehicle license plate recognition system,简称LPR)对于交通管理、治安处罚等工作的智能化起着十分重要的作用。它可广泛应用于交通流量检测,交通控制于诱导,机场,港口,小区的车辆管理,不停车自动收费,闯红灯等违章车辆监控以及车辆安全防盗等领域,具有广阔的应用前景。由于牌照是机动车辆管理的唯一标识符号,因此,车辆牌照识别系统的研究在机动车管理方面具有十分重要的实际意义。 2 车辆牌照识别系统工作原理 车辆牌照识别系统的基本工作原理为:将摄像头拍摄到的包含车辆牌照的图像通过视频卡输入到计算机中进行预处理,再由检索模块对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后输入JPEG或BMP格式的数字,输出则为车牌号码的数字。 3 车辆牌照识别系统组成 (1)图像预处理:对汽车图像进行图像转换、图像增强和边缘检测等。 (2)车牌定位:从预处理后的汽车图像中分割出车牌图像。即在一幅车辆图像中找到车牌所在的位置。 (3)字符分割:对车牌图像进行几何校正、去噪、二值化以及字符分割以从车牌图像中分离出组成车牌号码的单个字符图像

matlab车牌识别课程设计报告(附源代码)

Matlab程序设计任务书

目录 一.课程设计目的 (3) 二.设计原理 (3) 三.详细设计步骤 (3) 四. 设计结果及分析 (18) 五. 总结 (19) 六. 设计体会 (20) 七. 参考文献 (21)

一、课程设计目的 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 二、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 三、详细设计步骤:

1. 提出总体设计方案: 牌照号码、颜色识别 为了进行牌照识别,需要以下几个基本的步骤: a.牌照定位,定位图片中的牌照位置; b.牌照字符分割,把牌照中的字符分割出来; c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。 牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。 (1)牌照定位: 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。 流程图:

matlab车牌识别课程设计报告(附源代码)

Matlab程序设计任务书 目录

一.课程设计目的 (3) 二.设计原理 (3) 三.详细设计步骤 (3) 四. 设计结果及分析 (18) 五. 总结 (19) 六. 设计体会 (20) 七. 参考文献 (21) 一、课程设计目的 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过

设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 二、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 三、详细设计步骤: 1. 提出总体设计方案: 牌照号码、颜色识别 为了进行牌照识别,需要以下几个基本的步骤: a.牌照定位,定位图片中的牌照位置; b.牌照字符分割,把牌照中的字符分割出来; c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。

牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。 (1)牌照定位: 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合汽车牌照特征的若干区域作为候选区,然后对这些侯选区域做进一步分析、评判,最后选定一个最佳的区域作为牌照区域,并将其从图象中分割出来。 流程图: 完成牌照区域的定位后,再将牌照区域分割成单个字符,然后进行识别。字符分割一般采用垂直投影法。由于字符在垂直方向上的投影必然在字符间或字符内的间隙处取得局部最小值的附近,并且这个位置应满足牌照的字符书写格式、字符、尺寸限制和一些其他条件。利用垂直投影法对复杂环境下的汽车图像中的字符分割有较好的效果。 字符识别方法目前主要有基于模板匹配算法和基于人工神经网络算法。 基于模板匹配算法首先将分割后的字符二值化,并将其尺寸大小缩放为字符数据库中模板的大小, 然后与所有的模板进行匹配,最后选最佳匹配作为结果。基于人工神经元网络的算法有两种:一种是先对待识别字符进行特征提取,然后用所获得特征来训练神经网络分配器;另一种方法是直接把待处理图像输入网络,由网络自动实现特征提取直至识别出结果。实际应用中,牌照识别系统的识别率与牌照质量和拍摄质量密切相关。牌照质量会受到各种因素的影响,如生锈、污损、油漆剥落、字体褪色、牌照被遮挡、牌照倾斜、高亮反光、多牌照、假牌照等等;实际拍摄过程也会受到环境亮度、拍摄亮度、车辆速度等等因素的影响。这些影响因素不同程度上降低了牌照识别的识别率,也正是牌照识别系统的困难和挑战所在。为了提高识别率,除了不断的完善识别算法,还应该想办法克服各种光照条件,使采集到的图像最利于识别。 clear ; close all;

matlab车牌识别程序代码

% 车牌识别程序主体 clc; close all; clear all; %========================================================== %说明: % % %=========================================================== % ==============测定算法执行的时间,开始计时================= tic %%%%%记录程序运行时间 %=====================读入图片================================ [fn,pn,fi]=uigetfile('*.jpg','选择图片'); I=imread([pn fn]); figure; imshow(I); title('原始图像');%显示原始图像 chepailujing=[pn fn] I_bai=I; [PY2,PY1,PX2,PX1]=caitu_fenge(I); % I=rgb2hsv(I); % [PY2,PY1,PX2,PX1]=caitu_tiqu(I,I_bai);%用HSI模型识别蓝色,用rgb模型识别白色 %================分割车牌区域================================= %===============车牌区域根据面积二次修正====================== [PY2,PY1,PX2,PX1,threshold]=SEC_xiuzheng(PY2,PY1,PX2,PX1); %==============更新图片============================= Plate=I_bai(PY1:PY2,PX1:PX2,:);%使用caitu_tiqu %==============考虑用腐蚀解决蓝色车问题============= bw=Plate;figure,imshow(bw);title('车牌图像');%hsv彩图提取图像 %==============这里要根据图像的倾斜度进行选择这里选择的图片20090425686.jpg bw=rgb2gray(bw);figure,imshow(bw);title('灰度图像'); %================倾斜校正====================== qingxiejiao=rando_bianhuan(bw) bw=imrotate(bw,qingxiejiao,'bilinear','crop');figure,imshow(bw);title('倾斜校正');%取值为负值向右旋转 %============================================== bw=im2bw(bw,graythresh(bw));%figure,imshow(bw); bw=bwmorph(bw,'hbreak',inf);%figure,imshow(bw); bw=bwmorph(bw,'spur',inf);%figure,imshow(bw);title('擦除之前');

车牌识别的matlab程序

附录 车牌识别程序 clear ; close all; %Step1 获取图像装入待处理彩色图像并显示原始图像 Scolor = imread('3.jpg');%imread函数读取图像文件 %将彩色图像转换为黑白并显示 Sgray = rgb2gray(Scolor);%rgb2gray转换成灰度图 figure,imshow(Scolor),title('原始彩色图像');%figure命令同时显示两幅图 figure,imshow(Sgray),title('原始黑白图像'); %Step2 图像预处理对Sgray 原始黑白图像进行开操作得到图像背景s=strel('disk',13);%strel函数 Bgray=imopen(Sgray,s);%打开sgray s图像 figure,imshow(Bgray);title('背景图像');%输出背景图像 %用原始图像与背景图像作减法,增强图像 Egray=imsubtract(Sgray,Bgray);%两幅图相减 figure,imshow(Egray);title('增强黑白图像');%输出黑白图像 %Step3 取得最佳阈值,将图像二值化 fmax1=double(max(max(Egray)));%egray的最大值并输出双精度型 fmin1=double(min(min(Egray)));%egray的最小值并输出双精度型level=(fmax1-(fmax1-fmin1)/3)/255;%获得最佳阈值 bw22=im2bw(Egray,level);%转换图像为二进制图像 bw2=double(bw22); %Step4 对得到二值图像作开闭操作进行滤波 figure,imshow(bw2);title('图像二值化');%得到二值图像 grd=edge(bw2,'canny')%用canny算子识别强度图像中的边界 figure,imshow(grd);title('图像边缘提取');%输出图像边缘 bg1=imclose(grd,strel('rectangle',[5,19]));%取矩形框的闭运算 figure,imshow(bg1);title('图像闭运算[5,19]');%输出闭运算的图像bg3=imopen(bg1,strel('rectangle',[5,19]));%取矩形框的开运算

车牌识别的matlab程序(程序-讲解-模板)

车牌识别的matlab程序(程序-讲解-模板)

clc clear close all I=imread('chepai.jpg'); subplot(3,2,1);imshow(I), title('原始图像'); I_gray=rgb2gray(I); subplot(3,2,2),imshow(I_gray),title('灰度图像'); %====================== 形态学预处理====================== I_edge=edge(I_gray,'sobel'); subplot(3,2,3),imshow(I_edge),title('边缘检测后图像'); se=[1;1;1]; I_erode=imerode(I_edge,se); subplot(3,2,4),imshow(I_erode),title('腐蚀后边缘图像'); se=strel('rectangle',[25,25]); I_close=imclose(I_erode,se); %图像闭合、填充图像 subplot(3,2,5),imshow(I_close),title('填充后图像

for i=1:size(location_of_1,1) %寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置 temp=location_of_1(i,1)+location_of_1(i,2); if tempmaxi maxi=temp; b=i; end end first_point=location_of_1(a,:); %和最小的点为车牌的左上角 last_point=location_of_1(b,:); %和最大的点为车牌的右下角 x1=first_point(1)+4; %坐标值修正 x2=last_point(1)-4; y1=first_point(2)+4;

matlab车牌识别课程设计报告(附源代码)

Matlab程序设计任务书 分院(系)信息科学与工程专业 学生姓名学号 设计题目车牌识别系统设计 内容及要求: 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过设计实现车牌识别系统,能够提高学生 分析问题和解决问题的能力,还能培养一定的科研能力。 1.牌照识别系统应包括车辆检测、图像采集、牌照识别等几 部分。 2.当车辆检测部分检测到车辆到达时,触发图像采集单元,采 集当前的视频图像。 3.牌照识别单元对图像进行处理,定位出牌照位置,再将牌 照中的字符分割出来进行识别,然后组成牌照号码输出。 进度安排: 19周:Matlab环境熟悉与基础知识学习 19周:课程设计选题与题目分析 20周:程序设计编程实现 20周:课程设计验收与答辩 指导教师(签字): 年月日学院院长(签字): 年月日 目录

一.课程设计目的 (3) 二.设计原理 (3) 三.详细设计步骤 (3) 四. 设计结果及分析 (18) 五. 总结 (19) 六. 设计体会 (20) 七. 参考文献 (21) 一、课程设计目的 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过

设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 二、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 三、详细设计步骤: 1. 提出总体设计方案: 牌照号码、颜色识别 为了进行牌照识别,需要以下几个基本的步骤: a.牌照定位,定位图片中的牌照位置;

基于matlab的车牌定位源程序及运行结果 (1)

I=imread('E:\毕业设计\基于matlab的车牌定位的源程\车牌识别程序 \Car1.jpg') [y,x,z]=size(I); myI=double(I); tic Blue_y=zeros(y,1); for i=1:y for j=1:x if((myI(i,j,1)<=30)&&((myI(i,j,2)<=62)&&(myI(i,j,2)>=51))&&((myI(i,j,3) <=142)&&(myI(i,j,3)>=119))) Blue_y(i,1)= Blue_y(i,1)+1; end end end [temp MaxY]=max(Blue_y); PY1=MaxY; while ((Blue_y(PY1,1)>=120)&&(PY1>1)) PY1=PY1-1; end PY2=MaxY; while ((Blue_y(PY2,1)>=40)&&(PY2=10))&&((myI(i,j,3) <=65)&&(myI(i,j,3)>=40))) Blue_x(1,j)= Blue_x(1,j)+1; end end end PX1=1; while ((Blue_x(1,PX1)<3)&&(PX1PX1)) PX2=PX2-1; end PX1=PX1-2; PX2=PX2+2; Plate=I(PY1:PY2,PX1-2:PX2,:); t=toc figure,imshow(I); figure,plot(Blue_y);grid

MATLAB车牌识别过程

7.3 系统详细设计 7.3.1 车牌图像读入 目前常用的图像格式主要有*.PCX、*.BMP、*.JPG、*.TIFF、*.GIF 等,本设计采集到的图片格式为*.JPG格式,这种格式的图像占有的存储空间小,而且是使用最广的图片保存和传输格式,大多数的摄像设备也都是以*.JPG格式保存图像的。利用图像工具的图像读取函数imread() 来读取一副图像,其使用格式为: I=imread(‘fn pn’); %fn为图像文件名,pn为文件路径 使用图像工具的图像显示函数imshow() 来显一副图像,使用格式为: Imshow(I); 具体代码为: [fn pn]=uigetfile (‘*.JPG’,’选择图片’);%选择图像文件,fn为文件名,pn为路径I= imread ([fn pn]); %显示所选图像 Figure,imshow(I);title(‘原始车牌图像’); %在新建的figure中显示所选图像文件, figure标题为原始车牌图像 以一副名为“桂APC322”的车牌图片为例,程序运行结果为:

7.3.2 彩色(基于蓝色)车牌定位、提取 将彩色车牌读入后,采用水平垂直双向投影法,将图像分别投影到X、Y坐标轴,然后分别 沿X、Y轴扫描图像。当沿Y轴扫描时,一边扫描一边统计图像中蓝色像素点的个数,第一次扫描到蓝色像素点最多的行时停止扫描,并记录下蓝色像素点最多的行,然后以这行为基点,分别向上、向下扫描直到统计的像素点小于像素点阀值时,停止扫描,记录上下行的 Y轴坐标PY2,PY1,I=(PY1:PY2,: ,:)就为Y轴方向的车牌区域,代码如下: Blue_y=zeros(y,1); for i=1:y for j=1:x if((myI(i,j,1)<=48)&&((myI(i,j,2)<=100)&&(myI(i,j,2)>=40))&&((myI(i,j ,3)<=200)&&(myI(i,j,3)>=80))) Blue_y(i,1)= Blue_y(i,1)+1; %统计蓝色像素点 end end end [temp MaxY]=max(Blue_y); % PY1=MaxY;% while ((Blue_y(PY1,1)>=Y_threshlow)&&(PY1>1)) %

最新车牌识别系统MATLAB源代码完整解析

clc; clear all; close all; [filename, pathname, filterindex] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';... '*.*','All Files' }, '选择待处理图像', ... 'images\01.jpg'); file = fullfile(pathname, filename);%文件路径和文件名创建合成完整文件名 id = Get_Id(file);%得到file中的所有对象 Img = imread(file);%根据路径和文件名读取图片到Img [Plate, bw, Loc] = Pre_Process(Img); % 车牌区域预处理 result = Plate_Process(Plate, id); % 车牌区域二值化处理 % 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割bw = Segmation(result); words = Main_Process(bw); % 主流程处理 Write_Mask(words, id); % 写出到模板库 str = Pattern_Recognition(words); % 识别 function id = Get_Id(file) % 获取图像id信息 % 输入参数: % file——图像路径 % 输出参数: % id——图像id信息 info = imfinfo(file); FS = [422227 354169 293184 235413 214202 ... 130938 490061 120297 98686 137193 ... 80558 46208 69947 58110 62115 ... 59072 52168 60457 53979 50223]; id = find(FS == info.FileSize); if isempty(id) warndlg('未建立该图像模板库,可能运行出错!', '警告'); id = 1; end function R = Cubic_Spline(P) % 三次样条插值 % 输入参数: % P——节点矩阵 % 输出参数: % R——样条节点矩阵

车牌识别的matlab程序(程序-讲解-模板)

clc clear close all I=imread('chepai.jpg'); subplot(3,2,1);imshow(I), title('原始图像'); I_gray=rgb2gray(I); subplot(3,2,2),imshow(I_gray),title('灰度图像'); %====================== 形态学预处理====================== I_edge=edge(I_gray,'sobel'); subplot(3,2,3),imshow(I_edge),title('边缘检测后图像'); se=[1;1;1]; I_erode=imerode(I_edge,se); subplot(3,2,4),imshow(I_erode),title('腐蚀后边缘图像'); se=strel('rectangle',[25,25]); I_close=imclose(I_erode,se); %图像闭合、填充图像 subplot(3,2,5),imshow(I_close),title('填充后图像'); I_final=bwareaopen(I_close,2000); %去除聚团灰度值小于2000的部分 subplot(3,2,6),imshow(I_final),title('形态滤波后图像'); %========================== 车牌分割============================= I_new=zeros(size(I_final,1),size(I_final,2)); location_of_1=[]; for i=1:size(I_final,1) %寻找二值图像中白的点的位置 for j=1:size(I_final,2) if I_final(i,j)==1; newlocation=[i,j]; location_of_1=[location_of_1;newlocation]; end end end mini=inf;maxi=0; for i=1:size(location_of_1,1) %寻找所有白点中,x坐标与y坐标的和最大,最小的两个点的位置 temp=location_of_1(i,1)+location_of_1(i,2); if tempmaxi maxi=temp; b=i; end end first_point=location_of_1(a,:); %和最小的点为车牌的左上角 last_point=location_of_1(b,:); %和最大的点为车牌的右下角

基于MATLAB的车牌识别课程设计

MATLAB课程设计报告书 课题名称基于MATLAB的车牌识别课程设计 姓名 学号 学院 专业 指导教师 2016年6月21日

基于MATLAB的车牌识别课程设计 目录 一.课程设计目的……………………………………………二.设计原理…………………………………………………三.详细设计步骤…………………………………………… 四. 设计结果及分析………………………………………… 五. 总结……………………………………………………… 六. 设计体会………………………………………………… 七. 参考文献…………………………………………………

一、课程设计目的 车牌定位系统的目的在于正确获取整个图像中车牌的区域,并识别出车牌号。通过设计实现车牌识别系统,能够提高学生分析问题和解决问题的能力,还能培养一定的科研能力。 二、设计原理: 牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某些牌照识别系统还具有通过视频图像判断车辆驶入视野的功能称之为视频车辆检测。一个完整的牌照识别系统应包括车辆检测、图像采集、牌照识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。牌照识别单元对图像进行处理,定位出牌照位置,再将牌照中的字符分割出来进行识别,然后组成牌照号码输出。 三、详细设计步骤:

1. 提出总体设计方案: 牌照号码、颜色识别 为了进行牌照识别,需要以下几个基本的步骤: a.牌照定位,定位图片中的牌照位置; b.牌照字符分割,把牌照中的字符分割出来; c.牌照字符识别,把分割好的字符进行识别,最终组成牌照号码。 牌照识别过程中,牌照颜色的识别依据算法不同,可能在上述不同步骤实现,通常与牌照识别互相配合、互相验证。 (1)牌照定位: 自然环境下,汽车图像背景复杂、光照不均匀,如何在自然背景中准确地确定牌照区域是整个识别过程的关键。首先对采集到的视频图像进行大范围相关搜索,找到符合

车牌识别matlab程序[1]

[, pathname] = uigetfile({'*.jpg', 'JPEG文件(*.jpg)';'*.bmp','BMP文件(*.bmp)';}); if( == 0), return, end global %声明全局变量 = [pathname ]; I=imread(); imshow(I); %显示图像I I1=rgb2gray(I);%RGB图转化为灰度图 figure,imshow(I1); w1=medfilt2(I1); figure,imshow(w1); s1=histeq(w1,256); figure,imshow(s1); t1=imadjust(s1); figure,imshow(t1); I2=edge(t1,'robert',0.15,'both'); %用ROBERT算子提取图像边缘 figure,imshow(I2); se=[1;1;1]; I3=imerode(I2,se); %弱化二进制图像I2的边缘 figure,imshow(I3);%为定位车牌,将白色区域膨胀,腐蚀去无关的小物件,包括车牌字符(下面两句) se=strel('rectangle',[25,20]); %用来腐蚀的形状为矩形,面积20*25 I4=imclose(I3,se); figure,imshow(I4); I5=bwareaopen(I4,2000); %去除图像中面积过小的,可以肯定不是车牌的区域。 figure,imshow(I5); [y,x,z]=size(I5); %z=1。y,x分别为I5图像的高和宽 myI=double(I5) %myI=I5; tic %begin横向扫描 white_y=zeros(y,1); %white_y为y行1列的零矩阵 for i=1:y for j=1:x if(myI(i,j,1)==1) %如果myI(i,j,1)即myI图像中坐标为(i,j)的点为白色 %则white_y的相应行的元素white_y(i,1)值加1 white_y(i,1)= white_y(i,1)+1; end end end [temp MaxY]=max(white_y); %temp为向量white_y的元素中的最大值,MaxY为该值的索引(在向量中的位置)

基于matlab的车牌识别(含子程序)

基于matlab的车牌识别系统 一、对车辆图像进行预处理 1.载入车牌图像: function [d]=main(jpg) [filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'}); if(filename == 0), return, end global FILENAME %定义全局变量 FILENAME = [pathname filename]; I=imread(FILENAME); figure(1),imshow(I);title('原图像');%将车牌的原图显示出来结果如下:

2.将彩图转换为灰度图并绘制直方图: I1=rgb2gray(I);%将彩图转换为灰度图 figure(2),subplot(1,2,1),imshow(I1);title('灰度图像'); figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');%绘制灰度图的直方图结果如下所示: 3. 用roberts算子进行边缘检测: I2=edge(I1,'roberts',0.18,'both');%选择阈值0.18,用roberts算子进行边缘检测 figure(3),imshow(I2);title('roberts 算子边缘检测图像'); 结果如下:

4.图像实施腐蚀操作: se=[1;1;1]; I3=imerode(I2,se);%对图像实施腐蚀操作,即膨胀的反操作figure(4),imshow(I3);title('腐蚀后图像'); 5.平滑图像 se=strel('rectangle',[25,25]);%构造结构元素以正方形构造一个se

数字图像处理车牌识别课程设计matlab实现附源代码

基于matlab 的车牌识别系统 一、目的与要求 目的:利用matlab 实现车牌识别系统,熟悉matlab 应用软件的基础知识,了解了基本程序设计方法,利用其解决数字信号处理的实际应用问题,从而加深对理论知识的掌握,并把所学的知识系统、高效的贯穿到实践中来,避免理论与实践的脱离,巩固理论课上知识的同时,加强实践能力的提高,理论联系实践,提高自身的动手能力。同时不断的调试程序也提高了自己独立编程水平,并在实践中不断完善理论基础,有助于自身综合能力的提高。 要求: 1. 理解各种图像处理方法确切意义。 2. 独立进行方案的制定,系统结构设计要合理。 3.在程序开发时,则必须清楚主要实现函数的目的和作用,需要在程序书写时说明做适当的注释。如果使用matlab 来进行开发,要理解每个函数的具体意义和适用范围,在写课设报告时,必须要将主要函数的功能和参数做详细的说明。 4、通过多幅不同形式的图像来检测该系统的稳定性和正确性。 二、设计的内容 学习MATLAB 程序设计,利用MATLAB 函数功能,设计和实现通过设计一个车牌识别系统。车牌识别系统的基本工作原理为:将手机拍摄到的包含车辆牌照的图像输入到计算机中进行预处理,再对牌照进行搜索、检测、定位,并分割出包含牌照字符的矩形区域,然后对牌照字符进行二值化并将其分割为单个字符,然后将其逐个与创建的字符模板中的字符进行匹配,匹配成功则输出,最终匹配结束则输出则为车牌号码的数字。车牌识别系统的基本

工作原理图如图1所下所示: 字符分割 字符识别 输出车牌号码 车辆牌照识别整个系统主要是由车牌定位和字符分割识别两部分组成,其中车牌定位又可以分为图像预处理及边缘提取模块和牌照的定位及分割模块;字符识别可以分为字符分割和单个字符识别两个模块。 为了用于牌照的分割和牌照字符的识别,原始图象应具有适当的亮度,较大的对比度和清晰可辩的牌照图象。但由于是采用智能手机在开放的户外环境拍照,加之车辆 牌照的整洁度、自然光照条件、拍摄时摄像机与牌照的矩离等因素的影响,牌照图象 可能出现模糊、歪斜和缺损等严重缺陷,因此需要对原始图象进行识别前的预处理。 牌照的定位和分割是牌照识别系统的关键技术之一,其主要目的是在经图象预处理后的原始灰度图象中确定牌照的具体位置,并将包含牌照字符的一块子图象从整个 图象中分割出来,供字符识别子系统识别之用,分割的准确与否直接关系到整个牌照字符识别系统的识别率。 由于拍摄时的光照条件、牌照的整洁程度的影响,和摄像机的焦距调整、镜头的光学畸变所产生的噪声都会不同程度地造成牌照字符的边界模糊、细节不清、笔划断

基于Matlab的车牌识别实现源码

function[]=main(jpg) close all clc tic %测定算法执行的时间 [fn,pn]=uigetfile('timg1,jpg','选择图片') %读入图片 I=imread([pn,fn]); figure,imshow(I);title('原始图像'); %显示原始图像 Im1=rgb2gray(I); figure(2), subplot(1,2,1), imshow(Im1); title('灰度图'); figure(2), subplot(1,2,2), imhist(Im1); title('灰度图的直方图'); %显示图像的直方图 Tiao=imadjust(Im1,[0.19,0.78],[0,1]); %调整图片 figure(3), subplot(1,2,1), imshow(Tiao);title('增强灰度图'); figure(3), subplot(1,2,2), imhist(Tiao); title('增强灰度图的直方图'); Im2=edge(Tiao,'Roberts','both'); %使用sobel算子进行边缘检测figure(4), imshow(Im2); title('sobel算子实现边缘检测') se=[1;1;1]; Im3=imerode(Im2,se); figure(5), imshow(Im3);

se=strel('square',40);%'rectangle',[25,25]/'diamond',25/ Im4=imclose(Im3,se); figure(6), imshow(Im4); title('平滑图像的轮廓'); Im5=bwareaopen(Im4,1500); figure(7), imshow(Im5); title('移除小对象'); [y,x,z]=size(Im5); %返回Im5各维的尺寸,并存储在变量y、x、z中 Im6=double(Im5); %将Im5换成双精度数值 %开始横向扫描 tic %tic计时开始,toc结束,计算tic与toc之间程序的运行时间 Blue_y=zeros(y,1); %产生y*1的全0矩阵 for i=1:y %逐行扫描 for j=1:x if(Im6(i,j,1)==1)%如果Im6图像中坐标为(i,j)的点值为1,即为移除小对象的白色区域, Blue_y(i,1)= Blue_y(i,1)+1;%则y*1列矩阵的相应像素点的元素值加1, end end end [temp MaxY]=max(Blue_y);%temp为向量Blue_y的矩阵中的最大值,MaxY为该值的索引(最大值在向量中的位置) %返回包含最大元素的列,即白色区域最宽的列 %Y方向车牌区域确定 figure(8),subplot(1,2,1), plot(0:y-1,Blue_y),title('行方向白色像素点累计'),xlabel('行数'),ylabel('个数'); PY1=MaxY; while ((Blue_y(PY1,1)>=120)&&(PY1>1)) PY1=PY1-1; end PY2=MaxY; while ((Blue_y(PY2,1)>=40)&&(PY2

相关文档
相关文档 最新文档