人工智能-用matlab实现数字识别

给定一张模板图待识别图,将待识别的数字都读写出来。(模板图和待识别的图片中数字的字体的大小一致)

(国庆研究了很久,放弃了,找到师姐,在师姐的基础上增加了三行识别,如果要多行,需要改进。)

注意:图片格式为单色位图.bmp

模板图:1.bmp

待识别图:3.bmp

人工智能-用matlab实现数字识别_第1张图片

clc
clear
%读取
x=imread('1.bmp');%读取标准图片
[M,N]=size(x);    %计算图片大小
t0=0;
t1=0;
A_number=1;
for i=1:1:M      %获取上下边界
    if (t0==0)&&(sum(x(i,:))~=N)
        I0=i;
        t0=1;
    end
    if (t0==1)&&(sum(x(i,:))==N)
        I1=i-1;
        t0=0;
    end
end
distanceI=I1-I0;  %标准图像上下边界差

distanceJ=0;  %标准图像左右距离赋值
for j=1:1:N    %获取左右边界
    if (t1==0) &&sum(x(I0:I1,j))~=I1-I0+1
        J0=j;
        t1=1;
    end
    if (t1==1) &&sum(x(I0:I1,j))==I1-I0+1
        J1=j-1;
        t1=0;
        if J1-J0>distanceJ
            distanceJ=J1-J0;   %获取左右边界最大值
        end
    end
end
if mod(distanceI,5)~=0
    distanceI=distanceI+(5-mod(distanceI,5));%求出标准框的宽
end
if mod(distanceJ,5)~=0
    distanceJ=distanceJ+(5-mod(distanceJ,5));%求出标准框的高
end
height=distanceI/5;
weight=distanceJ/5;%得到每个小框的高和宽
for C_number=1:10
     c1(C_number).C=ones(distanceI,distanceJ);%建立标准框
end
jishu=1;
for j=1:1:N    %获取左右边界
    if (t1==0) &&sum(x(I0:I1,j))~=I1-I0+1
        J0=j;
        t1=1;
    end
    if (t1==1) &&sum(x(I0:I1,j))==I1-I0+1
        J1=j-1;
        t1=0;
        c1(jishu).C(round((distanceI-(I1-I0))/2):round((distanceI-(I1-I0))/2+I1-I0),round((distanceJ-(J1-J0))/2):round((distanceJ-(J1-J0))/2+J1-J0))=x(I0:I1,J0:J1);
        %将数字写入标准框
        jishu=jishu+1; 
    end
end
temp=1;
for i=1:1:(jishu-1)
        for r = 1:1:5
            for s= 1:1:5
                x1=c1(temp).C(((r-1)*height+1):(r*height),((s-1)*weight+1):(s*weight));%获取图中各个数字
                u(r,s)=((weight*height)-sum(sum(x1(:,:))))/(height*weight);%隶属度
            end
        end
        temp=temp+1;
        a(A_number).A=u;%范例的隶属度矩阵集a
        A_number=A_number+1;
end

%识别
y=imread('3.bmp');%读图
[C,D]=size(y);    %计算图片大小
t0=0;
t1=0;
m=1;
for i=1:1:3
  S0(i)=zeros(1,1);
  S1(i)=zeros(1,1);
  disI(i)=zeros(1,1);
end
yanz=[];
bij_value = [];
for i=1:1:C%获取上下边界
    if (t0==0)&&sum(y(i,:))~=D
        S0(m)=i;
        t0=1;
    end
    if (t0==1)&&(sum(y(i,:))==D)
        S1(m)=i-1;
        t0=0;
        disI(m)=S1(m)-S0(m);
        m=m+1;
    end
end
for k=1:1:(m-1)
    B_number=1;
    number=1;
    for j=1:1:D%获取左右边界
        if (t1==0) &&sum(y(S0(k):S1(k),j))~=S1(k)-S0(k)+1
            J0=j;
            t1=1;
        end
        if (t1==1) &&sum(y(S0(k):S1(k),j))==S1(k)-S0(k)+1
            J1=j-1;
            t1=0;
            number=number+1;%计数:一共读取了多少个数字
        end
    end
    for D_number = 1:(number-1)%最终计数会比真实数字个数多一
        c2(D_number).C=ones(distanceI,distanceJ);%建立标准框
    end
    jishu1=1;
    for j=1:1:D%获取左右边界
        if (t1==0) &&sum(y(S0(k):S1(k),j))~=S1(k)-S0(k)+1
            J0=j;
            t1=1;
        end
        if (t1==1) &&sum(y(S0(k):S1(k),j))==S1(k)-S0(k)+1
            J1=j-1;
            t1=0;
            c2(jishu1).C(round((distanceI-(S1-S0))/2):round((distanceI-(S1-S0))/2)+S1(k)-S0(k),round((distanceJ-(J1-J0))/2):round((distanceJ-(J1-J0))/2)+J1-J0)=y(S0(k):S1(k),J0:J1);
            %将数字写入标准框
            jishu1=jishu1+1;
        end
    end
    temp1=1;
    for i=1:1:(number-1)
        for r = 1:1:5
            for s= 1:1:5
                x1=c2(temp1).C(((r-1)*height+1):(r*height),((s-1)*weight+1):(s*weight));%获取图中各个数字
                u(r,s)=((weight*height)-sum(sum(x1(:,:))))/(height*weight);%隶属度
            end
        end
        temp1=temp1+1;
        b(B_number).B=u;%需识别图片的隶属度矩阵集b
        B_number=B_number+1;
    end
    
    %计算贴近度
    for i=1:1:B_number-1
        for j=1:1:10
            tiejd(i,j)=corr2(a(j).A,b(i).B);%用matlab自带的corr2()函数计算贴近度
        end
    end
    
    %function [ bij_value ] = bij( a,b )
    %获取待识别数字与各范例数字的贴近度中最大的,该贴近度的索引减一即为实际数字
    
    for i=1:1:(B_number-1)
        [~,index]=max(tiejd(i,:));%max输出最大元素的索引
        bij_value(k,i)=index-1;
    end
    yanz(k,:)=bij_value(k,:);
    %yanz(k,:)=bij(tiejd,B_number-1);%用matlab自带的corr2()函数识别出的各个数字
    %Out=sprintf('%d',yanz(k,:))%输出
end
Out = sprintf('%d%d%d',yanz(1,:),yanz(2,:),yanz(3,:));
% for k=1:1:(m-1)
%     out=sprintf('%d',yanz(k,:))%多次输出
% end

% function [ bij_value ] = bij( a,b )
% %获取待识别数字与各范例数字的贴近度中最大的,该贴近度的索引减一即为实际数字
% for i=1:1:b
%     [~,index]=max(a(i,:));
%     bij_value(1,i)=index-1;
%     
% end
% end

得到的结果图:

人工智能-用matlab实现数字识别_第2张图片

我的分析图:

人工智能-用matlab实现数字识别_第3张图片

人工智能-用matlab实现数字识别_第4张图片

人工智能-用matlab实现数字识别_第5张图片

 

你可能感兴趣的:(人工智能-用matlab实现数字识别)