基于决策树手写数字识别 matlab实现 包含定位、分割5*5、二值化、主成分分析法 交叉验证 自制数据集 有程序报告220最近在折腾手写数字识别这事挺有意思特别是用Matlab实现整套流程。自己从超市买了几包A4纸拉着室友每人写了0-9各20组硬是攒了2200张手写数字图。这活可比想象中费劲——有人把7写成带横杠的有人画0非要带个尾巴真实数据果然比标准数据集刺激。先上定位环节的核心代码function num_area locate_num(img) gray rgb2gray(img); bw imbinarize(gray,adaptive,ForegroundPolarity,dark); bw imclose(bw,strel(disk,5)); % 对付断笔划 stats regionprops(bw,Area,BoundingBox); [~,idx] max([stats.Area]); num_area imcrop(gray,stats(idx).BoundingBox); end这里用了形态学闭运算处理笔画断裂实测发现5像素的圆形结构体效果最稳。regionprops找最大连通区域时经常会把纸边缘误判后来在拍照时加了个黑色垫板才解决。分割模块尝试过滑动窗口最后还是投影法真香cells zeros(5,5,25); % 5x5网格 [h,w] size(num_roi); block_h floor(h/5); block_w floor(w/5); for i 1:5 for j 1:5 block num_roi((i-1)*block_h1:i*block_h, (j-1)*block_w1:j*block_w); cells(:,:,5*(i-1)j) imresize(block,[5,5]); % 强制统一尺寸 end end有个坑是不同数字的宽高比差异大比如1通常比较窄这里统一用双线性插值resize反而比保持比例效果好。基于决策树手写数字识别 matlab实现 包含定位、分割5*5、二值化、主成分分析法 交叉验证 自制数据集 有程序报告220主成分分析这块用了随机采样策略[coeff,score,latent] pca(reshape(cells,[25,2200])); keep_dims find(cumsum(latent)./sum(latent)0.95,1); % 保留95%能量 features score(:,1:keep_dims); % 最终得到12维特征实测95%的能量阈值能把25维降到12维左右决策树准确率反而比用全特征高了3个百分点看来去冗余确实有用。决策树参数调优时发现MinParentSize设为10、SplitCriterion用deviance时交叉验证准确率能到89.7%tree fitctree(features, labels, CrossVal,on,... MinParentSize,10, SplitCriterion,deviance); loss kfoldLoss(tree);不过有个诡异现象对弯曲数字的识别率比工整书写的高可能因为自制数据集中艺术创作样本太多。后来专门加了旋转15度内的数据增强准确率才稳定在91%左右。整套搞下来最大的体会是特征工程才是真·黑科技。试过把5x5网格改成7x7准确率不升反降二值化改用局部阈值后数字8的识别率直接飙到98%。现在看见电话号码本都手痒想拿程序跑一遍这大概就是走火入魔的前兆吧。
基于决策树手写数字识别 matlab实现 包含定位、分割(5*5)、二值化、主成分分析法 交叉...
发布时间:2026/6/21 17:07:47
基于决策树手写数字识别 matlab实现 包含定位、分割5*5、二值化、主成分分析法 交叉验证 自制数据集 有程序报告220最近在折腾手写数字识别这事挺有意思特别是用Matlab实现整套流程。自己从超市买了几包A4纸拉着室友每人写了0-9各20组硬是攒了2200张手写数字图。这活可比想象中费劲——有人把7写成带横杠的有人画0非要带个尾巴真实数据果然比标准数据集刺激。先上定位环节的核心代码function num_area locate_num(img) gray rgb2gray(img); bw imbinarize(gray,adaptive,ForegroundPolarity,dark); bw imclose(bw,strel(disk,5)); % 对付断笔划 stats regionprops(bw,Area,BoundingBox); [~,idx] max([stats.Area]); num_area imcrop(gray,stats(idx).BoundingBox); end这里用了形态学闭运算处理笔画断裂实测发现5像素的圆形结构体效果最稳。regionprops找最大连通区域时经常会把纸边缘误判后来在拍照时加了个黑色垫板才解决。分割模块尝试过滑动窗口最后还是投影法真香cells zeros(5,5,25); % 5x5网格 [h,w] size(num_roi); block_h floor(h/5); block_w floor(w/5); for i 1:5 for j 1:5 block num_roi((i-1)*block_h1:i*block_h, (j-1)*block_w1:j*block_w); cells(:,:,5*(i-1)j) imresize(block,[5,5]); % 强制统一尺寸 end end有个坑是不同数字的宽高比差异大比如1通常比较窄这里统一用双线性插值resize反而比保持比例效果好。基于决策树手写数字识别 matlab实现 包含定位、分割5*5、二值化、主成分分析法 交叉验证 自制数据集 有程序报告220主成分分析这块用了随机采样策略[coeff,score,latent] pca(reshape(cells,[25,2200])); keep_dims find(cumsum(latent)./sum(latent)0.95,1); % 保留95%能量 features score(:,1:keep_dims); % 最终得到12维特征实测95%的能量阈值能把25维降到12维左右决策树准确率反而比用全特征高了3个百分点看来去冗余确实有用。决策树参数调优时发现MinParentSize设为10、SplitCriterion用deviance时交叉验证准确率能到89.7%tree fitctree(features, labels, CrossVal,on,... MinParentSize,10, SplitCriterion,deviance); loss kfoldLoss(tree);不过有个诡异现象对弯曲数字的识别率比工整书写的高可能因为自制数据集中艺术创作样本太多。后来专门加了旋转15度内的数据增强准确率才稳定在91%左右。整套搞下来最大的体会是特征工程才是真·黑科技。试过把5x5网格改成7x7准确率不升反降二值化改用局部阈值后数字8的识别率直接飙到98%。现在看见电话号码本都手痒想拿程序跑一遍这大概就是走火入魔的前兆吧。