MATLAB实现模板匹配算法(手写数字和车牌数据)

基于MOOC人工智能之模式识别的课程完成的第一次作业
MATLAB实现模板匹配算法(手写数字和车牌数据)
MOOC地址:https://www.icourse163.org/learn/BIT-1206703821?tid=1457771445#/learn/announce
课程数据集:链接:https://pan.baidu.com/s/1YiWy6cQvmbCiaSU1-wtrLw
提取码:zw6l

定义mat2vector函数

%  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``

% Template_hand.m
% 手写数字模板匹配
clear all
clc
%读取模板
image = cell(1,10);%生成十个cell保存模板
for i = 0:9
    filename = sprintf('./手写/%d/2.bmp',i);
    image{1,i+1} = imread(filename);
    dim = ndims(image{1,i+1});
    if dim > 2
         image{1,i+1} =  reshape(imresize(rgb2gray(imread(filename)),[25,25]),1,[]);
    else 
        image{1,i+1} = reshape(imresize(imread(filename),[25,25]),1,[]);
    end
    %与车牌数据处理相同
end

%待匹配样本
correct_num = 0;
for index = 0:8%每个数字测试一次
    distance = zeros(1,10);%保存计算得到的距离值
    fname = sprintf('./手写/%d/5.bmp',index);
     sample = imread(fname);
    dim = ndims(sample);
    if dim > 2
        sample =  reshape(imresize(rgb2gray(sample),[25,25]),1,[]);
    else 
        sample = reshape(imresize(sample,[25,25]),1,[]);
    end
    %图片转换为行向量
    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\n',[index,m,p-1]);%打印匹配结果
end
fprintf('共测试10个样本,正确匹配个数为%d个\n',[correct_num]);
 

匹配结果

Template_car.m

% Template_car.m
% 车牌数字模板匹配
% 读取10张模板0-9,由于本身是bmp,读到之后矩阵元素为uint8
% 需要转换为double方便计算
% 原图像大小不一致,并且维度较高,这里将所有的模板均重置为25*25
clear all
clc
image = cell(1,10);%生成十个cell保存模板
for i = 0:9
    filename = sprintf('./车牌/%d.bmp',i);%读取模板文件
    image{1,i+1} = imread(filename);
    dim = ndims(image{1,i+1});
    if dim > 2
         image{1,i+1} =  reshape(imresize(rgb2gray(imread(filename)),[25,25]),1,[]);
    else 
        image{1,i+1} = reshape(imresize(imread(filename),[25,25]),1,[]);
    end
end
%统一大小,之后调用函数将其转换为行向量
% 车牌数据
% 待匹配的样本,一样处理为25*25double类型
correct_num = 0;
for index = 0:7%每个数字测试一次
    distance = zeros(1,10);%保存计算得到的距离值
    fname = sprintf('./车牌/%d.1.bmp',index);
    sample = imread(fname);
    dim = ndims(sample);
    if dim > 2
        sample = reshape(imresize(rgb2gray(sample),[25,25]),1,[]);
    else 
        sample = reshape(imresize(sample,[25,25]),1,[]);
    end
      %图片转化为向量
    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\n',[index,m,p-1]);
    % 索引从1开始,模板从0开始,因此减一输出
end
fprintf('共测试10个样本,正确匹配个数为%d个\n',[correct_num]);

匹配结果

  • 9
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值