%基于模糊数学原理方格矩阵法新型贴近度计算的字符识别
%作者:Andy
%时间:2012-6-7
%说明:隶属函数为正态分布
%关键词:字符识别,模糊数学,方格矩阵法,新型贴近度
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
模糊数学是一门新兴学科,它已初步应用于模糊控制、模糊识别、模糊 智能化、聚类分析、模糊决策、模糊评判、系统理论、信息检索、医学、生物学等各个方面。在气象、结构力学、控制、心理学等方面已有具体的研究成果。然而模糊数学最重要的应用领域是计算机智能,不少人认为它与新一代计算机的研制有密切的联系。
(1)方格矩阵法
①将字母写在标准的长方形内,并将长方形均匀分成7×5个小方格。
②按每个小方格中线条出现的清晰程度给予适当的隶属度
得模糊关系矩阵为:
标准模式(矩阵)。
③模糊向量表示(模糊集合)
④按择近原则进行识别
设有两个文字向量:

计算数值
(不是贴近度或者说新的贴近度,用来衡量与的接近程度是有效的)
假设电脑收到文字向量
计算:
选出数值最大的,即最接近的并判为相应的字母(数字)。
实验结果:模糊算法不适合字符识别,在手写字体不太规范的时候,识别率不高
clear all
T_l=36; %设置标准模式规格
T_h=20; %
close all
%输入待识别图像
Pig=imread('C:\Documents and Settings\Administrator\桌面\Fuzzy字符识别\数字和字母图像\F\0436.bmp');
[m,n,z]=size(Pig);%获取图片大小信息
figure(1);
subplot(221);imshow(Pig);title('原始模板');
%Pig1=rgb2gray(Pig);%转换灰度图
%subplot(222);imshow(Pig1);title('灰度图像');
%Pigc=imcomplement(Pig1);%取反
%Pigc=imcomplement(Pig);%取反
Pigc=Pig;%取反
subplot(223);imshow(Pigc);title('取反后图像');
BW=im2bw(Pigc,graythresh(Pigc));%二值化
% imwrite(BW,'BW.jpg');
subplot(224);imshow(BW);title('二值图像');
%求解X方向的投影像素范围BW
[ix1,iy1]=xfenge(BW);
%求解y方向的投影像素范围BW
[jx1,jy1]=yfenge(BW);
%分割字符区域
imageampler=BW(ix1:iy1,jx1:jy1);
figure(12)
imshow(imageampler)
%pig=(1/255).*pig; % 数值转换 1~0范围
imageampler=imresize(imageampler,[T_l-4,T_h-4],'nearest');
%[ix1,iy1]=xfenge(imageampler);
%求解y方向的投影像素范围BW
%[jx1,jy1]=yfenge(imageampler);
%分割字符区域
imageampler1=imageampler; %(ix1:iy1,jx1:jy1);
imshow(imageampler1);
%扩展字符区域
[l k]=size(imageampler1);
imageampler1=double(imageampler1);clc; %转为双精度型数值
figure(5)
imshow(imageampler1)
[li,hi]=size(imageampler1);
imageampler1=[~ones(li,2) imageampler1 ~ones(li,2)];
imageampler1=imageampler1';
[li,hi]=size(imageampler1);
imageampler1=[~ones(li,2) imageampler1 ~ones(li,2)];
imageampler1=imageampler1';
figure(6)
imshow(imageampler1);title('扩展后图像');
%行向量
k=0;
for i=1:T_l
for j=1:T_h
k=k+1;
imageampler0(:,k)=[imageampler1(i,j)];
imageampler2(:,k)=[1-imageampler1(i,j)];
end
end
maxd=0;
d=[];
for l=1:36
%提取标准模式
fsetnum=strcat('C:\Documents and Settings\Administrator\桌面\Fuzzy字符识别\数字和字母图像\_Template\T_',num2str(l),'.bmp');
fset=imread(fsetnum);
%fset=rgb2gray(fset);
fset=double(fset);
fset=(1/255).*fset; %数值类型转换
% fset=imresize(fset,[16 16],'nearest');
kk=0;
c=0;
u=0;
dd=0;yy=0;mm=0;
sita=3;
T_l=36; %设置标准模式规格
T_h=20; %
[T_l T_h]=size(fset);
fset1=[];
for i=1:T_l-2 %列扫描
for j=1:T_h-2 %行扫描
fset1(i,j)=fset(i,j);
%水平方向
if (j>1)&(i>1)
if (fset(i,j)>0.99)&(fset(i,j-1)<=0.99)
for x=0:2
x=x+1;
fuc=exp(-((x-u)/sita).^2); %正态分布隶属函数
if j-x>0
fset1(i,j-x)=fuc;
end
end
mm=mm+1;
end
if (fset(i,j)>0.99)&(fset(i,j+1)<=0.99)
for x=0:2
x=x+1;
fuc=exp(-((x-u)/sita).^2); %正态分布隶属函数
if j+x<=T_h-2
fset1(i,j+x)=fuc;
end
end
kk=kk+1;
end
%垂直方向
if (fset(i,j)>0.99)&(fset(i-1,j)<=0.99)
for y=0:2
y=y+1;
fuc=exp(-((y-u)/sita).^2); %正态分布隶属函数
if i-y>0
fset1(i-y,j)=fuc;
end
end
yy=yy+1;
end
if (fset(i,j)>0.99)&(fset(i+1,j)<=0.99)
for y=0:2
y=y+1;
fuc=exp(-((y-u)/sita).^2); %正态分布隶属函数
if i+y<=T_l-2
fset1(i+y,j)=fuc;
end
end
dd=dd+1;
end
end
%k=k+1;
%fset1(:,k)=[fset(i,j)];
%fset2(:,k)=[1-fset(i,j)];
end
end
fset1(T_l-1:T_l,T_h-1:T_h)=fset(T_l-1:T_l,T_h-1:T_h);%复制剩余象素点
figure(2)
subplot(121)
imshow(fset1);
subplot(122)
imshow(fset)
fset1=fset;
k=0;
c=0;
size(fset1)
for i=1:T_l
for j=1:T_h
k=k+1;
fset11(:,k)=[fset1(i,j)];
fset22(:,k)=[1-fset1(i,j)];
end
end
%a=min(pig1(:,:),fset2(:,:));
%b=min(pig(:,:),A1(:,:));
c=max(min(imageampler0(:,:),fset11(:,:)),min(imageampler2(:,:),fset22(:,:)));%计算贴近度
d(1,l)=sum(c(:,:));
if d(1,l)>=max(d) %输出贴近度最大值
maxd=l;
end
l=l+1;
end%开始分类
maxd
fsetnum=strcat('C:\Documents and Settings\Administrator\桌面\Fuzzy字符识别\数字和字母图像\_Template\T_',num2str(maxd),'.bmp');figure(100)
imshow(fsetnum)
%输出模糊模式识别结果
Rchar=[];
i=1;
switch maxd %遍历比较
case 1
Rchar(i)='0' ;
case 2
Rchar(i)='1';
case 3
Rchar(i)='2';
case 4
Rchar(i)='3' ;
case 5
Rchar(i)='4';
case 6
Rchar(i)='5';
case 7
Rchar(i)='6';
case 8
Rchar(i)='7';
case 9
Rchar(i)='8';
case 10
Rchar(i)='9';
case 11
Rchar(i)='A' ;
case 12
Rchar(i)='B';
case 13
Rchar(i)='C';
case 14
Rchar(i)='D' ;
case 15
Rchar(i)='E';
case 16
Rchar(i)='F';
case 17
Rchar(i)='G' ;
case 18
Rchar(i)='H';
case 19
Rchar(i)='I';
case 20
Rchar(i)='J' ;
case 21
Rchar(i)='K';
case 22
Rchar(i)='L';
case 23
Rchar(i)='M' ;
case 24
Rchar(i)='N';
case 25
Rchar(i)='O';
case 26
Rchar(i)='P' ;
case 27
Rchar(i)='Q';
case 28
Rchar(i)='R';
case 29
Rchar(i)='S' ;
case 30
Rchar(i)='T';
case 31
Rchar(i)='U';
case 32
Rchar(i)='V' ;
case 33
Rchar(i)='W';
case 34
Rchar(i)='X';
case 35
Rchar(i)='Y' ;
case 36
Rchar(i)='Z';
otherwise
Rchar(i)='false';
end
Rchar=char(Rchar)
结语:
用模糊算法进行字符识别识别率并不高,目前字符识别算法已经很成熟,我只是为了学习模糊算法才编写这个程序,如有什么错误,希望大侠们多多指正!