基于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 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
正在阅读:
基于MATLAB的字符识别研究12-04
《精神科护理学》练习题12-16
收集记忆 记忆宫殿1000桩高清图04-06
追忆现代诗歌欣赏03-21
激励性薪酬体系设计05-22
不动明王心咒08-24
乡镇2021年工作规划范文08-16
2012年02月04日雅思写作机经04-03
中华民族精神超星尔雅课程答案解析09-15
xx公司股权融资计划书 - 图文05-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 字符
- 识别
- 基于
- MATLAB
- 研究
- 方案设计包括哪些内容
- C语言模拟题(2014-5)答案
- 职业生涯规划大赛策划书 - 图文
- 模具加工技术模具制造作业参考答案
- 江苏省扬州市2017年中考数学试题(含答案)
- 《定向越野》校本课程纲要
- 农村商业银行信贷管理系统黑名单管理办法1.1
- 人教版七年级语文下册第三单元课文知识点梳理精编
- The Sad Young Men 习题答案
- 长清高大模板方案4.13
- 2013徐州一中高考录取名单
- 东亚和日本练习题(DOC)
- 《UCI数据集和源代码》
- 2016年安全知识竞赛题库一(综合知识)
- 小升初语文给句子加标点练习题
- 产业化成果
- 汽轮机原理练习(2012年)
- 思想的洗礼 知识的充实--党课思想汇报
- 殷店幼儿园家庭经济困难幼儿资助工作实施方案
- 南通市化学试剂行业企业名录2018版123家 - 图文