基于MATLAB的字符识别研究

更新时间:2023-12-04 17:43:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

function Bayes2

%算法视线见《模式识别》P33-P44(各类样本的协方差不相等) %为了提高实验样本测试的精度,故采用多次模拟求平均值的方法 N=input('实验模拟次数 N(N最好为奇数)= '); Result(1:3,1:3)=0; %判别矩阵的初始化 for k=1:N %控制程序模拟次数N %生成二维正态分布的样本2 X N 维的矩阵 X1=mvnrnd([1 2],[4 0;0 6],300)'; %2 X N X2=mvnrnd([5 3],[5 0;0 1],200)';

X3=mvnrnd([4 7],[2 0;0 9],500)'; %样本程序

%---------------------------------------------------% %测试样本

X10=mvnrnd([1 2],[4 0;0 6],100)'; %2 X N X20=mvnrnd([5 3],[5 0;0 1],100)'; X30=mvnrnd([4 7],[2 0;0 9],100)'; %先验概率

P(1)=length(X1)/(length(X1)+length(X2)+length(X3)); P(2)=length(X2)/(length(X1)+length(X2)+length(X3)); P(3)=length(X3)/(length(X1)+length(X2)+length(X3)); %计算相关量 cov(X):协方差矩阵 Ave:均值

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

W1=-1/2*inv(cov(X1')); W2=-1/2*inv(cov(X2')); W3=-1/2*inv(cov(X3'));% Ave1=(sum(X1')/length(X1))';Ave2=(sum(X2')/length(X2))'; Ave3=(sum(X3')/length(X3))';%计算平均值(2维列向量)

