概述
给定一张模板图和待识别图,将待识别的数字都读写出来。(模板图和待识别的图片中数字的字体的大小一致)
(国庆研究了很久,放弃了,找到师姐,在师姐的基础上增加了三行识别,如果要多行,需要改进。)
注意:图片格式为单色位图.bmp
模板图:1.bmp
待识别图:3.bmp
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实现数字识别的全部内容,希望文章能够帮你解决人工智能-用matlab实现数字识别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复