博客
关于我
【手写数字识别】基于matlab知识库手写体数字识别【含Matlab源码 311期】
阅读量:159 次
发布时间:2019-02-27

本文共 3609 字,大约阅读时间需要 12 分钟。

一、简介

基于MATLAB的知识库的手写体数字识别系统。系统通过以下步骤实现数字识别:首先,读取手写数字图片并进行图像归一化处理,统一尺寸,默认为24x24图像块;接着,采用OSTU算法对图像进行二值化处理;然后,对二值化图像进行图像细节增强和形态学操作,并提取特征;最后,通过模板匹配算法与预定义的数字矩阵进行比对,采用欧氏距离测度获得识别结果。

二、源代码

以下是系统的主要源代码: ```matlab clc; clear all; close all; load Data.mat; [FileName, PathName, FilterIndex] = uigetfile({ '*.jpg;*.tif;*.png;*.gif', ... '所有图像文件';... '*.*','所有文件' },'载入数字图像',... '.\\images\\手写数字\\t0.jpg'); if isequal(FileName, 0) || isequal(PathName, 0) return; end fileName = fullfile(PathName, FileName); I = imread(fileName); flag = 1; I1 = Normalize_Img(I); bw1 = Bw_Img(I1); bw2 = Thin_Img(bw1); bw = bw2; sz = size(bw); [r, c] = find(bw==1); rect = [min(c) min(r) max(c)-min(c) max(r)-min(r)]; vs = rect(1)+rect(3)*[5/12 1/2 7/12]; hs = rect(2)+rect(4)*[1/3 1/2 2/3]; pt1 = [rect(1:2); rect(1:2)+rect(3:4)]; pt2 = [rect(1)+rect(3) rect(2); rect(1) rect(2)+rect(4)]; k1 = (pt1(1,2)-pt1(2,2)) / (pt1(1,1)-pt1(2,1)); x1 = 1:sz(2); y1 = k1*(x1-pt1(1,1)) + pt1(1,2); k2 = (pt2(1,2)-pt2(2,2)) / (pt2(1,1)-pt2(2,1)); x2 = 1:sz(2); y2 = k2*(x2-pt2(1,1)) + pt2(1,2); if flag figure('Name', '数字识别', 'NumberTitle', 'Off', 'Units', 'Normalized', 'Position', [0.2 0.45 0.5 0.3]); subplot(2, 2, 1); imshow(I, []); title('原图像', 'FontWeight', 'Bold'); subplot(2, 2, 2); imshow(I1, []); title('归一化图像', 'FontWeight', 'Bold'); hold on; h = rectangle('Position', [rect(1:2)-1 rect(3:4)+2], 'EdgeColor', 'r', 'LineWidth', 2); xlabel('数字区域标记'); subplot(2, 2, 3); imshow(bw1, []); title('二值化图像', 'FontWeight', 'Bold'); subplot(2, 2, 4); imshow(bw, [], 'Border', 'Loose'); title('细化图像', 'FontWeight', 'Bold'); hold on; h = []; for i = 1 : length(hs) h = [h plot([1 sz(2)], [hs(i) hs(i)], 'r-')]; end for i = 1 : length(vs) h = [h plot([vs(i) vs(i)], [1 sz(1)], 'g-')]; end h = [h plot(x1, y1, 'y-')]; h = [h plot(x2, y2, 'm-')]; legend([h(1) h(4) h(7) h(8)], { '水平线', '竖直线', '左对角线', '右对角线'}, 'Location', 'BestOutside'); hold off; end function num = Main_Process(I, flag) if nargin < 2 flag = 1; end I1 = Normalize_Img(I); bw1 = Bw_Img(I1); bw2 = Thin_Img(bw1); bw = bw2; sz = size(bw); [r, c] = find(bw==1); rect = [min(c) min(r) max(c)-min(c) max(r)-min(r)]; vs = rect(1)+rect(3)*[5/12 1/2 7/12]; hs = rect(2)+rect(4)*[1/3 1/2 2/3]; pt1 = [rect(1:2); rect(1:2)+rect(3:4)]; pt2 = [rect(1)+rect(3) rect(2); rect(1) rect(2)+rect(4)]; k1 = (pt1(1,2)-pt1(2,2)) / (pt1(1,1)-pt1(2,1)); x1 = 1:sz(2); y1 = k1*(x1-pt1(1,1)) + pt1(1,2); k2 = (pt2(1,2)-pt2(2,2)) / (pt2(1,1)-pt2(2,1)); x2 = 1:sz(2); y2 = k2*(x2-pt2(1,1)) + pt2(1,2); if flag figure('Name', '数字识别', 'NumberTitle', 'Off', 'Units', 'Normalized', 'Position', [0.2 0.45 0.5 0.3]); subplot(2, 2, 1); imshow(I, []); title('原图像', 'FontWeight', 'Bold'); subplot(2, 2, 2); imshow(I1, []); title('归一化图像', 'FontWeight', 'Bold'); hold on; h = rectangle('Position', [rect(1:2)-1 rect(3:4)+2], 'EdgeColor', 'r', 'LineWidth', 2); legend(h, '数字区域标记', 'Location', 'BestOutside'); hold on; h = []; for i = 1 : length(hs) h = [h plot([1 sz(2)], [hs(i) hs(i)], 'r-')]; end for i = 1 : length(vs) h = [h plot([vs(i) vs(i)], [1 sz(1)], 'g-')]; end h = [h plot(x1, y1, 'y-')]; h = [h plot(x2, y2, 'm-')]; legend([h(1) h(4) h(7) h(8)], { '水平线', '竖直线', '左对角线', '右对角线'}, 'Location', 'BestOutside'); hold off; end v{ 1} = [1:sz(2); repmat(hs(1), 1, sz(2))]'; v{ 2} = [1:sz(2); repmat(hs(2), 1, sz(2))]'; v{ 3} = [1:sz(2); repmat(hs(3), 1, sz(2))]'; v{ 4} = [repmat(vs(1), 1, sz(1)); 1:sz(1)]'; v{ 5} = [repmat(vs(2), 1, sz(1)); 1:sz(1)]'; v{ 6} = [repmat(vs(3), 1, sz(1)); 1:sz(1)]'; v{ 7} = [x1; y1]'; v{ 8} = [x2; y2]'; ```

