模式識別-模板匹配算法(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\n',[index,m,p-1]);
    % 索引從1開始,模板從0開始,因此減一輸出
end
fprintf('共測試10個樣本,正確匹配個數為%d個\n',[correct_num]);

程序結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM