基于MATLAB实现手写字符识别的三种主流方法
一、传统图像处理+分类器方法
1. 预处理
-
灰度化与二值化:
grayImg = rgb2gray(inputImg); binImg = imbinarize(grayImg, 'adaptive'); % 自适应阈值 -
去噪与归一化:
denoisedImg = medfilt2(binImg, [3 3]); % 中值滤波 resizedImg = imresize(denoisedImg, [28 28]); % 统一尺寸
2. 特征提取
-
投影统计:计算水平/垂直方向像素分布
hProj = sum(resizedImg, 1); % 水平投影 vProj = sum(resizedImg, 2); % 垂直投影 -
骨架细化:提取笔画结构
skeleton = bwmorph(resizedImg, 'thin', Inf);
3. 分类器训练与识别
-
K近邻(KNN):
model = fitcknn(trainFeatures, trainLabels, 'NumNeighbors', 5); predLabel = predict(model, testFeatures); % -
模板匹配:计算测试样本与模板的欧氏距离
dist = norm(testFeature - templateFeature);
二、卷积神经网络(CNN)方法
1. 数据准备
-
使用
imageDatastore加载数据集(如MNIST)imds = imageDatastore('mnist/', 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
2. CNN结构设计
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(3, 16, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
fullyConnectedLayer(10) % 数字0-9
softmaxLayer
classificationLayer]; %
3. 训练与评估
options = trainingOptions('adam', 'MaxEpochs', 10, 'ValidationData', imdsValidation);
net = trainNetwork(imdsTrain, layers, options);
accuracy = sum(predict(net, imdsTest) == imdsTest.Labels)/numel(imdsTest.Labels);
三、优化策略与对比
1. 性能提升技巧
- 数据增强:通过旋转/平移生成合成样本,提升泛化能力
- 混合特征:融合CNN深层特征与HOG手工特征,精度提升3-5%
- 实时性优化:将训练模型转换为C/C++代码部署(
coder.loadDeepLearningNetwork)
2. 方法对比
| 方法 | 准确率 | 训练时间 | 适用场景 |
|---|---|---|---|
| 模板匹配 | 85%-90% | <1s | 字符集小、硬件受限 |
| KNN | 90%-93% | 中等 | 中等规模数据集 |
| CNN | >98% | 分钟级 | 高精度复杂场景 |
3. GUI集成示例
function RecognizeButton_Callback()
img = getimage(handles.axes1);
preprocessed = preprocess(img); % 自定义预处理函数
feature = extractHOG(preprocessed);
label = predict(model, feature);
set(handles.resultText, 'String', label); %
end
四、关键问题解决
-
连笔字识别:
-
采用形态学闭运算连接断裂笔画:
closedImg = imclose(skeleton, strel('disk', 2)); %
-
-
光照不均:
- 使用自适应二值化(
imbinarize的'adaptive'模式)替代全局阈值
- 使用自适应二值化(
资源推荐:
- 基于matlab手写字符识别 www.youwenfan.com/contentteb/99695.html
- 全流程代码模板 github.com/Handwriting-Recognition-MATLAB(含CNN+KNN实现)
注:实际应用中,推荐优先采用CNN方法;若硬件资源有限,可选用模板匹配或KNN简化版。