function numberrecognition()
image=imread('numerals.bmp');
J=find(image<110); %黑白二值化处理
image(J)=0;
J=find(image>=110);
image(J)=255;
bw=im2bw(image,0.5);
imwrite(bw,'bw.bmp','bmp');
se=strel('disk',3);
fo=imopen(bw,se); %开运算
imwrite(fo,'fo.bmp','bmp');
imoc=imclose(fo,se); %闭运算
imwrite(imoc,'imoc.bmp','bmp');
f=im2double(imoc);
f1=imadjust(f,[0,1],[1,0]);%取反
imwrite(f1,'f1.bmp','bmp');
s=bwmorph(f1,'skel',Inf);%计算骨骼
imwrite(s,'s.bmp','bmp');
s1=bwmorph(s,'spur',10);%删除毛刺
imwrite(s1,'s1.bmp','bmp');
gc=~s1; %用距离的分水岭变换分割图像,将每个数字分割出来单独成为一张图像.
d=bwdist(gc);
L=watershed(-d);
w=L==0;
g1=s1&~w;
g2=bwlabel(g1);
k=regionprops(g2,'image');%计算描绘子
im=k(10).Image;
imwrite(im,'im.bmp','bmp');
%将获得的单个数字的图像全部转换为144*144;不足部分以0补足
[M,N]=size(k(10).Image);
m=144-M;
n=144-N;
k=m/2;
l=n/2;
k1=floor(k);
l1=floor(l);
if k1==k
m1=m/2;
else
m1=(m+1)/2;
end
if l1==l
n1=n/2;
else
n1=(n+1)/2;
end
I=[];
for i=1:144
for j=1:144
I(i,j)=0;
end
end
for i=m1+1:m1+M
for j=n1+1:n1+N
I(i,j)=im(i-m1,j-n1);
end
end
%结构特征提取
data=[];
u=1;
Y=[73 61 85];
for i=1:3
y=Y(i);
num=0;
for x=1:144
if I(x,y)==1
num=num+1;
end
end
data(u)=num;
u=u+1;
end
X=[74 49 97];
for i=1:3
x=X(i);
num=0;
for y=1:144
if I(x,y)==1
num=num+1;
end
end
data(u)=num;
u=u+1;
end
num=0;
for x=1:144
for y=1:144
if x==y&I(x,y)==1
num=num+1;
end
end
end
data(u)=num;
u=u+1;
num=0;
for x=1:144
for y=1:144
if x+y==145&I(x,y)==1
num=num+1;
end
end
end
data(u)=num;
u=u+1;
q=0;
num=0;
for i=2:143
for j=2:143
if I(i,j)==1
q=I(i-1,j-1)+I(i-1,j)+I(i-1,j+1)+I(i,j-1)+I(i,j+1)+I(i+1,j-1)+I(i+1,j)+I(i+1,j+1);
if q==1
num=num+1;
end
end
end
end
data(u)=num;
data
%知识库
DATA1=[2 2 2 2 2 2 2 2 0;1 0 0 1 1 1 1 1 2;3 3 3 1 1 1 1 1 2;4 4 4 1 1 1 2 2 2;
2 2 2 2 2 1 3 3 4;3 3 3 3 1 1 3 1 2;3 3 2 1 1 2 3 2 1;1 1 2 1 1 1 1 1 2;
3 4 4 2 2 2 2 2 0;3 3 3 1 2 1 3 2 1];
DATA2=[1 1 2 2 2 2 2 2 2;1 0 0 1 1 1 1 1 2;3 2 2 1 1 1 1 3 2;3 1 4 2 1 1 2 2 3;
2 2 2 3 3 1 3 2 2;3 3 3 1 1 1 2 2 4;3 1 3 1 1 2 2 2 2;1 1 2 1 1 1 1 1 2;
4 4 4 2 1 2 1 2 2;3 2 3 2 1 1 3 1 3];
%最短距离匹配
dis1=[];
dis2=[];
for i=1:10
D1=0;
D2=0;
for j=1:8
D1=D1+(data(j)-DATA1(i,j))^2;
D2=D2+(data(j)-DATA2(i,j))^2;
end
D1=D1+3*(data(9)-DATA1(i,9))^2;
D2=D2+3*(data(9)-DATA2(i,9))^2;
dis1(i)=sqrt(D1);
dis2(i)=sqrt(D2);
end
t1=min(dis1);
t2=min(dis2);
if t1>t2
for i=1:10
if dis2(i)==t2
number=i-1;
end
end
else
for i=1:10
if dis1(i)==t1
number=i-1;
end
end
end
imshow(I);
imwrite(I,'I.bmp','bmp');
number