1. 手写数字识别:从入门到调参的实战指南
第一次接触手写数字识别时,我也被那些高大上的术语吓到了。但真正用MATLAB实现后才发现,这其实是个既有趣又实用的项目。不同于直接调用现成的API,自己动手实现整个流程——从图像预处理到算法调优——能让你真正理解计算机视觉的底层逻辑。今天我就带大家完整走一遍这个项目,重点分享那些官方文档里不会写的实战技巧。
这个项目最吸引人的地方在于它的"全栈性":既要处理图像(灰度化、二值化、去噪),又要设计算法(特征提取、分类器选择),最后还要做成可视化界面。我使用的MATLAB版本是R2021a,但核心代码在2016版之后都能运行。下面就从最关键的图像预处理开始,一步步拆解其中的技术细节和踩坑经验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 图像预处理:那些教科书不会告诉你的细节
2.1 灰度化的隐藏陷阱
几乎所有教程都会教你用rgb2gray这个函数,但很少有人提到它的潜在问题。来看这段标准代码:
matlab复制gray_img = rgb2gray(input_img);
问题在于,默认的加权平均公式(0.2989 * R + 0.5870 * G + 0.1140 * B)有时会把浅灰色数字和白色背景的对比度降得太低。特别是当数字用浅灰色书写时,转换后可能完全消失。我的解决方案是:
- 先用imhist查看灰度分布
- 如果峰值出现在高亮度区域(>200),改用最大值法:
matlab复制gray_img = max(input_img,[],3); % 取RGB通道最大值
实测技巧:对于黄色纸张上的手写数字,可以单独增强蓝色通道:
matlab复制blue_enhanced = input_img(:,:,3) * 1.5; gray_img = rgb2gray(cat(3,input_img(:,:,1),input_img(:,:,2),blue_enhanced));
2.2 二值化的艺术
自动阈值计算(Otsu方法)是基础,但实际应用中往往需要手动调整:
matlab复制thresh = graythresh(gray_img);
bw_img = imbinarize(gray_img, thresh*0.8); % 系数0.8需要动态调整
这里有几个关键经验:
- 对于光照不均匀的图像,先用imadjust进行gamma校正
- 当数字笔画断裂时,适当降低系数(我常用0.6-0.9范围)
- 背景有纹理时,先进行高斯滤波(sigma=1.5效果最佳)
2.3 噪声处理的组合拳
常见的椒盐噪声可以用中值滤波处理,但手写数字场景下更好的方案是:
matlab复制clean_img = bwmorph(bw_img, 'clean'); % 去除孤立噪点
clean_img = bwareaopen(clean_img, 15);