三、运行结果

系统运行结果如图所示,通过对手写数字图像的归一化、二值化、细化处理后,成功识别出数字字符。

四、备注

完整代码或功能扩展请添加QQ 1564658423。

转载地址:http://lwqf.baihongyu.com/

你可能感兴趣的文章
Python:从嵌套列表中删除重复项
查看>>
Python:从间隔映射到值
查看>>
Python:使用 shell=False 的子进程调用不起作用
查看>>
Python:修改 PATH 环境变量的平台无关方式
查看>>
Python:假与 0
查看>>
Python:函数使用
查看>>
Python:函数进阶
查看>>
Python:在整数的二进制表示中查找最长的二进制间隙
查看>>
Python:如何从二进制转换为 base 64 并返回?
查看>>
Python:如何以非阻塞方式读取子进程的标准输出
查看>>
Python:如何使用 plotly 制作阴影区域或交替背景颜色?
查看>>
Python:如何根据日期时间获取值的计数
查看>>
python:如何检测串行 COM 上的设备名称/ID
查看>>
Python:如何模拟 datetime.utcnow()?
查看>>
Python:如果DataFrames之间的其他值匹配,则对DataFrame中的值求和
查看>>
Python:字典思维
查看>>
Python:将 HEX 字符串转换为字节
查看>>
Python:将列表与范围列表合并
查看>>
Python:将列表列表初始化为一定大小,
查看>>
Python:带有生成器的给定集合的幂集
查看>>