matlab基于朴素贝叶斯变换的手写数字识别

matlab基于朴素贝叶斯变换的手写数字识别

欢迎各位大佬的指点。

代码

​ 原理部分参考大佬的即可。

https://blog.csdn.net/qq_32690999/article/details/78737393

https://blog.csdn.net/ctyqy2015301200079/article/details/83380533

​ 源码总共由三部分组成,fun1.m ,fun2.m ,preDeal.m。

​ 训练集在同文件夹下名为training文件夹内,内含“1” “2”等等文件夹,各个文件夹内有1.1,1.2等等照片。

为了便于处理,原图大小均为50*50,命名方式统一为”n.n.png“。

如下图

  • 总的工作目录

    • preDeal.m
    • fun1.m
    • fun2.m
    • training
      • 1
        • 1.0.png
        • 1.1.png
        • 等等
      • 2
        • 2.0.png

测试集我放在training下,随意即可,改一下路径就行。

fun1.m

  1. 读取图片并二值化
  2. 将图片分割成5*5矩阵
function res = fun1( a )
%FUN1 此处显示有关此函数的摘要
%   此处显示详细说明
thresh=graythresh(a);%确定二值化阈值
A=im2bw(a,thresh);%对图像二值化
% figure;subplot(121);imshow(a);
% subplot(122);imshow(A)
[m,n]=size(A);
M=floor(m/5);
N=floor(n/5);
halfSize=M*N/3;
res=zeros(5,5);
for c_Row=1:5
    for c_High=1:5
        count=0;
        for i=(c_Row-1)*M +1: c_Row*M
            for j=(c_High-1)*N +1:c_High*N
                if A(i,j)==0  
                    count=(count+1);
                    %fprintf('count=%f',count)
                end
            end
        end
        if count>=halfSize
            res(c_Row,c_High)=1;    %判断有字迹的为1
        else
            res(c_Row,c_High)=0;
        end
    end
end
end


fun2.m

1.由于训练集中每个数字的训练图片数量相等,则贝叶斯公式中类别的先验概率相等;对于同一个测试图片的同一特征,其先验概率也是相同的,因此只需比较特征的后验概率即可。由于假设特征的朴素的,因此只需将各个特征的概率相乘即可得到类别的后验概率,即为所求。

function pos = fun2( res ,flag )
%FUN2 此处显示有关此函数的摘要
%   此处显示详细说明
pos=1;
for tem1=1:5
    for tem2=1:5
        if(res(tem1,tem2)==1)
            pos=pos*flag(tem1,tem2);
        end
    end
end
end

preDeal.m

clc;clear;

%训练集
for jj=0:3
    eval(['flag' num2str(jj) '=zeros(5,5);']);
    for ii=0:9
        da=['training\' num2str(jj) '\' num2str(jj) '.' num2str(ii) '.png'];     
        a=imread(da);
        res=fun1(a);
        eval(['flag' num2str(jj) '=flag' num2str(jj) '+res;']);    
    end
end


%%测试集
a=imread('test0.png');
res=fun1(a);

%计算类别num的概率
array=zeros(1,10);
for num=0:3
    eval(['pos=fun2(res,flag' num2str(num) ');']);
    array(1,num+1)=pos;
end
[x,y]=max(array);%默认x是每一列的最大值向量,y是每列的最小值的下标组成的向量
fprintf('识别结果为:%d',y-1);



  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值