基于学习手写汉字特征的简易汉字识别程序-MATLAB(一)

基于学习手写汉字特征的简易汉字识别程序-MATLAB(一)

基于学习手写汉字特征的简易汉字识别程序-MATLAB(二)
基于学习手写汉字特征的简易汉字识别程序-MATLAB(三)
这是我在网上找到的一个手写汉字识别的程序,刚开始的时候什么也不懂,然后通过自己的学习,开始对程序有了一些了解和见解,毕竟看懂程序是写程序的第一步,下面是我对这些程序的一些感悟,写给和自己志同道合的人看。
第一:
学习函数,有函数名字就可以看出来,这是一个学习函数,主要用于学习手写汉字的特征。

function studyData()
%自动化学习所有训练样本集
%通过循环对每一个学习样本调用学习函数
clear templet pattern;          %清空学习特征
dataSet = '昆明理工大学信自院';  %学习的字符集
for i = 1:9    %9个汉字
    for j = 1:5 %每个汉字需要5个特征向量即5个样本集
        sampleTraining(i,j,dataSet); %循环学习样本集
    end
end

clear templet pattern; 这段代码是清空之前保留的特征,以防止对目前的学习特征产生干扰。
for i = 1:9 %9个汉字
for j = 1:5 %每个汉字需要5个特征向量即5个样本集
sampleTraining(i,j,dataSet); %循环学习样本集
end
end

    这段程序主要是将参数传递至训练函数sampleTraining()中,大家应该都能看懂,看不懂的留言或者私信。就是训练提取第一个汉字的第1、2、3、4、5个特征,第二个汉字的第1、2、3、4、5个特征,............第九个汉字的第1、2、3、4、5个特征。
function sampleTraining(cla,fea,dataSet)
%学习单个样本特征
%cla表示第几个类即汉字个数,fea表示第几个特征即特征向量,dataSet为学习的字符集
%每个样本图片被分成10*10=100个cell
%需要注意图片的的长和宽都需被定义成10的倍数,因为后面要被10除
clc;            %清屏
load templet pattern;   %加载汉字特征
A=imread(['C:\Users\Administrator\Desktop\BayesBinaryHandwritingRecognition_BC_20190220-master\贝叶斯手写汉字识别\样本集\',dataSet(cla),num2str(fea),'.bmp']);
figure(1),imshow(A) %显示读取的手写灰度图
B=zeros(1,100);     %创建1100行的数组
pattern(cla).feature(:,fea)=zeros(100,1); %初始化当前类的第fea个初始化特征向量
[row col] = size(A); %获取样本图片的行列
cellRow = row/10;    %除以10得到1/100的小个子
cellCol = col/10;
count = 0;           %1/100个格子中为0的像素点个数
currentCell = 1;     %当前计算为第11/100格子部分
for currentRow = 0:9
    for currentCol = 0:9
       for i = 1:cellRow      %计算每1/100部分中为0的数量
           for j = 1:cellCol
               if(A(currentRow*cellRow+i,currentCol*cellCol+j)==0)
                   count=count+1;
               end
           end
        end
        ratio = count/(cellRow*cellCol); %计算1/100部分中黑色像素的占比
        B(1,currentCell) = ratio;        %将每个占比统计在B特征向量中
        currentCell = currentCell+1;     %新的1/100部分开始计算
        count = 0;                       %像素点计数置0
     end
end
pattern(cla).num=5;             %类的特征数量(feature中的列数)
pattern(cla).name=dataSet(cla); %当前类代表的汉字字符
pattern(cla).feature(:,fea)=B'; %当前类第fea列特征向量
save templet pattern            %保存学习样本的汉字特征

第一段代码传递的参数就是用于这段函数的,先加载汉字特征,pattern,里面是空的,最后可以将这段代码提取的特征存储到这里去。然后用imread([‘C:\Users\Administrator\Desktop\BayesBinaryHandwritingRecognition_BC_20190220-master\贝叶斯手写汉字识别\样本集’,dataSet(cla),num2str(fea),’.bmp’])
读取样本集的图像的像素文件,学习的时候可以用disp(A)显示一下,可以查看A中内容,其实就是0和255组成的矩阵。
说一下[row col] = size(A);,用这个函数size(A),获取像素的行列值,类似于长和宽。row代表行,col代表列。这里的图片大部分都是12090的图像,或者说像素。
然后将每12
9个像素合并成一个,作为一个特征,最后就得到一个1010的特征矩阵,其中那么多的for循环就是为了将整幅图缩小。也就是降维,这样减少了特征,方便提取和识别。
那么下面这一段函数是干嘛的呢?
ratio = count/(cellRow
cellCol); %计算1/100部分中黑色像素的占比
B(1,currentCell) = ratio; %将每个占比统计在B特征向量中
currentCell = currentCell+1; %新的1/100部分开始计算
count = 0;
先说ratio,大家都知道0代表白色,255代黑色,就是二值化图,上面的for循环中统计了0的个数,就是黑色的个数,ratio就是将他们平均到12*9个像素中去,得到的大概率不是一个255或者0,应该是介于二者之间的数值,也就不是黑色了,怎么办?下篇文章有解释。
B(1,currentCell) = ratio就是将ratio的值赋与B的一列currentcell行去。最后组成一个1列100行的矩阵。
pattern(cla).num=5; %类的特征数量(feature中的列数)
pattern(cla).name=dataSet(cla); %当前类代表的汉字字符
pattern(cla).feature(:,fea)=B’; %当前类第fea列特征向量
save templet pattern %保存学习样本的汉字特征
最后的这段程序就是将获得的特征保存在pattern中,一共5列,了解一下就好。
记录学习过程,一起进步

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值