w1=inv(cov(X1'))*Ave1;w2=inv(cov(X2'))*Ave2;w3=inv(cov(X3'))*Ave3;%2 w10=-1/2*Ave1'*inv(cov(X1'))*Ave1-1/2*log(det(cov(X1')))+log(P(1)); w20=-1/2*Ave2'*inv(cov(X2'))*Ave2-1/2*log(det(cov(X2')))+log(P(2)); w30=-1/2*Ave3'*inv(cov(X3'))*Ave3-1/2*log(det(cov(X3')))+log(P(3)); %-----------------------------------------------------------% for i=1:3 for j=1:100 if i==1

g1=X10(:,j)'*W1*X10(:,j)+w1'*X10(:,j)+w10; g2=X10(:,j)'*W2*X10(:,j)+w2'*X10(:,j)+w20; g3=X10(:,j)'*W3*X10(:,j)+w3'*X10(:,j)+w30; if g1>=g2&g1>=g3

Result(1,1)=Result(1,1)+1; elseif g2>=g1&g2>=g3

Result(1,2)=Result(1,2)+1;%记录误判情况 else

1 / 15

Result(1,3)=Result(1,3)+1;%记录误判情况 end elseif i==2

g1=X20(:,j)'*W1*X20(:,j)+w1'*X20(:,j)+w10; g2=X20(:,j)'*W2*X20(:,j)+w2'*X20(:,j)+w20; g3=X20(:,j)'*W3*X20(:,j)+w3'*X20(:,j)+w30; if g2>=g1&g2>=g3

Result(2,2)=Result(2,2)+1; elseif g1>=g2&g1>=g3

Result(2,1)=Result(2,1)+1; else

Result(2,3)=Result(2,3)+1; end else

g1=X30(:,j)'*W1*X30(:,j)+w1'*X30(:,j)+w10; g2=X30(:,j)'*W2*X30(:,j)+w2'*X30(:,j)+w20; g3=X30(:,j)'*W3*X30(:,j)+w3'*X30(:,j)+w30; if g3>=g1&g3>=g2

Result(3,3)=Result(3,3)+1; elseif g2>=g1&g2>=g3

Result(3,2)=Result(3,2)+1; else

Result(3,1)=Result(3,1)+1; end end end end end

%画出各样本的分布情况 subplot(2,1,1)

plot(X1(1,:),X1(2,:),'r.','LineWidth',2),hold on plot(X2(1,:),X2(2,:),'go','LineWidth',2),hold on plot(X3(1,:),X3(2,:),'b+','LineWidth',2),hold on title('训练样本分布情况')

legend('训练样本1','训练样本2','训练样本3') subplot(2,1,2)

plot(X10(1,:),X10(2,:),'r.','LineWidth',2),hold on plot(X20(1,:),X20(2,:),'go','LineWidth',2),hold on plot(X30(1,:),X30(2,:),'b+','LineWidth',2),hold on title('测试样本分布情况')

legend('测试样本1','测试样本2','测试样本3')

%由于多次循环后存在小数,根据实际情况判别矩阵须取整

%如果N为偶数,可能出现小数为0.5的情况,此时将无法更加准确判断矩阵 Result=Result/N %判别矩阵,反映Bayes的判别效果 for i=1:length(Result)

if round(sum(Result(i,:)-fix(Result(i,:))))==1

2 / 15

[m,n]=find(max(Result(i,:)-fix(Result(i,:)))==(Result(i,:)-fix(Result(i,:)))); n=min(n);%存在小数点相同的情况随即选取一个 for j=1:length(Result) if j==n

Result(i,j)=fix(Result(i,j))+1; else

Result(i,j)=fix(Result(i,j)); end end

elseif round(sum(Result(i,:)-fix(Result(i,:))))==2

[m,n1]=find(max(Result(i,:)-fix(Result(i,:)))==(Result(i,:)-fix(Result(i,:))));

[m,n2]=find(min(Result(i,:)-fix(Result(i,:)))==(Result(i,:)-fix(Result(i,:)))); n1=min(n1);n2=min(n2);%如果有存在小数点相同的情况,随即选取一个 for j=1:length(Result) if j==n1

Result(i,j)=fix(Result(i,j))+1; elseif j==n2

Result(i,j)=fix(Result(i,j)); else

Result(i,j)=fix(Result(i,j))+1; end end else

continue, end end

图像预处理

具体步骤如下:首先对图像进行灰度转换,二值化处理然后采用4X1的结构元素对图像进行腐蚀,去除图像的噪声。采用25X25的结构元素,对图像进行闭合应算使车牌所在的区域形成连通。再进行形态学滤波去除其它区域。 I=imread('CAR/0.jpg'); %读取图片

3 / 15

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

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

se=[1;1;1]; %线型结构元素 I3=imerode(I2,se); %腐蚀图像

4 / 15

se=strel('rectangle',[25,25]); %矩形结构元素 I4=imclose(I3,se); %图像聚类、填充图像

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

通过对比原始图片,我们可以发现形态滤波后的图像已经很接近正确的车牌位置了,因此后期处理将通过这张图来找出车牌位置。

2. 车牌定位

观察经过预处理后得到的图像发现车牌位置有明显的矩形有明显的矩形图样,通过对矩形区域的定位即可获得具体的车牌位置。

5 / 15

(1) 车牌的行起始和终止位置的确定 [y,x]=size(I5); I6=double(I5);

%绘制行曲线图 Y1=zeros(y,1); for i=1:y for j=1:x

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

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

figure();

subplot(1,3,1);

plot(0:y-1,Y1),title('行像素灰度值累计'),xlabel('行值'),ylabel('像素和'); [temp, MaxY]=max(Y1); PY1=MaxY;

while ((Y1(PY1,1)>=80)&&(PY1>1)) PY1=PY1-7; end

PY2=MaxY;

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

(2) 车牌的列起始位置和终止位置的确定 %绘制列曲线图 X1=zeros(1,x); for j=1:x

for i=PY1:PY2 if(I6(i,j)==1)

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

subplot(1,3,2);

plot(0:x-1,X1),title('列像素灰度值累计'),xlabel('列值'),ylabel('像数和');

PX1=1;

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

while ((X1(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-7; end

6 / 15

(3) 最后拼合获取的车牌在图像的行列位置 DW=I(PY1:PY2,PX1:PX2,:); subplot(1,3,3);

imshow(DW),title('车牌定位后图像');

3. 字符分割

在汽车牌照自动识别过程中,字符分割有承前启后的作用。它在前期牌照定位的基础上进行字符的分割,然后再利用分割的结果进行字符识别。

%% 车牌图像转为灰度 if isrgb(I) I1 = rgb2gray(I); else I1 = I; end

%% 二值化车牌图像

I1 = im2bw(I1,graythresh(I1));%二值化图像

7 / 15

I2 = bwareaopen(I1,16);%去除小于16像素的区块 figure();

subplot(1,2,1);

imshow(I2),title('二值化车牌图像');

%% 分割字符按行积累量 [y,x]=size(I2); I3=double(I2); X1=zeros(1,x); for j=1:x for i=1:y if(I3(i,j)==1)

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

subplot(1,2,2);

plot(0:x-1,X1),title('车牌列像素点累计'),xlabel('列值'),ylabel('像素和');

8 / 15

%% 分割字符 Px0=1; Px1=1; figure(); for i=1:7 while ((X1(1,Px0)<3)&&(Px0=3)&&(Px1

9 / 15

otherwise PIN6=Z; end subplot(1,7,i); imshow(Z); Px0=Px1; end

分割成七块后的车牌图像

4. 建立字符模板数据库

汽车牌照的字符一般有 7 个,大部分车牌第一位是汉字,通常代表车辆所属省份,或是军种 警别等有特定含义的字符简称;紧接其后的为字母与数字。十个阿拉伯数字0~9, 26 个大写英文字母 A~Z 以及相关的车牌用汉字:京、沪、苏、台、港、澳、甲、乙、丙、使、领、学、试、境、消、边、警等。

function inpt = Pretreatment(I) %% 训练样本前期处理 if isrgb(I)

I1 = rgb2gray(I); else I1=I; end

I1=imresize(I1,[50 25]);%将图片统一划为50*25大小 I1=im2bw(I1,0.9);

10 / 15

[m,n]=size(I1); inpt=zeros(1,m*n);

%% 将图像按列转换成一个行向量 for j=1:n for i=1:m

inpt(1,m*(j-1)+i)=I1(i,j); end end

这是一个自定义函数的Pretreatment.m 文件,可以解决频繁写重复代码的问题,前面的图像预处理及车牌定位的代码可以写进Location.m文件中,通过代码DW = Location(I); 取得车牌定位后的图像;同时字符分割的代码亦可写进StringSplit.m 文件中,可以通过代码[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=StringSplit(DW); 取得的字符分割后的图像。

5. 字符识别

字符的识别目前用于车牌字符识别(OCR)中的算法主要有基于模板匹配的OCR算法以及基于人工神经网络的OCR算法。

设计代码如下: close all; clear all;

%% 归一化训练样本

I0=pretreatment(imread('BP/0.jpg')); I1=pretreatment(imread('BP/1.jpg')); I2=pretreatment(imread('BP/2.jpg')); I3=pretreatment(imread('BP/3.jpg')); I4=pretreatment(imread('BP/4.jpg')); I5=pretreatment(imread('BP/5.jpg')); I6=pretreatment(imread('BP/6.jpg')); I7=pretreatment(imread('BP/7.jpg')); I8=pretreatment(imread('BP/8.jpg')); I9=pretreatment(imread('BP/9.jpg')); I10=pretreatment(imread('BP/A.jpg')); I11=pretreatment(imread('BP/B.jpg')); I12=pretreatment(imread('BP/C.jpg')); I13=pretreatment(imread('BP/D.jpg')); I14=pretreatment(imread('BP/G.jpg')); I15=pretreatment(imread('BP/K.jpg')); I16=pretreatment(imread('BP/L.jpg')); I17=pretreatment(imread('BP/M.jpg'));

P=[I0',I1',I2',I3',I4',I5',I6',I7',I8',I9',I10',I11',I12',I13',I14',I15',I16',I17']; T=eye(18,18); %输出样本

%% bp神经网络参数设置

net=newff(minmax(P),[1250,32,18],{'logsig','logsig','logsig'},'trainrp'); net.inputWeights{1,1}.initFcn ='randnr'; net.layerWeights{2,1}.initFcn ='randnr'; net.trainparam.epochs=5000; net.trainparam.show=50; net.trainparam.lr=0.003;

net.trainparam.goal=0.0000000001; net=init(net);

11 / 15

[net,tr]=train(net,P,T); %训练样本 %% 测试

I=imread('CAR/0.jpg');

DW=Location(I);%车牌定位

[PIN0,PIN1,PIN2,PIN3,PIN4,PIN5,PIN6]=StringSplit(DW);%字符分割及处理

%% 测试字符,得到识别数值 PIN0=pretreatment(PIN0); PIN1=pretreatment(PIN1); PIN2=pretreatment(PIN2); PIN3=pretreatment(PIN3); PIN4=pretreatment(PIN4); PIN5=pretreatment(PIN5); PIN6=pretreatment(PIN6);

P0=[PIN0',PIN1',PIN2',PIN3',PIN4',PIN5',PIN6']; for i=2:7

T0= sim(net ,P0(:,i)); T1 = compet (T0) ; d = find(T1 == 1) - 1; if (d==10) str='A';

elseif (d==11) str='B';

elseif (d==12) str='C';

elseif (d==13) str='D';

elseif (d==14) str='G';

elseif (d==15) str='K';

elseif (d==16) str='L';

elseif (d==17) str='M'; elseif (d==0) str='0'; elseif (d==1) str='1'; elseif (d==2) str='2'; elseif (d==3) str='3'; elseif (d==4) str='4'; elseif (d==5) str='5'; elseif (d==6) str='6'; elseif (d==7) str='7'; elseif (d==8)

12 / 15

str='8'; elseif (d==9) str='9'; else

str=num2str(d); end switch i case 2

str2=str; case 3

str3=str; case 4

str4=str; case 5

str5=str; case 6

str6=str; otherwise str7=str; end end

%% 识别出的结果以标题形式显示在图上S=strcat('粤',str2,str3,str4,str5,str6,str7); figure();

imshow(DW),title(S);

/ 15 13

第一次训练后识别出的车牌号码:

14 / 15

发现第二个字符识别错误,在进行第十二次识别:

15 / 15

本文来源:https://www.bwwdw.com/article/94bt.html

Top