第2章 模板匹配算法(mat格式手写数字识别)

Posted wzw0625

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第2章 模板匹配算法(mat格式手写数字识别)相关的知识,希望对你有一定的参考价值。

手写数字识别数据集minist

手写数字识别是一个典型的多分类问题,输入一个样本,输出识别结果。样本的类别数为10类,分别代表0~10这十个数字,其中,分类器的输入是一张包含单个数字的图片,输出为一个十维的向量,有且只有一维为1,其余为0。表示输入样本将会被唯一分类到一个类别当中,即被唯一地识别为某一个数字。

模式识别课程链接:https://www.icourse163.org/course/BIT-1206703821

数据集下载地址:链接:https://pan.baidu.com/s/1b-8tzCp2neh3NsY81mcfdg  提取码:kaz0

程序源码

% mat2vector.m
% 输入:图片数据(矩阵),样本个数
% 函数作用:将图片组转化为行向量的组合,每个行向量作为一张图片的特征
% 输出:样本数*图片像素数量大小的矩阵
function [data_]= mat2vector(data,num)
    [row,col,~] = size(data);
    data_ = zeros(num,row*col);
    for page = 1:num
        for rows = 1:row
            for cols = 1:col
                data_(page,((rows-1)*col+cols)) = im2double(data(rows,cols,page));
            end
        end
    end
end

% Template_hand.m
% 手写数字模板匹配
clc
clear al
% 读取模板
image = cell(1,10); % 生成十个cell保存模板
for i = 0:9
    filename = sprintf(./手写数字/%d/5.bmp,i); % 读取模板
    image{1,i+1} = mat2vector(imresize(imread(filename),[28,28]),1); % 统一大小为28*28,并调用函数mat2vector将其转换为行向量
end
% 待匹配样本
correct_num = 0;
for index = 0:9 % 每个数字测试一次
    distance = zeros(1,10); % 保存计算得到的距离值
    fname = sprintf(./手写数字/%d/4.bmp,index);
    sample = mat2vector(imresize(imread(fname),[28,28]),1); % 图片转换为行向量
    for j  = 1:10 % 共十个模板,计算与每个模板的距离
        distance(j) = pdist2(sample,image{1,j},euclidean);
        % 计算欧式距离,这里可以更改‘euclidean’为其他距离,用于描述相似度
    end
    [m,p] = min(distance); % 计算距离最小值,并给出索引
    if p-1 == index
        correct_num = correct_num+1;
    end
    fprintf(数字%d到模板的最小距离为:%d,匹配到的类别为:%d
,[index,m,p-1]);
    % 索引从1开始,模板从0开始,因此减一输出
end
fprintf(共测试10个样本,正确匹配个数为%d个
,[correct_num]);

程序结果

技术图片

以上是关于第2章 模板匹配算法(mat格式手写数字识别)的主要内容,如果未能解决你的问题,请参考以下文章

图像识别基于模板匹配之手写数字识别系统GUI界面

手写字母识别基于matlab GUI模板匹配手写大写字母(A-J)识别含Matlab源码 1107期

图像识别基于模板匹配实现手写数字识别

模式识别基于模板匹配的手写体数字识别matlab源码

python数据分析实战-第11章-识别手写数字

手写数字识别基于matlab GUI欧拉数和二维矩阵相关系数手写数字识别含Matlab源码 1896期