✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
人类文明的发展离不开信息的传递.文字一直是人们传递信息的一个重要媒介,承载着记录人类文明的重要使命.随着科技的发展,积累的文字信息日益增多,有效的存储和利用这些文字信息成为一个亟待解决的问题.光学字符识别的出现为这一问题提供了解决方法.手写体数字识别是光学字符识别的重要分支,因其在金融,邮政,医疗,交通,教育等领域中广泛的应用而日益被重视.目前,已有多种手写体数字识别算法,但都很难满足手写体数字识别应用时对识别率近乎百分之百的要求,所以,几乎没有能够实际应用的识别算法.
⛄ 部分代码
I1=rgb2gray(I); %转化为灰度图像
I2=edge(I1,'canny',graythresh(I)*0.7); %边缘检测
I2=imdilate(I2,ones(3,3));
I2=imfill(I2, 'holes');
I2=imerode(I2,ones(3,3));
[x,y]=find(I2==1); %找到数字的部分
X=round(mean(x)); %取对象的横向平均位置
I3=I2(X,:); %取出这一部分(相当于在原图像中选了一条横线)
wz=find(I3==1); %找到对象的部分
j=0; %计数设置为0
% figure
while ~isempty(wz)
j=j+1; %计数+1
seed=[X,wz(1)]; %更新种子点
new=false(size(I2)); %生成逻辑零数组保存之后的二值图像
new(seed(1),seed(2))=true; %种子点置一
while true %开始生长
for i=1:size(seed,1) %对每一种子点进行遍历
new(seed(i,1)-1:seed(i,1)+1,seed(i,2)-1:seed(i,2)+1)=I2(seed(i,1)-1:seed(i,1)+1,seed(i,2)-1:seed(i,2)+1); %取出周围3*3范围的数字
end
[x1,y1]=find(new==1); %找到新的种子点
seed1=[x1,y1]; %更新下一次遍历的种子点
if(length(seed)==length(seed1)) %若本次和下次的种子数一致,则说明生长完成
break; %退出
end
seed=seed1; %更新种子点
end
pd=find(new(X,:)==1); %找到本次生长的对象
wz=wz(length(pd)+1:end); %将该对象从合集中去除
[x,y]=find(new==1); %得到本次对象的位置
out=I1(min(x)-10:max(x)+10,min(y)-10:max(y)+10); %将其从原始灰度图像中取出来,注意!这里可能会因为原始灰度图像过小而导致报错
%figure,imshow(out)
I_out(j)=mat2cell(out,size(out,1),size(out,2)); %将其放到cell数组中
end
if length(I_out) == 1 %若输入的为单数字图像
I_out=mat2cell(I1,size(I1,1),size(I1,2)); %直接返回原始数字图像,因为这样精度更好一些
end
end
⛄ 运行结果
⛄ 参考文献
[1]蒋琳琼, 周兴发. 基于相关算法手写数字识别系统的研究与实现[J]. 技术与市场, 2013(4):3.
[2]张婷, 王卓英. 手写体数字计算机识别系统的应用研究[J]. 微型电脑应用, 2016, 32(1):3.