VI. KESIMPULAN DAN SARAN
6.2. Saran
1. Prototipe tentang klasifikasi pola batik Yogyakarta ini hanya menggunakan 10 jenis batik Yogyakarta saja, sehingga diperlukan pengembangan penelitian untuk klasifikasi pola batik selain batik Yogyakarta dengan jumlah dan jenis batik yang lebih banyak.
2. Feature warna dan rata-rata vektor pola batik yang digunakan untuk pengolahan data batik pada penelitian ini menghasilkan akurasi yang cukup baik (sekitar 75%), akan tetapi diperlukan pengembangan lebih
lanjut dengan menggunakan feature yang berbeda yang diharapkan dapat menghasilkan akurasi yang lebih baik.
DAFTAR PUSTAKA
Arhami, Muhammad dan Desiani, Anita. 2005. Pemrograman Matlab. Andi. Yogyakarta.
Canny, J., 1986. A Computational Approach To Edge Detection, IEEE Trans. Pattern Analysis and Machine Intelligence, vol 8, pages 679-714.
Dogra, Shaillay K. 2007. Confusion Matrix. QSARWorld-A Strand Life Sciences Web. http://www.qsarworld.com/qsar-ml-confusion-matrix.php [21 Juli 2011]
GKBI.info. 2001. Sejarah Batik Solo dan Yogyakarta. http://putralaweyan.wordpress.com/2010/06/04/sejarah-batik-solo-dan-yogyakarta [6 November 2009]
Han, Jiwai dan Kamber, Micheline. 2006. Data Mining Concepts and Techniques. Academic Press. San Diego. Hal 297-298.
Hamilton. E. Gurak dan L. Findlater W. Olive .2001. Decision Trees. Rudjer Boskovic Institute.
J. Bala , J. Huang, H. Vafaie, K. Dejong, dan H. Wechsler. 1995. Hybrid Learning UsingGenetic Algorithms and Decision Trees for Pattern Classificatio. George Mason University Fairfax. VA 22030.
Li, C., Cao, Q., dan Guo, F. 2009. A Method for Color Classification of FruitsBased on Machine Vision. Shanghai Jiao Tong University. Shanghai. mioelgallery.multiply.com. 2005. Sejarah Batik Indonesia.
Mitchell, Tom M. 1997. Machine Learning. McGraw-Hill. Singapore.
Nagoro, Hardjo Krt. 1988. Sekapur Sirih tentang Pola Batik, Malam batik, Pola, dan Pesona. UNS Press. Surakarta.
Noviyanto, Ary. 2009. Klasifikasi Varietas Tomat Merah Dengan Metode Perbandingan Kadar Warna. Universitas Gadjah Mada. Yogyakarta.
Quinlan, J. R. 1986. Induction of Decision Trees. Mach. Morgan Kaufmann. Rahman, Arif. 2007. Pembangunan Sistem Content Base Image Retrieval
Menggunakan Kode Fraktal dari Dokumen Citra. Sekolah Tinggi Teknik Elektro dan Informatika: Institut Teknologi Bandung. Bandung.
Payam R., Lie Tang dan Huan Liu. 2008. Cross Validation. Arizona State University. USA.
Richard O. Duda, Peter E. Hart, David G. Stork (2001) Pattern classification (2nd edition). Wiley. New York. ISBN 0-471-05669-3.
Riyanto Sigit, dkk. 2002. Aplikasi Neural Network pada Pengenalan Pola Tanda Tangan, Institut Teknologi Sepuluh November. Surabaya.
Rothman, Ernest E. 2005. Create a tree structure. http://creativecommons.org/licenses/by-nc-sa/2.5/ [13 Februari 2011]. Santosa, Budi. 2007. Data Mining Teknik Pemanfaatan Data untuk Keperluan
Bisnis. Graha Ilmu. Yogyakarta. 103.
Shapiro L.G. & Stockman G.C. 2001. Computer Vision. Prentice Hall. London. Page 326.
Squire, David McG. 2004. CSE5230 Tutorial: The ID3 Decision Tree Algorithm. Faculty of Information Technology. Monash University.
Storkey, Amos. 2004. Learning from Data: Decision Trees. School of Informatics University. Edinburgh.
Sutoyo, E. Mulyanto, V. Suhartono, O.D. Nurhayati, dan Wijanarto. 2009. Teori Pengolahan Citra Digital. Andi. Yogyakarta.
Theodoridis, Sergios dan Kountroumbas, Konstantinos. 2003. Pattern Recognition (4nd edition). Academic Press. San Diego.
LAMPIRAN 1
CODING PROGRAM
1. Listing Program createCiriHorisontal.m
function createCiriHorisontal()
dirAsal={'data_1'; 'data_2'; 'data_3'; 'data_4'; 'data_5'; ...
'data_6';'data_7';'data_8';'data_9';'data_10';};
for a=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd (dirAsal{a});
fileJpg=dir ('*.jpg'); % ambil file yang berekstensi *.jpg
sum_jpg=length(fileJpg);
for b=1:length(fileJpg)
batik = imread(fileJpg(b).name); % baca citra
tinggi=size(batik,1); % hitung tinggi citra
lebar=size(batik,2); % hitung lebar citra
feature=[]; % matriks info kepadatan piksel
sum1=0; sum2=0; sum3=0; sum4=0; sum5=0; sum6=0; sum7=0; sum8=0; obyek = 1;
dR=batik(:,:,1); %keping Red
dG=batik(:,:,2); %keping Green
dB=batik(:,:,3); %keping Blue
meanR=mean(mean(dR)); %rata-rata Red
meanG=mean(mean(dG)); %rata-rata Green
meanB=mean(mean(dB)); %rata-rata Blue
meanRGB=(meanR+meanG+meanB)/3; %rata-rata RGB
gray=rgb2gray(batik); % ubah citra batik ke grayscale
gambar = edge(gray,'canny'); %deteksi tepi dengan canny
for i=1:25 for k=1:200
if (gambar(i,k)==obyek) sum1=sum1+1; end
end
end
for i=26:50 for k=1:200
if (gambar(i,k)==obyek) sum2=sum2+1; end end
end for i=51:75 for k=1:200
if (gambar(i,k)==obyek) sum3=sum3+1; end end
end
for i=76:100 for k=1:200
if (gambar(i,k)==obyek) sum4=sum4+1; end end
end
for i=101:125 for k=1:200
if (gambar(i,k)==obyek) sum5=sum5+1; end end
end
for i=126:150 for k=1:200
if (gambar(i,k)==obyek) sum6=sum6+1; end
end
end
for i=151:175 for k=1:200
if (gambar(i,k)==obyek) sum7=sum7+1; end end
end
for i=176:200 for k=1:200
if (gambar(i,k)==obyek) sum8=sum8+1; end end
end
% masukkan sum per baris ke dalam indeks info ke[i]
feature=[feature,meanR,meanG,meanB,meanRGB,sum1/5000,sum2/5000,sum3/5000,sum4/ 5000,sum5/5000,sum6/5000,sum7/5000,sum8/5000,a];
% tulis ke dalam file feature
nama_file =[num2str(a) '_' num2str(b) '.nw']; fid1=fopen(nama_file,'w'); fwrite(fid1, [num2str(feature)]); fclose(fid1); end cd ..; end
2. Listing Program createCiriVertikal.m
function createCiriVertical()
dirAsal={'data_1'; 'data_2'; 'data_3'; 'data_4'; 'data_5'; ...
'data_6';'data_7';'data_8';'data_9';'data_10';};
for a=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd (dirAsal{a});
fileJpg=dir ('*.jpg'); % ambil file yang berekstensi *.jpg
sum_jpg=length(fileJpg);
for b=1:length(fileJpg)
batik = imread(fileJpg(b).name); % baca citra
feature=[]; % matriks info kepadatan piksel
sum1=0; sum2=0; sum3=0; sum4=0; sum5=0; sum6=0; sum7=0; sum8=0; obyek = 1; dR=batik(:,:,1); dG=batik(:,:,2); dB=batik(:,:,3); meanR=mean(mean(dR)); meanG=mean(mean(dG)); meanB=mean(mean(dB)); meanRGB=(meanR+meanG+meanB)/3;
gray=rgb2gray(batik); % ubah ke grayscale
gambar = edge(gray,'canny'); %deteksi tepi dengan canny
for i=1:200 for j=1:25
if (gambar(i,j)==obyek) sum1=sum1+1; end end
for k=26:50
if (gambar(i,k)==obyek) sum2=sum2+1; end end
for l=51:75
if (gambar(i,l)==obyek) sum3=sum3+1; end end
for m=76:100
if (gambar(i,m)==obyek) sum4=sum4+1; end end
for n=101:125
if (gambar(i,n)==obyek) sum5=sum5+1; end end
for o=126:150
if (gambar(i,o)==obyek) sum6=sum6+1; end end
for p=151:175
if (gambar(i,p)==obyek) sum7=sum7+1; end end
for q=176:200
if (gambar(i,q)==obyek) sum8=sum8+1; end end
end
% masukkan sum per kolom ke dalam indeks info ke[i]
feature=[feature,meanR,meanG,meanB,meanRGB,sum1/5000,sum2/5000,sum3/5000,sum4/ 5000,sum5/5000,sum6/5000,sum7/5000,sum8/5000,a];
% tulis ke dalam file feature
nama_file =[num2str(a) '_' num2str(b) '.nw']; fid1=fopen(nama_file,'w'); fwrite(fid1, [num2str(feature)]); fclose(fid1); end cd ..; end
3. Listing Program DataTraining1.m
function [training1 testing1]=DataTraining1()
training1=[]; testing1=[];
dirAsal={'data_1'; 'data_2'; 'data_3'; 'data_4'; 'data_5'; ...
'data_6';'data_7';'data_8';'data_9';'data_10';};
for a=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{a}); for b=1:32
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name; ff=textread(f); training1=[training1; ff]; end cd .. end for c=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{c}); for d=33:40
fnm = dir ([num2str(c) '_' num2str(d) '.nw']); f=fnm.name; ff=textread(f); testing1=[testing1; ff]; end cd .. end
4. Listing Program DataTraining2.m
function [training2 testing2]=DataTraining2()
training2=[]; testing2=[]; data1=[]; data2=[];
dirAsal={'data_1'; 'data_2'; 'data_3'; 'data_4'; 'data_5'; ...
'data_6';'data_7';'data_8';'data_9';'data_10';};
% masuk ke suatu direktori,membaca file
cd(dirAsal{a}); for b=1:24
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name;
ff=textread(f); data1=[data1; ff]; end
for b=33:40
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name; ff=textread(f); data2=[data2; ff]; end cd .. end training2=[training2; data1;data2]; for c=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{c}); for d=25:32
fnm = dir ([num2str(c) '_' num2str(d) '.nw']); f=fnm.name; ff=textread(f); testing2=[testing2; ff]; end cd .. end
5. Listing Program DataTraining3.m
function [training3 testing3]=DataTraining3()
training3=[]; testing3=[]; data1=[]; data2=[];
dirAsal={'data_1'; 'data_2'; 'data_3'; 'data_4'; 'data_5'; ...
'data_6';'data_7';'data_8';'data_9';'data_10';};
for a=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{a}); for b=1:16
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name;
ff=textread(f); data1=[data1; ff]; end
for b=25:40
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name; ff=textread(f); data2=[data2; ff]; end cd .. end training3=[training3; data1;data2]; for c=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{c}); for d=17:24
fnm = dir ([num2str(c) '_' num2str(d) '.nw']); f=fnm.name; ff=textread(f); testing3=[testing3; ff]; end cd .. end
6. Listing Program DataTraining4.m
function [training4 testing4]=DataTraining4()
training4=[]; testing4=[]; data1=[]; data2=[];
dirAsal={'data_1'; 'data_2'; 'data_3'; 'data_4'; 'data_5'; ...
'data_6';'data_7';'data_8';'data_9';'data_10';};
for a=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{a}); for b=1:8
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name;
ff=textread(f); data1=[data1; ff]; end
for b=17:40
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name; ff=textread(f); data2=[data2; ff]; end cd .. end training4=[training4; data1;data2]; for c=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{c}); for d=9:16
fnm = dir ([num2str(c) '_' num2str(d) '.nw']); f=fnm.name; ff=textread(f); testing4=[testing4; ff]; end cd .. end
7. Listing Program DataTraining5.m
function [training5 testing5]=DataTraining5()
training5=[]; testing5=[];
dirAsal={'data_1'; 'data_2'; 'data_3'; 'data_4'; 'data_5'; ...
'data_6';'data_7';'data_8';'data_9';'data_10';};
for a=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{a}); for b=9:40
fnm = dir ([num2str(a) '_' num2str(b) '.nw']); f=fnm.name; ff=textread(f); training5=[training5; ff]; end cd .. end for c=1:length(dirAsal)
% masuk ke suatu direktori,membaca file
cd(dirAsal{c}); for d=1:8
fnm = dir ([num2str(c) '_' num2str(d) '.nw']); f=fnm.name; ff=textread(f); testing5=[testing5; ff]; end cd .. end
8. Listing Program konversi.m
function [train test]=konversi(training,testing)
length=size(training); panjang=size(testing); datatrain=[]; datatest=[]; for kolom=1:length(2)-1 uruttrain=[]; uruttest=[]; nilaiSort=sort(training(:,kolom)); maxi=max(nilaiSort); minim=min(nilaiSort); paut=maxi-minim; rata=paut/3; batas1=min(nilaiSort)+rata; batas2=batas1+rata; for baris=1:length(1) data=training(baris,kolom); if (data<=batas1) var=1';
elseif ((data>batas1) & (data<=batas2)) var=2; elseif (data>batas2) var=3; end uruttrain=[uruttrain;var]; end datatrain=[datatrain,uruttrain]; for baris=1:panjang(1) data=testing(baris,kolom); if (data<=batas1) var2=1';
elseif ((data>batas1) & (data<=batas2)) var2=2; elseif (data>batas2) var2=3; end uruttest=[uruttest;var2]; end datatest=[datatest,uruttest]; end train=[datatrain,training(:,13)]; test=[datatest,testing(:,13)];
9. Listing Program peluang.m
function [mat_label total p1 p2 p3]=peluang(label,att)
panjang=size(att); mat_label=[]; p101=0;p102=0;p103=0;p104=0;p105=0;p106=0;p107=0;p108=0;p109=0;p110=0; p201=0;p202=0;p203=0;p204=0;p205=0;p206=0;p207=0;p208=0;p209=0;p210=0; p301=0;p302=0;p303=0;p304=0;p305=0;p306=0;p307=0;p308=0;p309=0;p310=0; ulabel=unique(label); pnj_ulabel=size(ulabel); for baris=1:panjang(1) klas=label(baris,:); nom=att(baris,:);
if ((nom==1) & (klas==1)) p101=p101+1;
elseif ((nom==1) & (klas==2)) p102=p102+1;
elseif ((nom==1) & (klas==3)) p103=p103+1;
elseif ((nom==1) & (klas==4)) p104=p104+1;
elseif ((nom==1) & (klas==5)) p105=p105+1;
elseif ((nom==1) & (klas==6)) p106=p106+1;
elseif ((nom==1) & (klas==7)) p107=p107+1;
elseif ((nom==1) & (klas==8)) p108=p108+1;
elseif ((nom==1) & (klas==9)) p109=p109+1;
elseif ((nom==1) & (klas==10)) p110=p110+1;
elseif ((nom==2) & (klas==1)) p201=p201+1;
elseif ((nom==2) & (klas==2)) p202=p202+1;
elseif ((nom==2) & (klas==3)) p203=p203+1;
elseif ((nom==2) & (klas==4)) p204=p204+1;
elseif ((nom==2) & (klas==5)) p205=p205+1;
elseif ((nom==2) & (klas==6)) p206=p206+1;
elseif ((nom==2) & (klas==7)) p207=p207+1;
elseif ((nom==2) & (klas==8)) p208=p208+1;
elseif ((nom==2) & (klas==9)) p209=p209+1;
elseif ((nom==2) & (klas==10)) p210=p210+1;
elseif ((nom==3) & (klas==1)) p301=p301+1;
elseif ((nom==3) & (klas==2)) p302=p302+1;
elseif ((nom==3) & (klas==3)) p303=p303+1;
elseif ((nom==3) & (klas==4)) p304=p304+1;
elseif ((nom==3) & (klas==5)) p305=p305+1;
elseif ((nom==3) & (klas==6)) p306=p306+1;
elseif ((nom==3) & (klas==7)) p307=p307+1;
elseif ((nom==3) & (klas==8)) p308=p308+1;
elseif ((nom==3) & (klas==9)) p309=p309+1;
elseif ((nom==3) & (klas==10)) p310=p310+1; end p1=[p101,p102,p103,p104,p105,p106,p107,p108,p109,p110]; p2=[p201,p202,p203,p204,p205,p206,p207,p208,p209,p210]; p3=[p301,p302,p303,p304,p305,p306,p307,p308,p309,p310]; end for batik=1:max(ulabel) [a,b]=find(label==batik); jml_label=sum(b); mat_label=[mat_label,jml_label]; end total=sum(mat_label);
10.Listing Program buat_gain.m
function [g]=buat_gain(train) panjang=size(train); data=train(:,1:panjang(2)-1); label=train(:,panjang(2)); g=[]; ent=[];
ulabel=unique(label); pnj_ulabel=size(ulabel); for kolom=1:panjang(2)-1 att=data(:,kolom); uval=unique(att); jmlUnik=size(uval); if(jmlUnik(1)==1) gain=0; else
[mat_label total p1 p2 p3]=peluang(label,att); entropyKelas=0; for i=1:3 length=size(p1); entrop=0; eval(['Ep' num2str(i) '=0;']); for kolom=1:length(2)-1
eval(['Pnode=p' num2str(i) '(:,kolom);']); eval(['tot=sum(p' num2str(i) ')';]); if(Pnode==0) hasil=0; else hasil=(Pnode/tot)*log(Pnode/tot)/log(2); end entrop=entrop-hasil;
eval(['Ep' num2str(i) '=entrop;']); end ent=[ent,entrop]; end for i=1:max(ulabel) if (mat_label(1,i)==0) entKlas=0; else entKlas=(mat_label(1,i)/total)*(log(mat_label(1,i)/total)/log(2)); end entropyKelas = entropyKelas-entKlas; end info=0; for j=1:3 eval(['jum=sum(p' num2str(j) ');']); eval(['entropi=Ep' num2str(j) ';']) if (isnan(entropi)==1) entropi=0; info=info+(jum/total)*entropi; else info=info+(jum/total)*entropi; end gain=entropyKelas-info; end end g=[g,gain]; end
11.Listing Program buat_tree.m
function [node]=buat_tree(train, level, cutoff)
data_size = size(train);
clear node;
[nrows, ncols] = size(train); class_attr = ncols; if( level >= ncols-1 ) node.subnbode1 = []; node.subnbode2 = []; node.subnbode3 = []; node.split_attribute = 0;
node.split_vars = []; node.info_gain = 0; node.count_child_node = 0; node.level = 0; max_daun=1; daun1=sum(train(:,class_attr) == 1); for (k=2:10) daun=sum(train(:,class_attr) == k); temp=daun; if(temp>daun1) daun1 = temp; max_daun = k; end end node.classvar = max_daun; return; end [g] = buat_gain(train);
[max_info_gain, split_attr] = max(g); if (max_info_gain <= 0) node.subnbode1 = []; node.subnbode2 = []; node.subnbode3 = []; node.split_attribute = 0; node.split_vars = []; node.info_gain = 0; node.count_child_node = 0; node.level = 0; max_daun=1; daun1=sum(train(:,class_attr) == 1); for (k=2:10) daun=sum(train(:,class_attr) == k); temp=daun; if(temp>daun1) daun1 = temp; max_daun = k; end end node.classvar = max_daun; return; end % set up node node.subnode1 = []; node.subnode2 = []; node.subnode3 = []; node.split_attribute = split_attr; node.split_vars = unique(train(:,split_attr)); node.info_gain = max_info_gain; uvals = unique(train(:,split_attr)); node.count_child_node = length(uvals); node.level = level; node.classvar = -1; for i = 1 : node.count_child_node new_train = []; clear new_node;
% create a new train
for j=1 : nrows
if( train( j, split_attr ) == uvals(i) ) new_train = [new_train; train(j,:)]; end
[srows, scols] = size(new_train); if( isempty(new_train) ) new_node.subnode1 = []; new_node.subnode2 = []; new_node.subnode3 = []; new_node.split_attribute = 0; new_node.split_vars = []; new_node.info_gain = 0; new_node.count_child_node = 0; new_node.level = 0; new_node.classvar = -1; else
new_node = buat_tree( new_train, level+1, cutoff ); end if( uvals(i) == 1 ) node.subnode1 = new_node; elseif( uvals(i) == 2 ) node.subnode2 = new_node; elseif( uvals(i) == 3 ) node.subnode3 = new_node; end end
12.Listing Program test_id3.m
function [kelas, test_acc1] = test_id3( tree, dataset )
kelas=[];
[nrows, ncols] = size( dataset ); success = 0;
failure = 0; for i=1:nrows
[class_res]=test_id3_case( tree, dataset(i,:) );
if( test_id3_case( tree, dataset(i,:) ) == dataset(i,ncols) ) success = success + 1; else failure = failure + 1; end kelas=[kelas; class_res]; end
test_acc1 = (success) / (success + failure);
function [class_res] = test_id3_case( node, dataset )
if( node.split_attribute ~= 0 )
if( ~isempty(node.subnode1) && dataset(node.split_attribute) == 1 ) class_res = test_id3_case(node.subnode1, dataset);
return;
elseif( ~isempty(node.subnode2) && dataset(node.split_attribute) == 2) class_res = test_id3_case(node.subnode2, dataset);
return;
elseif( ~isempty(node.subnode3) && dataset(node.split_attribute) == 3) class_res = test_id3_case(node.subnode3, dataset);
return; end
class_res = -1; else
class_res = node.classvar;
13.Listing Program cross_validation.m
function [tot_benar data_salah data_null confution_mat akurasi] =
cross_validation(id3_test, test) panjang=size(test); kelas=test(:,panjang(2)); uval=unique(kelas); length=size(uval); crossV=[];
hasil=[]; confution_mat=[]; for i=1:length(1) tab1=0;tab2=0,tab3=0;tab4=0;tab5=0,tab6=0,tab7=0,tab8=0;tab9=0,tab10=0; for baris=1:panjang(1) if (kelas(baris,:) == i) if (id3_test(baris,:) == 1) tab1=tab1+1; elseif (id3_test(baris,:) == 2) tab2=tab2+1; elseif (id3_test(baris,:) == 3) tab3=tab3+1; elseif (id3_test(baris,:) == 4) tab4=tab4+1; elseif (id3_test(baris,:) == 5) tab5=tab5+1; elseif (id3_test(baris,:) == 6) tab6=tab6+1; elseif (id3_test(baris,:) == 7) tab7=tab7+1; elseif (id3_test(baris,:) == 8) tab8=tab8+1; elseif (id3_test(baris,:) == 9) tab9=tab9+1; elseif (id3_test(baris,:) == 10) tab10=tab10+1; end else 0; end end crossV=[tab1;tab2;tab3;tab4;tab5;tab6;tab7;tab8;tab9;tab10]; hasil=[hasil,crossV]; end confution_mat=hasil'; tot_benar=0; totDat=0; con_mat=size(confution_mat); for j=1:con_mat(1) betul=confution_mat(j,j); tot_benar=tot_benar+betul; jml=sum(confution_mat(j,:)); totDat=totDat+jml; end data_salah=totDat-tot_benar; data_null=panjang(1)-totDat; akurasi=tot_benar/panjang(1)*100;
14.Listing Program training_testing.m
function [training benar salah tdkJelas pohon matriks
akurasi]=training_testing()
[training1 testing1]=DataTraining1(); [train1 test1]=konversi(training1,testing1); [pohon1] = buat_tree(train1, 0, 1);
[hasil_test1] = test_id3(pohon1, test1);
[data_benar1 data_salah1 data_null1 confution_mat1 akurasi1] = cross_validation(hasil_test1, test1)
[training2 testing2]=DataTraining2(); [train2 test2]=training(training2,testing2); [pohon2] = buat_tree(train2, 0, 1);
[hasil_test2] = test_id3(pohon2, test2);
[data_benar2 data_salah2 data_null2 confution_mat2 akurasi2] = cross_validation(hasil_test2, test2)
[training3 testing3]=DataTraining3(); [train3 test3]=training(training3,testing3);
[pohon3] = buat_tree(train3, 0, 1); [hasil_test3] = test_id3(pohon3, test3);
[data_benar3 data_salah3 data_null3 confution_mat3 akurasi3] = cross_validation(hasil_test3, test3)
[training4 testing4]=DataTraining4(); [train4 test4]=training(training4,testing4); [pohon4] = buat_tree(train4, 0, 1);
[hasil_test4] = test_id3(pohon4, test4);
[data_benar4 data_salah4 data_null4 confution_mat4 akurasi4] = cross_validation(hasil_test4, test4)
[training5 testing5]=DataTraining5(); [train5 test5]=training(training5,testing5); [pohon5] = buat_tree(train5, 0, 1);
[hasil_test5] = test_id3(pohon5, test5);
[data_benar5 data_salah5 data_null5 confution_mat5 akurasi5] = cross_validation(hasil_test5, test5) akur=[akurasi1,akurasi2,akurasi3,akurasi4,akurasi5]; [a b]=max(akur); eval(['training=training' num2str(b) ';']); eval(['benar=data_benar' num2str(b) ';']); eval(['salah=data_salah' num2str(b) ';']); eval(['tdkJelas=data_null' num2str(b) ';']); eval(['pohon=pohon' num2str(b) ';']); eval(['matriks=confution_mat' num2str(b) ';']); eval(['akurasi=akurasi' num2str(b) ';']);
15.Listing Program modeling.m
function [data_model]=modeling(training, fileJpg)
batik = imread(fileJpg(b).name); % baca citra
tinggi=size(batik,1); % hitung tinggi citra
lebar=size(batik,2); % hitung lebar citra
feature=[]; % matriks info kepadatan piksel
sum1=0; sum2=0; sum3=0; sum4=0; sum5=0; sum6=0; sum7=0; sum8=0; obyek = 1;
dR=batik(:,:,1); %keping Red
dG=batik(:,:,2); %keping Green
dB=batik(:,:,3); %keping Blue
meanR=mean(mean(dR)); %rata-rata Red
meanG=mean(mean(dG)); %rata-rata Green
meanB=mean(mean(dB)); %rata-rata Blue
meanRGB=(meanR+meanG+meanB)/3; %rata-rata RGB
gray=rgb2gray(batik); % ubah citra batik ke grayscale
gambar = edge(gray,'canny'); % deteksi tepi dengan canny
for i=1:25 for k=1:200
if (gambar(i,k)==obyek) sum1=sum1+1; end
end
end
for i=26:50 for k=1:200
if (gambar(i,k)==obyek) sum2=sum2+1; end
end
end for i=51:75 for k=1:200
if (gambar(i,k)==obyek) sum3=sum3+1; end end
end
for i=76:100 for k=1:200
if (gambar(i,k)==obyek) sum4=sum4+1; end
end
end
for k=1:200
if (gambar(i,k)==obyek) sum5=sum5+1; end end
end
for i=126:150 for k=1:200
if (gambar(i,k)==obyek) sum6=sum6+1; end
end
end
for i=151:175 for k=1:200
if (gambar(i,k)==obyek) sum7=sum7+1; end
end
end
for i=176:200 for k=1:200
if (gambar(i,k)==obyek) sum8=sum8+1; end end
end
% masukkan sum per baris ke dalam indeks info ke[i]
feature=[feature,meanR,meanG,meanB,meanRGB,sum1/5000,sum2/5000,sum3/5000,sum4/ 5000,sum5/5000,sum6/5000,sum7/5000,sum8/5000,a]; length=size(training); data_model=[]; for kolom=1:length(2)-1 nilaiSort=sort(training(:,kolom)); maxi=max(nilaiSort); minim=min(nilaiSort); paut=maxi-minim; rata=paut/3; batas1=min(nilaiSort)+rata; batas2=batas1+rata; data=feature(:,kolom); if (data<=batas1) var=1';
elseif ((data>batas1) & (data<=batas2)) var=2; elseif (data>batas2) var=3; end data_model=[data_model,var]; end
16.Listing Program pengujian.m
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @pengujian_OpeningFcn, ...
'gui_OutputFcn', @pengujian_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% --- Executes just before pengujian is made visible.
function pengujian_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for pengujian
handles.output = hObject;
% Update handles structure
function varargout = pengujian_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
% --- Executes on button press in btnKembali.
function btnKembali_Callback(hObject, eventdata, handles)
delete(handles.figure1)
function popupFeature_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in btnProses.
function btnProses_Callback(hObject, eventdata, handles)
set(handles.textProses1,'string','sedang membuat feature...'); set(handles.textProses2,'string','...');
selected_cmd = get(handles.popupFeature,'Value');
switch selected_cmd;
case 1
createCiriHorisontal();
set(handles.textProses3,'string','feature Warna & Rata2 Horisontal berhasil dibuat.');
case 2
createCiriVertikal();
set(handles.textProses3,'string','feature Warna & Rata2 Vertikal berhasil dibuat.');
end
set(handles.textProses4,'string','proses training...');
[training benar salah tdkJelas pohon matriks akurasi]=training_testing(); set(handles.textProses5,'string','confution matriks'); set(handles.uitable1,'Data',matriks) set(handles.textBenar,'string',benar); set(handles.textSalah,'string',salah); set(handles.textNull,'string',tdkJelas); set(handles.textAkurasi,'string',akurasi);
17.Listing Program pengenalan.m
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @pengenalan_OpeningFcn, ...
'gui_OutputFcn', @pengenalan_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% --- Executes just before pengenalan is made visible.
function pengenalan_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
% --- Executes on button press in pushbutton_kembali.
function pushbutton_kembali_Callback(hObject, eventdata, handles)
delete(handles.figure1)
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushBrowse.
function pushBrowse_Callback(hObject, eventdata, handles)
[nama_file1, nama_path1]=uigetfile(...
{'*.bmp;*.jpg','File Citra (*.bmp,*.jpg)'; '*.jpg','File jpeg (*.jpg)'},...
'Buka File Citra');
if ~isequal(nama_file1, 0)
handles.data1=imread(fullfile(nama_path1,nama_file1)); if isequal(nama_file1,0)|isequal(nama_path1,0)
errordlg('File Tidak Ditemukan.','Peringatan'); end; guidata(hObject,handles); handles.current_data1=handles.data1; axes(handles.axes1); imshow(handles.current_data1); else return; end set(handles.edit1,'String',nama_file1);
% --- Executes on button press in pushProses.
function pushProses_Callback(hObject, eventdata, handles)
set(handles.textProses1,'string','membentuk feature...');
[training benar salah tdkJelas pohon matriks akurasi]=training_testing(); image_file = get(handles.edit1,'String'); nama_file= char(image_file); display(nama_file); [data_model]=modeling(training,nama_file); set(handles.textProses2,'string','mencocokan pola'); [klasifikasi] = test_id3(pohon, data_model);
if (klasifikasi==1)
nama_pola={'Nitik Cengkeh'};
elseif(klasifikasi==2)
nama_pola={'Parang Pancing'};
elseif(klasifikasi==3)
nama_pola={'Pari Sewuli Seling Pamor'};
elseif(klasifikasi==4) nama_pola={'Truntum'}; elseif(klasifikasi==5) nama_pola={'Tambal'}; elseif(klasifikasi==6) nama_pola={'Ceplok Kece'}; elseif(klasifikasi==7)
nama_pola={'Kawung Kembang Cempoko Hitam'};
elseif(klasifikasi==8)
nama_pola={'Kawung Picis'};
elseif(klasifikasi==9)
nama_pola={'Parang Kawung Picis'};
elseif(klasifikasi==10)
nama_pola={'Parang Kunci'}; end
set(handles.textPola,'string',nama_pola);
% --- Executes on button press in pushKembali.
function pushKembali_Callback(hObject, eventdata, handles)
LAMPIRAN 2
DATA HASIL
1. Data hasil ekstraksi feature horisontal
3. Data hasil ekstraksi feature vertical
LAMPIRAN 3
DATA PENELITIAN
1. Jenis Batik
Nitik Cengkeh Parang Pancing
Parang Sewuli Seling Pamor
Truntum Tambal
Ceplok Kece Kawung Kembang Cempoko Hitam
Kawung Picis Parang Kawung Picis