Pengenalan Pola Bentuk Menggunakan Chain Code Dan Multi SVM


Sama halnya seperti moment invariants, chain code atau kode rantai merupakan salah satu algoritma ekstraksi ciri bentuk yang nilainya tidak berubah terhadap perlakuan rotasi, translasi, pencerminan, dan penskalaan. Pada metode ini dihasilkan delapan nilai yang menunjukkan arah piksel penyusun objek. Arah piksel dari chain code 8-connected ditunjukkan pada gambar di bawah ini.

Berikut ini merupakan contoh pemrograman matlab mengenai pengenalan pola bentuk menggunakan algoritma chain code pada ekstraksi ciri dan algoritma multi SVM (Support Vector Machine) pada identifikasi. Citra yang digunakan terdiri dari tiga jenis bentuk objek yaitu botol (bottle), garpu (fork), dan palu (hammer). Pada data latih digunakan 15 citra pada masing-masing bentuk objek sehingga jumlah total data latih adalah 45 citra. Sedangkan pada data uji digunakan 5 citra pada masing-masing bentuk objek sehingga jumlah total data uji adalah 15 citra (sumber dataset citra: http://www.dabi.temple.edu/~shape/MPEG7/dataset.html)

Beberapa citra pada data latih ditunjukkan pada gambar berikut ini:

Langkah-langkah pemrogramannya adalah:

1. Pelatihan sistem dengan tahapan ekstraksi ciri menggunakan algoritma chain code dan identifikasi dengan algoritma multi SVM

clc; clear; close all;

image_folder = 'data latih';
filenames = dir(fullfile(image_folder, '*.gif'));
total_images = numel(filenames);

chain_code = zeros(total_images,8);

for n = 1:total_images
    full_name = fullfile(image_folder, filenames(n).name);
    img = logical(imread(full_name));
    bw = bwperim(img,8);
    bw = bwareaopen(bw,100);
    B = bwboundaries(bw,'noholes');
    CC = cell(1,length(B));
    for k = 1:length(B)
        CC{k} = chaincode(B{k});
    end

    chain_code(n,1) = sum(CC{1,1}.code==0);
    chain_code(n,2) = sum(CC{1,1}.code==1);
    chain_code(n,3) = sum(CC{1,1}.code==2);
    chain_code(n,4) = sum(CC{1,1}.code==3);
    chain_code(n,5) = sum(CC{1,1}.code==4);
    chain_code(n,6) = sum(CC{1,1}.code==5);
    chain_code(n,7) = sum(CC{1,1}.code==6);
    chain_code(n,8) = sum(CC{1,1}.code==7);
    
end

target = zeros(1,total_images);
target(1:15) = 1;   % bottle
target(16:30) = 2;  % fork
target(31:45) = 3;  % hammer

[out] = multisvm(chain_code,target,chain_code);

[a,~] = find(out'==target);
train_accuracy = sum(a)/total_images*100

data_latih = chain_code;
target_latih = target;
save('hasil_pelatihan','data_latih','target_latih')

Akurasi pelatihan yang dihasilkan adalah sebesar 97.7778%

2. Pengujian sistem terhadap data uji

% Adi Pamungkas, S.Si, M.Si
% Website: https://pemrogramanmatlab.com/
% Email  : adipamungkas@st.fisika.undip.ac.id

clc; clear; close all;

image_folder = 'data uji';
filenames = dir(fullfile(image_folder, '*.gif'));
total_images = numel(filenames);

chain_code = zeros(total_images,8);

for n = 1:total_images
    full_name = fullfile(image_folder, filenames(n).name);
    img = logical(imread(full_name));
    bw = bwperim(img,8);
    bw = bwareaopen(bw,100);
    B = bwboundaries(bw,'noholes');
    CC = cell(1,length(B));
    for k = 1:length(B)
        CC{k} = chaincode(B{k});
    end
    
    chain_code(n,1) = sum(CC{1,1}.code==0);
    chain_code(n,2) = sum(CC{1,1}.code==1);
    chain_code(n,3) = sum(CC{1,1}.code==2);
    chain_code(n,4) = sum(CC{1,1}.code==3);
    chain_code(n,5) = sum(CC{1,1}.code==4);
    chain_code(n,6) = sum(CC{1,1}.code==5);
    chain_code(n,7) = sum(CC{1,1}.code==6);
    chain_code(n,8) = sum(CC{1,1}.code==7);
end

load hasil_pelatihan
[out] = multisvm(data_latih,target_latih,chain_code);

target = zeros(1,total_images);
target(1:5) = 1;    % bottle
target(6:10) = 2;   % fork
target(11:15) = 3;  % hammer

[a,~] = find(out'==target);
test_accuracy = sum(a)/total_images*100

Akurasi pengujian yang dihasilkan adalah sebesar 100%

3. Memvisualisasikan proses pengenalan bentuk objek

clc; clear; close all;

full_name = 'data uji\fork-18.gif';
img = logical(imread(full_name));
bw = bwperim(img,8);
bw = bwareaopen(bw,100);
B = bwboundaries(bw,'noholes');
CC = cell(1,length(B));
for k = 1:length(B)
    CC{k} = chaincode(B{k});
end

chain_code(1,1) = sum(CC{1,1}.code==0);
chain_code(1,2) = sum(CC{1,1}.code==1);
chain_code(1,3) = sum(CC{1,1}.code==2);
chain_code(1,4) = sum(CC{1,1}.code==3);
chain_code(1,5) = sum(CC{1,1}.code==4);
chain_code(1,6) = sum(CC{1,1}.code==5);
chain_code(1,7) = sum(CC{1,1}.code==6);
chain_code(1,8) = sum(CC{1,1}.code==7);

load hasil_pelatihan
[out] = multisvm(data_latih,target_latih,chain_code);

switch out
    case 1
        class_out = 'bottle';
    case 2
        class_out = 'fork';
    case 3
        class_out = 'hammer';
end

figure, imshow(img);
title(['Result -> ',class_out])

Contoh hasil pengenalan yang benar

Contoh hasil pengenalan yang salah

Source code dan citra pada pemrograman di atas dapat diperoleh pada halaman berikut ini: Source Code

Posted on August 15, 2018, in Pengenalan Pola, Pengolahan Citra and tagged , , , , , , , , . Bookmark the permalink. 4 Comments.

  1. Assalamu’alaikum mas adi, untuk chain code menggunakan SAD bagaimana ?

  2. terimakasih mas adi, saya tunggu pembahasan chain code menggunakan SAD nya mas…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: