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
- 读取图片并二值化
- 将图片分割成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);