Rabu, 11 September 2019

Matlab - Simple Character Recognition


Disela-sela kesibukan mengerjakan project, penulis iseng-iseng menerapkan algoritma character recognition yang paling sederhana sekali yaitu template matching dengan mempersempit batasan masalah yaitu



  1. karakter uppercase,  sehingga variasi karakter dapat ditekan.
  2. Karakter yang terbatas yaitu hanya terdiri dari kombinasi A sampai dengan Z serta angka 0 sampai dengan 9 saja tanpa ada simbol-simbol huruf yang lainnya.
  3. Jenis font yang tidak terlalu beragam 


Dari 3 aturan diatas, maka pembuatan database hal yang terpenting yaitu pemilihan jenis font yang tepat, untuk itu penulis menggunakan Arial Black. Langkah selanjutnya yaitu membuat database huruf seperti berikut

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0

Penulis menggunakan Matlab untuk mempermudah dalam implementasi algoritmanya, seperti teknik labeling serta pengaturan agar objek tersebut harus ditengah seperti berikut



Terutama untuk karakter I, J, 1, 0, O (lihat function tocenter())



Sehingga setiap objek karakter tepat ditengah sebuah canvas hitam dengan ukuran yaitu 60x60. Algoritma pelatihan menggunakan PCA yang kamu bisa pelajari di link berikut
https://www.mathworks.com/matlabcentral/fileexchange/45750-face-recognition-using-pca
berikut gambar karakter yang digunakan


Kode untuk pelatihan yaitu

Pelatihan.m

clc;clear all;close all;
I = imread('gambar database huruf.png');
bw = ~ im2bw(I);
stat = regionprops(bw,'Image');
%lebih lanjut perhitungan PCA ke
%https://www.mathworks.com/matlabcentral/fileexchange/45750-face-recognition-using-pca
X = [];
for i =1:length(stat)
    gambar = stat(i).Image;
    img  = tocenter(gambar);
    [r c] = size(img);
    temp = reshape(img',r*c,1);  
    X = [X temp];                
end
 
m = mean(X,2); 
imgcount = size(X,2);
 
A = [];
for i=1 : imgcount
    temp = double(X(:,i)) - m;
    A = [A temp];
end
 
L= A' * A;
[V,D]=eig(L); 
L_eig_vec = [];
for i = 1 : size(V,2) 
    if( D(i,i) > 1 )
        L_eig_vec = [L_eig_vec V(:,i)];
    end
end
 
eigenfaces = A * L_eig_vec;
 
projectimg = [ ]; 
for i = 1 : size(eigenfaces,2)
    temp = eigenfaces' * A(:,i);
    projectimg = [projectimg temp];
end
 
save m;
save eigenfaces;
save projectimg;
disp('selesai');

Function untuk meletakan objek ditengah gambar

tocenter.m

function gambar_tujuan  = tocenter(gambar)
    %gambar = imresize(gambar,[22,22]);
    K = 30;
    gambar_tujuan = zeros(K*2,K*2);
    b1 = K;
    k1 = K;
    baris = size(gambar,1);
    kolom = size(gambar,2);
    b2 = round(baris*0.5);
    k2 = round(kolom*0.5);
    for i=1:baris
        for j=1:kolom
            gambar_tujuan(b1-b2+i,k1-k2+j) = gambar(i,j);
        end
    end
    gambar_tujuan = imresize(gambar,[K,K]);
end


Sedangkan untuk kode pengujian yaitu

Pengujian.m

clc;clear all;close all;
load('m.mat');
load('eigenfaces.mat');
load('projectimg.mat');
I = imread('test2.png');
bw = ~ im2bw(I);
 
stat = regionprops(bw,'Image','Centroid');
hasil = ' ';
for i =1:length(stat)
    gambar = stat(i).Image;
    img  = tocenter(gambar);
 
    hasil = [hasil prediksi(img,m,eigenfaces,projectimg)];
 
end
figure()
imshow(I),title(['hasil -> ' hasil]);
 
 
 
function  hasil  = prediksi(test_image,m,eigenfaces,projectimg)
    
    [r c] = size(test_image);
    temp = reshape(test_image',r*c,1); 
    temp = double(temp)-m; 
    projtestimg = eigenfaces'*temp; 
    
    euclide_dist = [ ];
    for i=1 : size(eigenfaces,2)
        temp = (norm(projtestimg-projectimg(:,i)))^2;
        euclide_dist = [euclide_dist temp];
    end
    [euclide_dist_min recognized_index] = min(euclide_dist);
    database = {
        'A','B','C','D','E','F','G','H','I','J','K','L',...
        'M','N','O','P','Q','R','S','T','U','V','W','X',...
        'Y','Z','1','2','3','4','5','6','7','8','9','0'};
    hasil = database{recognized_index};
 
end



Hal yang perlu diketahui yaitu
1.    Karakter tidak menggunakan space.
2.    Karakater bersifat UPPERCASE
3.    Gambar yang digunakan harus ideal (tidak mengandung noise selain objek karakter)
4.    Jenis font sangat berpengaruh terhadap hasil

Untuk kasus character recognition diatas adalah kasus yang sangat sederhana, dalam prakteknya akan banyak langkah-langkah pre proses yang harus dilalui.


Tidak ada komentar: