📄 lpcseg.m
字号:
se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵
[m,n]=size(d);
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,'13.膨胀或腐蚀处理后.jpg');
figure(3),subplot(3,2,5),imshow(d),title('13.膨胀或腐蚀处理后')
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
d=qiege(d);
[m,n]=size(d);
figure,subplot(2,1,1),imshow(d),title(n)
k1=1;k2=1;s=sum(d);j=1;
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
[m,n]=size(d);
left=1;wide=0;
while sum(d(:,wide+1))~=0
wide=wide+1;
end
if wide<y1 % 认为是左侧干扰
d(:,[1:wide])=0;
d=qiege(d);
else
temp=qiege(imcrop(d,[1 1 wide m]));
[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; % WORD 1
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);
% 商用系统程序中归一化大小为 32*16,此处演示
word1=imresize(word1,[40 20]);
word2=wordprocess(word2);
word3=wordprocess(word3);
word4=wordprocess(word4);
word5=wordprocess(word5);
word6=wordprocess(word6);
word7=wordprocess(word7);
subplot(5,7,15),imshow(word1),title('1');
subplot(5,7,16),imshow(word2),title('2');
subplot(5,7,17),imshow(word3),title('3');
subplot(5,7,18),imshow(word4),title('4');
subplot(5,7,19),imshow(word5),title('5');
subplot(5,7,20),imshow(word6),title('6');
subplot(5,7,21),imshow(word7),title('7');
imwrite(word1,'14.字符分割归一化后 1.jpg');
imwrite(word2,'14.字符分割归一化后 2.jpg');
imwrite(word3,'14.字符分割归一化后 3.jpg');
imwrite(word4,'14.字符分割归一化后 4.jpg');
imwrite(word5,'14.字符分割归一化后 5.jpg');
imwrite(word6,'14.字符分割归一化后 6.jpg');
imwrite(word7,'14.字符分割归一化后 7.jpg');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc
word='';
word(1)=wordrec(word1);
word(2)=wordrec(word2);
word(3)=wordrec(word3);
word(4)=wordrec(word4);
word(5)=wordrec(word5);
word(6)=wordrec(word6);
word(7)=wordrec(word7);
clc
save I 'word1' 'word2' 'word3' 'word4' 'word5' 'word6' 'word7'
clear
load I;
load bp net;
word='';
word(1)=wordrec(word1);
word(2)=wordrec(word2);
word(3)=wordrec(word3);
word(4)=wordrec(word4);
word(5)=wordrec(word5);
word(6)=wordrec(word6);
word(7)=wordrec(word7);
word=strcat('识别结果:',word);
subplot(5,3,14),imshow([]),title(word,'fontsize',24)
% 该子程序用于切割出最小范围
function e=qiege(d)
[m,n]=size(d);
top=1;bottom=m;left=1;right=n; % init
while sum(d(top,:))==0 && top<=m
top=top+1;
end
while sum(d(bottom,:))==0 && bottom>=1
bottom=bottom-1;
end
while sum(d(:,left))==0 && left<=n
left=left+1;
end
while sum(d(:,right))==0 && right>=1
right=right-1;
end
dd=right-left;
hh=bottom-top;
e=imcrop(d,[left top dd hh]);
% 分割字符
function [word,result]=getword(d)
word=[];flag=0;y1=8;y2=0.5;
% if d==[]
% word=[];
% else
while flag==0
[m,n]=size(d);
wide=0;
while sum(d(:,wide+1))~=0 && wide<=n-2
wide=wide+1;
end
temp=qiege(imcrop(d,[1 1 wide m]));
[m1,n1]=size(temp);
if wide<y1 && n1/m1>y2
d(:,[1:wide])=0;
if sum(sum(d))~=0
d=qiege(d); % 切割出最小范围
else word=[];flag=1;
end
else
word=qiege(imcrop(d,[1 1 wide m]));
d(:,[1:wide])=0;
if sum(sum(d))~=0;
d=qiege(d);flag=1;
else d=[];
end
end
end
%end
result=d;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 该子程序用于字符归一化处理
function d=wordprocess(d)
[m,n]=size(d);
%top 1/3, bottom 1/3
for i=1:round(m/3)
if sum(sum(d([i:i+0],:)))==0
ii=i;d([1:ii],:)=0;
end
end
for i=m:-1:2*round(m/3)
if sum(sum(d([i-0:i],:)))==0
ii=i;d([ii:m],:)=0;
end
end
if n~=1
d=qiege(d);
end
% d=..这个可以通过训练过程设置大小
% d=imresize(d,[32 16]); % 商用系统程序中归一划大小为:32*16
d=imresize(d,[40 20]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 编号:A-Z 分别为 1-26; 0-9 分别为 27-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
% 使用 BP 网络
function word=wordrec(xx)
% clear
% clc
load bp net;
xx=im2bw(xx);xx=double(xx(:)); % 使用阈值将图像转换为二进制图像
a=sim(net,xx); % 归一划为: 32*16,则 xx=512*1;
[val,num]=max(a);
if num<=26
word=char(double('A')+num-1);
elseif num<=36
word=char(double('0')+num-1-26);
else
switch num
case 37
word='京';
case 38
word='津';
case 39
word='沪';
case 40
word='渝';
case 41
word='港';
case 42
word='澳';
case 43
word='吉';
case 44
word='辽';
case 45
word='鲁';
case 46
word='豫';
case 47
word='冀';
case 48
word='鄂';
case 49
word='湘';
case 50
word='晋';
case 51
word='青';
case 52
word='皖';
case 53
word='苏';
case 54
word='赣';
case 55
word='浙';
case 56
word='闽';
case 57
word='粤';
case 58
word='琼';
case 59
word='台';
case 60
word='陕';
case 61
word='甘';
case 62
word='云';
case 63
word='川';
case 64
word='贵';
case 65
word='黑';
case 66
word='藏';
case 67
word='蒙';
case 68
word='桂';
case 69
word='新';
case 70
word='宁';
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -