一、代码
%% 主程序(letter_recognition_gui.m)
function letter_recognition_gui
% 创建GUI界面
fig = figure('Name','字母识别系统','NumberTitle','off',...
'Position',[100,100,800,600],'MenuBar','none','Resize','off');
% 控件布局
uicontrol('Style','text','String','输入方式:','Position',[20,550,80,20]);
uicontrol('Style','popupmenu','String',{'手写输入','图片上传'},...
'Position',[120,550,150,20],'Tag','InputMode');
% 绘图区域
ax = axes('Units','pixels','Position',[50,150,300,300],...
'XTick',[],'YTick',[],'Box','on');
uicontrol('Style','pushbutton','String','清除画布','Position',[370,400,100,30],...
'Callback',@clearCanvas);
% 控制按钮
uicontrol('Style','pushbutton','String','开始识别','Position',[600,400,100,30],...
'Callback',@recognizeLetter);
uicontrol('Style','pushbutton','String','加载模板','Position',[600,350,100,30],...
'Callback',@loadTemplates);
% 结果显示
uicontrol('Style','text','String','识别结果:','Position',[50,450,80,20]);
resultText = uicontrol('Style','text','String','',...
'Position',[150,450,200,20],'Tag','Result');
% 数据存储
setappdata(fig,'canvas',[]);
setappdata(fig,'templates',[]);
end
%% 清除画布函数
function clearCanvas(~,~)
cla(gca);
axis([0 1 0 1]);
set(gca,'XTick',[],'YTick',[],'Box','on');
setappdata(gcf,'canvas',[]);
set(findobj(gcf,'Tag','Result'),'String','');
end
%% 识别函数
function recognizeLetter(~,~)
canvas = getappdata(gcf,'canvas');
if isempty(canvas)
errordlg('请先绘制或加载字母!','错误');
return;
end
% 预处理
img = imresize(canvas, [28 28]);
img = imbinarize(rgb2gray(img));
img = double(img(:)) / 255;
% 特征提取(HOG特征)
features = extractHOGFeatures(img', 'CellSize',[4 4]);
% 分类识别
if isempty(getappdata(gcf,'templates'))
loadTemplates();
end
templates = getappdata(gcf,'templates');
% 使用SVM分类器
predictedLabel = predict(templates.svmModel, features);
predictedChar = char(predictedLabel + 'A' - 1);
% 显示结果
set(findobj(gcf,'Tag','Result'),'String',predictedChar);
end
%% 加载模板函数
function loadTemplates(~,~)
% 加载预训练模板(示例)
templates.data = load('letter_templates.mat'); % 包含训练好的SVM模型
setappdata(gcf,'templates',templates);
end
二、关键功能
1. 图像预处理流程
% 灰度转换
grayImg = rgb2gray(inputImg);
% 自适应二值化
binaryImg = imbinarize(grayImg, 'adaptive');
% 形态学处理
cleanImg = bwareaopen(binaryImg, 50);
cleanImg = imclose(cleanImg, strel('disk',2));
% 边缘检测
edges = edge(cleanImg, 'Canny');
2. 特征提取实现
% HOG特征提取
[hogFeatures, hogVisual] = extractHOGFeatures(cleanImg,...
'CellSize',[4 4], 'BlockSize',[2 2], 'NumBins',9);
% 方向场编码
[dx, dy] = gradient(double(cleanImg));
orientation = atan2(dy, dx);
3. 分类器训练代码
% 加载训练数据
[XTrain, YTrain] = loadTrainingData();
% 数据划分
cv = cvpartition(YTrain,'HoldOut',0.3);
% 训练SVM模型
svmModel = fitcsvm(XTrain(training(cv),:), YTrain(training(cv)),...
'KernelFunction','rbf','Standardize',true);
% 保存模型
save('letter_templates.mat','svmModel');
三、GUI界面增强功能
1. 手写输入交互
% 鼠标事件回调
function mousePress(~,event)
axes(handles.canvasAxes);
hold on;
currentPoint = get(gca,'CurrentPoint');
startPoint = currentPoint(1,1:2);
line([startPoint(1) startPoint(1)],[startPoint(2) startPoint(2)],'Color','r');
end
function mouseMove(~,event)
axes(handles.canvasAxes);
currentPoint = get(gca,'CurrentPoint');
endPoint = currentPoint(1,1:2);
line([prevX endPoint(1)],[prevY endPoint(2)],'Color','r','LineWidth',2);
prevX = endPoint(1);
prevY = endPoint(2);
end
2. 结果可视化
% 绘制特征图
function plotFeatures(features)
figure;
subplot(2,2,1);
imagesc(reshape(features(1:64),8,8));
title('原始特征');
subplot(2,2,2);
bar(features(65:73));
title('HOG方向直方图');
subplot(2,2,3);
imshow(imresize(canvas,0.5));
title('输入图像');
subplot(2,2,4);
plotConfusionMatrix(confusionMat);
end
参考代码 用于字母识别实用的matlab程序 www.youwenfan.com/contentcsd/96848.html
建议优先使用HOG+SVM组合处理标准字体,对于复杂手写体可采用CNN方案。实际应用中需根据具体需求调整特征提取策略和分类器参数。