MATLAB手写数字识别

MATLAB基于svm的手写数字识别

使用svm进行手写字体识别

测试图片

在这里插入图片描述

处理图片,拿到数字区域并分割保存

clc,clear,close all;
f=imread('num.jpg');
bw=~im2bw(f);

se=strel('line',200,0);
bw_dilate=imdilate(bw,se);


bw_dilate_erode=imerode(bw_dilate,strel('line',1000,0));

bw_re=imreconstruct(bw_dilate_erode,bw_dilate);

result=imreconstruct(bw_re,bw);[r,c]=find(result);
nextresult=result(min(r) :max(r),min(c):max(c));

[h,w]=size(nextresult);
hs=sum(nextresult);

a=1;b=1;i=1;
splitfs={};points=[];
figure
while(a<w)
    while(hs(a)==0&&a<w)
        a=a+1;
    end
    b=a;
    while(hs(b)>0&&b<w)
        b=b+1;
    end
    
    if(b-a>2)
        hresult=nextresult(:,a:b);
        [r,c]=find(hresult);
        result2=hresult(min(r):max(r),:);
        m=min(r);n=max(r);
        xi=hresult(m:n,:);
        splitfs{i}=xi;
        points=[points;m,n,a,b];
        subplot(3,6,i),imshow(result2);
        i=i+1;
    end
    a=b;
end

在这里插入图片描述

格式化图片

function x=picPretreatment(im)
bw=im2bw(im);
[r,c]=find(bw);
x=bw(min(r):max(r),min(c):max(c));
x=imresize(x,[16,16]);

训练数据集,得到 mynet.mat

clear,clc,close all;
k=1;
for m=0:9
    for n=1:15
        f=imread(strcat('nums\',int2str(m),'\',int2str(n),'.bmp'));
        f=picPretreatment(f);
        xx=double(f(:));
        P(k,:)=xx';
        T(k,1)=m;
        k=k+1;
    end
end
net=fitcecoc(P,T);
save mynet net;

结果

注意将图片转化为double

xs=[splitfs,points];
fonts='0123456789';
endresult='手写数字为:';
load mynet;
for m_18=1:size(xs,2)-1
    g=xs{m_18};
    g=double(picPretreatment(g));
    lastresult=predict(net,g(:)');
    endresult=strcat(endresult,string(lastresult));
end
endresult

在这里插入图片描述

项目源码

链接:https://pan.baidu.com/s/1PcWrdyP41BGWuEu4TyWIvQ
提取码:lnke

  • 26
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值