Anda di halaman 1dari 114

PENINGKATAN NILAI FITUR JARINGAN PROPAGASI BALIK PADA

PENGENALAN ANGKA TULISAN TANGAN MENGGUNAKAN


METODE ZONING DAN DIAGONAL BASED
FEATURE EXTRACTION

SKRIPSI

NANDA PUTRA
081402030

PROGRAM STUDI TEKNOLOGI INFORMASI


FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI
UNIVERSITAS SUMATERA UTARA
MEDAN
2012

PENINGKATAN NILAI FITUR JARINGAN PROPAGASI BALIK PADA


PENGENALAN ANGKA TULISAN TANGAN MENGGUNAKAN
METODE ZONING DAN DIAGONAL BASED
FEATURE EXTRACTION

SKRIPSI

Diajukan untuk melengkapi tugas dan memenuhi syarat mencapai gelar Sarjana
Teknologi Informasi

NANDA PUTRA
081402030

PROGRAM STUDI TEKNOLOGI INFORMASI


FAKULTAS ILMU KOMPUTER DAN TEKNOLOGI INFORMASI
UNIVERSITAS SUMATERA UTARA
MEDAN
2012

ii

PERSETUJUAN

Judul

Kategori
Nama
Nomor Induk Mahasiswa
Program Studi
Departemen
Fakultas

: PENINGKATAN NILAI FITUR JARINGAN


PROPAGASI BALIK PADA PENGENALAN
ANGKA TULISAN TANGAN MENGGUNAKAN
METODE ZONING DAN DIAGONAL BASED
FEATURE EXTRACTION
: SKRIPSI
: NANDA PUTRA
: 081402030
: SARJANA (S1) TEKNOLOGI INFORMASI
: TEKNOLOGI INFORMASI
: ILMU KOMPUTER DAN TEKNOLOGI
INFORMASI (FASILKOMTI) UNIVERSITAS
SUMATERA UTARA
Diluluskan di
Medan, November 2012

Komisi Pembimbing

Pembimbing 2

Pembimbing 1

Sajadin Sembiring, S.Si, M.Sc


NIP

Drs. Suyanto, M.Kom


NIP 195908131986011002

Diketahui/Disetujui oleh
Program Studi S1 Teknologi Informasi
Ketua,

Prof. Dr. Opim Salim Sitompul, M.Sc.


NIP 196108171987011001

iii

PERNYATAAN

PENINGKATAN NILAI FITUR JARINGAN PROPAGASI BALIK PADA


PENGENALAN ANGKA TULISAN TANGAN MENGGUNAKAN
METODE ZONING DAN DIAGONAL BASED
FEATURE EXTRACTION

SKRIPSI

Saya mengakui bahwa skripsi ini adalah hasil karya sendiri, kecuali beberapa kutipan
dan ringkasan yang masing-masing disebutkan sumbernya.

Medan, November 2012

Nanda Putra
081402030

iv

PENGHARGAAN

Puji dan syukur penulis sampaikan kehadirat Allah SWT yang telah memberikan
rahmat dan hidayah-Nya sehingga penuli dapat menyelesaikan skripsi ini sebagai
syarat untuk memperoleh gelar Sarjana Teknologi Informasi, Program Studi S1
Teknologi Informasi Universitas Sumatera Utara.
Ucapan terima kasih penulis sampaikan kepada Bapak Drs. Suyanto, M.Kom.
selaku pembimbing satu dan Bapak Sajadin Sembiring, S.Si, M.Sc. selaku
pembimbing dua yang telah banyak meluangkan waktu dan pikirannya, memotivasi
dan memberikan kritik dan saran kepada penulis. Ucapan terima kasih juga ditujukan
kepada Bapak M. Fadly Syahputra, B.Sc., M.Sc. dan Bapak Dedy Arisandi, S.T.,
M.Kom. yang telah bersedia menjadi dosen penguji. Ucapan terima kasih juga
ditujukan kepada Ketua dan Sekretaris Program Studi Teknologi Informasi, Prof. Dr.
Opim Salim Sitompul, M.Sc. dan Drs. Sawaluddin, M.IT, Dekan dan Pembantu
Dekan Fakultas Ilmu Komputer dan Teknologi Informasi Universitas Sumatera Utara,
semua dosen serta pegawai di Program Studi S1 Teknologi Informasi.
Skripsi ini terutama penulis persembahkan untuk kedua orang tua dan keluarga
penulis yang telah memberikan dukungan dan motivasi, ayahanda Sudirman dan
ibunda Eni Hidayati yang selalu sabar dalam mendidik penulis. Untuk kakak penulis
Prima Octari dan adik penulis Sudrial Fajri yang selalu memberikan dorongan kepada
penulis. Terima kasih penulis ucapkan kepada teman-teman yang selalu memberikan
dukungan, Kak Rani, Kak Andre, Bang Asril, Hasnul, Dika, Ical, Billy, Fran, Reyhan,
teman-teman lantai 3, serta teman-teman mahasiswa Teknologi Informasi lainnya
yang tidak dapat penulis sebutkan satu persatu. Semoga Allah SWT membalas
kebaikan kalian.

ABSTRAK

Pada penelitian ini, kombinasi metode zoning dan diagonal based feature extraction
digunakan pada jaringan propagasi balik untuk pengenalan angka tulisan tangan.
Kedua metode ini sama-sama membagi data sampel menjadi NxM zona dan
menghitung nilai fitur dari setiap zona tersebut. Pada penelitian ini data sampel dibagi
menjadi 6x9 zona, yaitu 54 zona dengan ukuran masing-masing zona adalah 10x10
piksel. Metode zoning menghitung jumlah piksel aktif (hitam) setiap zona dan
melakukan perbandingan terhadap zona yang memiliki jumlah piksel aktif paling
banyak. Metode diagonal based feature extraction menghitung nilai rata-rata
histogram diagonal setiap zona. Selain itu juga dihitung rata-rata nilai zona setiap
baris dan kolom. Dari ekstraksi fitur tersebut didapatkan 123 nilai fitur, yaitu 54 dari
metode zoning dan 69 dari metode diagonal based feature extraction. Nilai fitur
tersebut dijadikan masukan untuk klasifikasi menggunakan jaringan propagasi balik.
260 data sampel digunakan untuk pelatihan dan 100 data sampel berbeda digunakan
untuk uji tingkat pengenalan. Dari pengujian yang dilakukan didapatkan tingkat
pengenalan menggunakan kombinasi dua metode fitur ekstraksi ini adalah 87%.
Kata kunci : angka tulisan tangan, diagonal based feature extraction, propagasi balik
zoning.

vi

FEATURE VECTOR IMPROVEMENT OF BACKPROPAGATION


NETWORK FOR HANDWRITTEN DIGIT RECOGNITION
USING ZONING AND DIAGONAL BASED
FEATURE EXTRACTION

ABSTRACT

In this paper, combination of zoning and diagonal based feature extraction method is
used by backpropagation network for handwritten digit recognition. Both method
divide sample to NxM grid zones and compute feature vector from each zone. In this
paper, sample is divided into 6x9 grid zone, total 54 zones where each zone is 10x10
pixel. Zoning method summing every active (black) pixel from each zone and divide
value from each zone by a zone with most active pixel. Diagonal based feature
extraction method compute average of diagonal histogram from each zone. Also
compute average value from all zone row-wise and column-wise. 123 features vector
formed from these feature extraction, which is 54 features obtained from zoning
method and 69 features obtained from diagonal based feature extraction. These feature
vector used as input data for backpropagation classifier. 260 samples are used for
training and another 100 samples are used for recognition rate testing. After testing
phase done, recognition rate using combination of these feature extraction is 87%.
Keywords : backpropagation, diagonal based feature extraction, handwritten digit,
zoning.

vii

DAFTAR ISI

Halaman
PERSETUJUAN
PERNYATAAN
PENGHARGAAN
ABSTRAK
ABSTRACT
DAFTAR ISI
DAFTAR TABEL
DAFTAR GAMBAR
BAB 1 PENDAHULUAN
1.1 Latar Belakang
1.2 Rumusan Masalah
1.3 Batasan Masalah
1.4 Tujuan Penelitian
1.5 Manfaat Penelitian
1.6 Metodologi Penelitian
1.7 Sistematika Penulisan

ii
iii
iv
v
vi
vii
ix
x
1
1
3
3
4
4
4
5

BAB 2 LANDASAN TEORI


2.1 Citra
2.2 Pengolahan Citra
2.2.1 Pemotongan Citra (Crop)
2.2.2 Pengurangan Derau (Noise Reduction)
2.2.3 Normalisasi
2.2.4 Thinning
2.3 Ekstraksi Fitur
2.3.1 Zoning
2.3.2 Diagonal Based Feature Extraction
2.4 Jaringan Saraf Tiruan
2.4.1 Komponen Jaringan Saraf Tiruan
2.5 Algoritma Propagasi Balik
2.5.1 Fungsi Aktivasi
2.5.1.1 Fungsi Sigmoid Biner
2.5.2 Inisialisasi Bobot dan Bias
2.5.2.1 Inisialisasi Acak
2.5.2.2 Inisialisasi Nguyen Widrow
2.5.3 Pengupdate Bobot dengan Momentum

7
7
8
8
8
9
9
11
12
12
14
15
15
19
19
20
20
20
21

BAB 3 ANALISIS DAN PERANCANGAN


3.1 Tahap Sebelum Ekstraksi Fitur
3.1.1 Akuisisi Data
3.1.2 Prapengolahan Citra
3.1.2.1 Pembentukan Citra Keabuan (Grayscaling)

23
25
25
26
27

viii

3.1.2.2 Pengurangan Derau (Noise Reduction)


3.1.2.3 Pembentukan Citra Biner (Thresholding)
3.1.2.4 Pengisian Piksel Putih (Filling)
3.1.2.5 Pemotongan Citra (Cropping)
3.1.2.6 Normalisasi Resolusi Citra (Normalization)
3.1.2.7 Pengurusan Objek Citra (Thinning)
3.2 Tahap Ekstraksi Fitur
3.2.1 Metode Ekstraksi Zoning
3.2.2 Metode Ekstraksi Diagonal Based Feature Extraction
3.2.3 Penggabungan nilai fitur
3.3 Tahap Setelah Ekstraksi Fitur
3.3.1 Perancangan Jaringan Propagasi Balik
3.3.2 Proses Pelatihan
3.3.3 Proses Pengujian

28
28
30
32
35
35
36
38
41
44
44
45
47
48

BAB 4 IMPLEMENTASI DAN PENGUJIAN


4.1 Implementasi
4.2 Pengujian
4.2.1 Persiapan Jaringan
4.2.2 Hasil Pengujian

49
49
51
51
52

BAB 5 KESIMPULAN DAN SARAN


5.1 Kesimpulan
5.2 Saran

61
61
61

DAFTAR PUSTAKA
LAMPIRAN A : LISTING PROGRAM
LAMPIRAN B : DATA SAMPEL

62
65
93

ix

DAFTAR TABEL

Halaman
Tabel 2.1 Ekstraksi fitur pada representasi citra yang berbeda
11
Tabel 3.1 Nilai keluaran dan target keluaran jaringan
45
Tabel 4.1 Fungsi-fungsi CImg yang digunakan
50
Tabel 4.2 Arsitektur tiga jaringan yang diujikan
52
Tabel 4.3 Hasil pengenalan data uji jaringan I(Zoning)
52
Tabel 4.4 Hasil pengenalan data uji jaringan II(Diagonal Based Feature Extraction) 55
Tabel 4.5 Hasil pengenalan data uji jaringan III (Zoning dan Diagonal Based Feature
Extraction)
57
Tabel 4.6 Kemampuan generalisasi tiga jaringan yang diujikan
60

DAFTAR GAMBAR

Halaman
Gambar 2.1 Piksel P1 dengan 8 tetangga
Gambar 2.2 Pembagian zona pada citra biner
Gambar 2.3 Karakter ukuran 60x90 piksel
Gambar 2.4 Pembagian zona ekstraksi fitur
Gambar 2.5 Diagonal histogram setiap zona
Gambar 2.6 Jaringan propagasi balik dengan satu buah lapisan tersembunyi
Gambar 2.7 Fungsi sigmoid biner dengan rentang
Gambar 3.1 Skema Dasar Pengenalan Angka Tulisan Tangan
Gambar 3.2 Tulisan menggunakan tinta cair (kiri) dan tinta biasa (kanan)
Gambar 3.3 Tahapan Prapengolahan Citra
Gambar 3.4 Flowchart proses grayscaling
Gambar 3.5 Citra hasil grayscaling
Gambar 3.6 Citra hasil noise reduction
Gambar 3.7 Flowchart proses thresholding
Gambar 3.8 Citra hasil thresholding
Gambar 3.9 Flowchart proses filling
Gambar 3.10 Citra hasil filling
Gambar 3.11 Flowchart proses cropping
Gambar 3.12 Citra hasil croping
Gambar 3.13 Citra hasil normalisasi
Gambar 3.14 Citra hasil thinning
Gambar 3.15 Matrik penyimpanan nilai fitur
Gambar 3.16 Pembagian zona menjadi 6 kolom dan 9 baris
Gambar 3.17 Diagram ekstraksi fitur
Gambar 3.18 Flowchart ekstraksi fitur zoning
Gambar 3.19 Histogram diagonal zona
Gambar 3.20 Flowchart ekstraksi diagonal based feature extraction
Gambar 3.21 Matrik penyimpanan nilai fitur
Gambar 3.22 Arsitektur jaringan saraf tiruan

10
12
13
13
14
16
20
24
25
26
27
28
28
29
30
31
32
33
34
35
36
36
37
38
40
41
43
44
46

BAB 1

PENDAHULUAN

1.1 Latar Belakang

Pengolahan citra digital dewasa ini tidak hanya terbatas pada pengeditan citra digital,
namun juga meliputi teknik pengenalan karakter seperti karakter alfanumerik, tulisan
tangan, dan lain-lain (Emanual dan Hartono, 2008). Teknik ini disebut juga Optical
Character Recognition (OCR). OCR untuk pengenalan tulisan tangan telah menjadi
salah satu area penelitian yang paling menarik dan menantang dari bidang pengolahan
citra dan pengenalan pola pada beberapa tahun terakhir (Althaf dan Begum, 2012).

Secara umum, pengenalan tulisan tangan terbagi menjadi dua jenis, yaitu
metode online dan offline. Metode offline melakukan konversi secara otomatis tulisan
pada sebuah citra menjadi karakter yang dapat diolah oleh computer dan aplikasi
pemrosesan teks. Pada metode online, koordinat dua dimensi dari poin-poin penulisan
direpresentasikan sebagai fungsi waktu dan urutan setiap garis yang dituliskan juga
disimpan secara realtime untuk mengenali karakter yang dituliskan (Arica dan
Yarman-Vural, 2001).

Tahapan awal untuk pengenalan tulisan tangan adalah prapengolahan citra dan
ekstraksi fitur. Pemilihan metode ektraksi fitur yang baik merupakan salah satu faktor
penting untuk mencapai tingkat pengenalan yang tinggi (Jain dan Taxt, 1996).
Beberapa metode ekstraksi yang dapat digunakan adalah model deformable, profil
kontur, zoning, momen zernike, dekriptor fourier dan gabor.

Proses ekstraksi fitur dilakukan untuk mendapatkan nilai fitur yang dibutuhkan
untuk tahap pengklasifikasian. Berbagai metode ekstraksi fitur telah banyak

digunakan untuk mendapatkan nilai fitur sebagai masukan untuk pengenalan tulisan
tangan. Sheth et. al (2011) menggunakan kode rantai dan koefisien korelasi dan
mendapatkan tingkat pengenalan 80%. Handayani, 2008, menggunakan model
deformable mendapatkan tingkat kesalahan sebesar 4,05% dan tingkat penolakan
sebesar 9,88%. Lauer et.al, 2007, mengembangkan trainable feature extractor dan
mendapatkan tingkat pengenalan antara 98,45% sampai 99,32%.

Meskipun penelitian tentang berbagai metode ekstraksi fitur untuk pengenalan


tulisan tangan telah banyak dilakukan, tetapi penggunaan satu metode saja belum
mampu menghasilkan nilai fitur yang mampu mencapai tingkat pengenalan 100%.
Oleh karena itu masih dibutuhkan penelitian lebih lanjut tentang kombinasi beberapa
metode ekstraksi fitur untuk mendapatkan nilai fitur yang mampu menambah tingkat
pengenalan tulisan tangan.

Penelitian tentang kombinasi dua atau lebih metode ekstraksi fitur juga telah
dilakukan. Murty dan Hanmandlu (2011) menambahkan lokasi piksel sebagai fitur
tambahan untuk metode zoning. Siddrath et. al (2011) menggabungkan zonal density
dengan background directional distribution untuk mengenali tulisan gumurkhi dengan
tingkat pengenalan 88.9%. Ayyaz et. al (2012) mengkombinasikan berbagai metode
ekstraksi fitur seperti proyeksi, profil, momen invarian, titik ujung dan titik
perpotongan dan fitur korelasi dengan tingkat pengenalan 96%.

Pada penelitian ini metode ekstraksi zoning dan diagonal based feature
extraction akan dikombinasikan untuk mendapatkan nilai fitur yang akan digunakan
untuk pengklasifikasian. Untuk setiap data sampel yang telah melalui proses
prapengolahan citra akan dilakukan ekstraksi fitur. Ekstraksi pertama dilakukan
menggunakan metode zoning dan selanjutnya untuk citra yang sama akan diekstraksi
lagi menggunakan metode diagonal based feature extraction. Hasil ekstraksi dari
kedua metode tersebut akan digabungkan untuk mendapatkan nilai fitur untuk proses
pengklasifikasian.

Metode ekstraksi zoning dan diagonal based feature extraction masing-masing


telah digunakan untuk pengenalan tulisan tangan oleh Khairunnisa (2012) dan Pradeep

et. al (2011). Khairunnisa (2012) mendapatkan tingkat pengenalan 83,85%


menggunakan metode zoning dan Pradeep et. al (2011) mendapatkan tingkat
pengenalan 98,5% menggunakan metode diagonal based feature extraction.

Kemampuan kombinasi metode zoning dan diagonal based feature extraction


diuji untuk mengenali angka tulisan tangan secara offline menggunakan jaringan saraf
tiruan propagasi balik. Penggunaan kombinasi metode zoning dan diagonal based
feature extraction diharapkan dapat menambah tingkat pengenalan angka tulisan
tangan daripada menggunakan metode zoning saja dan metode diagonal based feature
extraction saja.

1.2 Rumusan Masalah

Dari latar belakang di atas, penggunaan satu metode ekstraksi saja belum mampu
menghasilkan nilai fitur yang mampu mencapai tingkat pengenalan 100%. Oleh
karena itu rumusan masalah pada penelitian ini adalah bagaimana memperbaiki nilai
fitur untuk masukan jaringan propagasi balik pada pengenalan angka tulisan tangan
dengan mengkombinasikan metode zoning dan diagonal based feature extraction.

1.3 Batasan Masalah

Batasan masalah pada penelitian ini adalah:


1.

Ukuran citra untuk diekstrak adalah 60x90 piksel dan dibagi menjadi 6 kolom dan
9 baris zona dengan ukuran setiap zona adalah 10x10 piksel (Pradeep et. al,
2011).

2.

Arsitektur dan parameter jaringan dibangun berdasarkan jaringan yang digunakan


oleh Khairunnisa (2012).

3.

Penulisan angka dilakukan menggunakan alat tulis dengan tinta cair warna hitam.

4.

Angka tulisan tangan diasumsikan tegak, tidak ditulis miring.

5.

Angka yang dikenali adalah angka Latin (0-9).

1.4 Tujuan Penelitian

Tujuan dari penelitian ini adalah menambah tingkat pengenalan angka tulisan tangan
pada jaringan propagasi balik dengan memperbaiki nilai fitur untuk lapis masukan
jaringan menggunakan kombinasi metode zoning dan diagonal based feature
extraction.

1.5 Manfaat Penelitian

Manfaat yang dapat diperoleh dari penelitian ini adalah:


1.

Mengetahui kemampuan kombinasi metode zoning dan diagonal based feature


extraction pada jaringan propagasi balik untuk pengenalan angka tulisan tangan.

2.

Menambah pemahaman penulis tentang penggunaan metode zoning dan diagonal


based feature extraction pada jaringan propagasi balik untuk pengenalan angka
tulisan tangan.

3.

Sebagai referensi untuk penelitian lain yang membahas metode ekstraksi zoning
dan diagonal based feature extraction.

1.6 Metodologi Penelitian

Metodologi penelitian yang digunakan pada penelitian ini adalah:


a. Studi Literatur
Pada tahap ini dilakukan studi kepustakaan yaitu proses pengumpulan bahanbahan referensi yang berkaitan dengan ekstraksi fitur, metode zoning, metode
diagonal based feature extraction, jaringan saraf tiruan propagasi balik dan
pengenalan angka tulisan tangan dari buku, artikel, paper, jurnal, makalah dan
sumber lainnya.
b. Analisis
Pada tahap ini dilakukan analisis penggunaan metode zoning dan diagonal based
feature extraction pada jaringan propagasi balik untuk pengenalan angka tulisan
tangan.

c. Perancangan
Pada tahap ini dilakukan perancangan proses pengenalan angka tulisan tangan,
seperti arsitektur jaringan dan flowchart.
d. Implementasi
Pada tahap ini dilakukan implementasi analisis yang telah dilakukan ke dalam
kode program.
e. Pengujian
Pada tahap ini dilakukan pengujian kemampuan kombinasi metode zoning dan
diagonal based feature extraction pada jaringan propagasi balik untuk pengenalan
angka tulisan tangan.
f. Penyusunan Laporan
Pada tahap ini dilakukan penulisan laporan mengenai seluruh penelitian yang
telah dilakukan.

1.7 Sistematika Penulisan

Sistematika penulisan dari skripsi ini terdiri dari lima bagian utama sebagai berikut:

BAB 1 PENDAHULUAN
Bab ini berisi latar belakang, rumusan masalah, batasan masalah, tujuan penelitian,
manfaat penelitian, metodologi penelitian, dan sistematika penulisan.

BAB 2: LANDASAN TEORI


Bab ini berisi teori-teori yang digunakan untuk memahami permasalahan yang dibahas
pada penelitian ini. Pada bab ini dijelaskan tentang ekstraksi fitur, metode zoning
metode diagonal based feature extraction, jaringan saraf tiruan, algoritma propagasi
balik, dan pengolahan citra digital.
BAB 3: ANALISIS DAN PERANCANGAN
Bab ini berisi analisis dan penerapan metode zoning, diagonal based feature
extraction pada jaringan propagasi balik untuk pengenalan angka tulisan tangan, serta
perancangan seperti pemodelan dan flowchart.

BAB 4: IMPLEMENTASI DAN PENGUJIAN


Bab ini berisi pembahasan tentang implementasi dari analisis dan perancangan yang
disusun pada Bab 3 dan pengujian apakah hasil yang didapatkan sesuai dengan yang
diharapkan.

BAB 5: KESIMPULAN DAN SARAN


Bab ini berisi kesimpulan dari keseluruhan uraian bab-bab sebelumnya dan saransaran yang diajukan untuk pengembangan selanjutnya.

BAB 2

LANDASAN TEORI

2.1 Citra

Secara harafiah, citra (image) adalah gambar pada bidang dwimatra (dua dimensi).
Ditinjau dari sudut pandang matematis, citra merupakan fungsi menerus (continue)
dari intensitas cahaya pada bidang dwimatra (Munir, 2004). Sumber

cahaya

menerangi objek, objek kembali memantulkan kembali sebagian dari berkas cahaya
tersebut. Pantulan cahaya ini ditangkap oleh alat-alat optik, misalnya mata pada
manusia, kamera, pemindai (scanner) dan sebagainya, sehingga bayangan objek yang
disebut citra tersebut terekam.

Citra digital adalah representasi visual dari suatu objek setelah mengalami
berbagai transformasi data dari beragai bentuk rangkaian numerik. Citra digital dapat
diklasifikasikan menjadi beberapa jenis:
1. Citra Biner
Citra biner (binary image) adalah citra yang hanya mempunyai dua nilai derajat
keabuan: hitam dan putih. Piksel-piksel objek bernilai 1 dan piksel-piksel latar
belakang bernilai 0. Pada waktu menampilkan citra, 0 adalah warna putih dan 1
adalah warna hitam.

Untuk mengubah citra grayscale menjadi citra biner, ,proses yang dilakukan
adalah mengubah kuantisasi citra dengan cara pengambangan secara global
(global image thresholding). Setiap piksel di dalam citra dipetakan ke dalam dua
nilai, 1 atau 0. Dengan fungsi pengambangan:
(

2. Citra Keabuan (Grayscale)


Citra keabuan adalah citra yang setiap pikselnya mengandung satu layer di mana
nilai intensitasnya berada pada interval 0(hitam) - 255(putih). Untuk menghitung
citra grayscale (keabuan) digunakan rumus:
(

dengan I(x,y) adalah level keabuan pada suatu koordinat yang diperoleh dengan
mengatur warna R (merah), G (hijau), B (biru) yang ditunjukkan oleh nilai
parameter , dan . Secara umum nilai , dan adalah 0.33. Nilai yang lain
juga dapat diberikan untuk ketiga parameter tersbut asalkan total keseluruhannya
adalah 1 (Putra, 2009).
3. Citra Warna
Citra warna adalah citra digital yang memiliki informasi warna pada setiap
pikselnya. Sistem pewarnaan citra warna ada beberapa macam seperti RGB,
CMYK, HSV, dll.

2.2 Pengolahan Citra

Pengolahan citra adalah pemrosesan atau usaha untuk melakukan transformasi suatu
citra/gambar menjadi citra lain dengan menggunakan teknik tertentu.

2.2.1 Pemotongan Citra (Crop)

Proses pemotongan adalah memotong citra sesuai batasan objek, yaitu batas atas,
batas bawah, batas kanan dan batas kiri. Proses ini menghilangkat area latar belakang
yang berada di luar batasan objek citra.

2.2.2 Pengurangan Derau (Noise Reduction)

Proses pengurangan derau adalah mengurangi derau yang dapat mengganggu dan
mengurangi kualitas hasil proses prapengolahan citra. Pada penelitian ini teknik

pengurangan derau yang digunakan adalah median filter. Median filter adalah filter
tipe low-pass. Teknik ini memroses area dari citra dengan ukuran (3x3, 5x5, 7x7, dll),
memeriksa nilai piksel pada area tersebut dan menggantinya dengan nilai mediannya
(Phillips, 2000). Algoritma pengurangan derau menggunakan median filter adalah
sebagai berikut :

1.

Input gambar (m x n) pixel.

2.

Alokasikan sebuah matriks dengan ukuran (m+2 x n+2) dengan nilai 0


disekelilingnya.

3.

Salin matriks input ke matriks pra-alokasi.

4.

Bentuk mariks window (3 x 3) dengan element dari matriks input

5.

Salin matriks window (3 x 3) ke dalam array dan urutkan.

6.

Cari median dari elemen array tersebut. (Total dari elemen array adalah 9 jadi
median adalah elemen ke 5).

7.

Letakkan element ke 5 ke matriks output.

8.

Ulangi prosedur untuk seleuruh matriks input.

2.2.3 Normalisasi

Normalisasi adalah proses mengubah ukuran citra, baik menambah atau mengurangi,
menjadi ukuran yang ditentukan tanpa menghilangkan informasi penting dari citra
tersebut (Sharma et. al, 2012). Dengan adanya proses normalisasi maka ukuran semua
citra yang akan diproses menjadi seragam.

2.2.4 Thinning

Thinning adalah proses pengurangan data yang mengikis (erode) sebuah objek hingga
menjadi ukuran 1 piksel dan menghasilkan kerangka (skeleton) dari objek tersebut.
Objek seperti huruf atau silhouettes dapat lebih mudah dikenali dengan melihat
kepada kerangkanya saja (Phillips, 2000). Pada penelitian ini digunakan algoritma
thinning Zhang-Suen.

10

Algoritma ini adalah algoritma untuk citra biner, dimana piksel background
citra bernilai 0, dan piksel foreground (region) bernilai 1. Algoritma ini cocok
digunakan untuk bentuk yang diperpanjang (elongated) dan dalam aplikasi OCR
(Optical Character Recognition). Algoritma ini terdiri dari beberapa penelusuran,
dimana setiap penelusurannya terdiri dari 2 langkah dasar yang diaplikasikan terhadap
titik yang pikselnya bernilai 1, dan memiliki paling sedikit 1 piksel dari 8-tetangganya
yang bernilai 0.

Gambar 2.1 mengilustrasikan titik objek P1 dan 8-tetangganya:

Gambar 2.1 Piksel P1 dengan 8 tetangga

Langkah pertama dari sebuah penelusuran adalah menandai semua titik objek
untuk dihapus, jika titik objek tersebut memenuhi syarat-syarat berikut:
a. 2 N (P1) 6
b. S(P1) = 1
c. P2 * P4 * P6 = 0
d. P4 * P6 * P8 = 0

Keterangan :
1.

Jumlah dari tetangga titik objek P1, yang pikselnya bernilai 1, yaitu:
N(P1) = P2 + P3 + P4 + + P9

2.

S(P1) adalah jumlah perpindahan nilai nilai dari 0 (nol) ke 1 (satu) mulai dari P2,
P3, , P8, P9.

3.

P2 * P4 * P6 = 0, memiliki arti P2 atau P4 atau P6 bernilai 0 (nol).

Dan pada langkah kedua, kondisi (a) dan (b) sama dengan langkah pertama,
sedangkan kondisi (c) dan (d) diubah menjadi:

11

(c) P2 * P4 * P8 = 0
(d) P2 * P6 * P8 = 0

2.3 Ekstraksi Fitur

Ekstraksi fitur adalah proses pengukuran terhadap data yang telah dinormalisasi untuk
membentuk sebuah nilai fitur. Nilai fitur digunakan oleh pengklasifikasi untuk
mengenali

unit

masukan

dengan

unit

target

keluaran

dan

memudahkan

pengklasifikasian karena nilai ini mudah untuk dibedakan (Pradeep et. al, 2011).

Secara luas, fitur adalah semua hasil pengukuran yang bisa diperoleh. Fitur
juga bisa menggambarkan karakteristik objek yang dipantau (Putra, 2009). Contoh
dari fitur level rendah adalah intensitas sinyal. Fitur bisa berupa simbol, numerik atau
keduanya. Contoh dari fitur simbol adalah warna. Contoh dari fitur numerik adalah
berat. Fitur bisa diperoleh dengan mengaplikasikan algoritma pencari fitur pada data
masukan. Fitur dapat dinyatakan dengan variabel kontinu, diskret atau diskret-biner.
Fitur biner dapat digunakan untuk menyatakan ada tidaknya suatu fitur tertentu.

Fitur yang baik memiliki syarat berikut, yaitu mudah dalam komputasi,
memiliki tingkat keberhasilan yang tinggi dan besarnya data dapat diperkecil tanpa
menghilangkan informasi penting (Putra, 2009).

Ekstraksi fitur dapat dilakukan pada berbagai representasi citra seperti pada
tabel 2.1.

Tabel 2.1 Ekstraksi fitur pada representasi citra yang berbeda (Jain dan Taxt,
1996)
Grayscale subimage

Binary

Vector (Skeleton)

Solid character

Outer countour

Template matching

Template matching

Template matching

Deformable templates

Deformable templates

Unitary transforms

Unitary transforms

Graph decription

12

Projection histograms

Countour Profile

Discrete features

Zoning

Zoning

Zoning

Zoning

Geometric moments

Geometric moments

Spline curve

Zernike moments

Zernike moments

Fourier decriptors

Fourier decriptors

2.3.1 Zoning

Zoning adalah salah satu ekstraksi fitur yang paling popular dan sederhana untuk
diimplementasikan (Sharma et. al, 2012). Sistem optical character recognition (OCR)
komersil yang dikembangkan oleh CALERA menggunakan metode zoning pada citra
biner (Bosker, 1992). Setiap citra dibagi menjadi NxM zona dan dari setiap zona
tersebut dihitung nilai fitur sehingga didapatkan fitur dengan panjang NxM. Salah satu
cara menghitung nilai fitur setiap zona adalah dengan menghitung jumlah piksel hitam
setiap zona dan membaginya dengan jumlah piksel hitam terbanyak pada yang
terdapat pada salah satu zona. Contoh pembagian zona pada citra biner dapat dilihat
pada gambar 2.2.

Gambar 2.2 Pembagian zona pada citra biner (Jain dan Taxt, 1996)

2.3.2 Diagonal Based Feature Extraction

Pradeep et. al (2011) menggunakan diagonal based feature extraction untuk


mendapatkan input untuk pengenalan karakter tulisan tangan. Cara kerja ekstraksi
fitur tersebut adalah sebagai berikut :
1.

Setiap karakter image dengan ukuran 90x60 piksel (Gambar 2.3) dibagi menjadi
54 zona, setiap zona berukuran 10x10 piksel (Gambar 2.4).

2.

Untuk setiap zona :

13

a.

Hitung histogram secara diagonal untuk mendapatkan 19 subfitur (Gambar


2.5).

b.

Hitung rata-rata dari 19 subfitur tersebut dan nilai tersebut digunakan untuk
mewakili setiap zona.

3.

Dari nilai setiap zona, hitung rata-rata masing-masing baris dan masing-masing
kolom. Sehingga didapatkan 9 nilai baris dan 6 nilai kolom.

4.

54 fitur + 15 fitur menjadi nilai masukan untuk jaringan saraf tiruan.

Gambar 2.3 Karakter ukuran 60x90 piksel (Pradeep et. al, 2011)

Gambar 2.4 Pembagian zona ekstraksi fitur (Pradeep et. al, 2011)

14

Gambar 2.5 Diagonal histogram setiap zona (Pradeep et. al, 2011)

2.4 Jaringan Saraf Tiruan

Jaringan Saraf Tiruan adalah jaringan komputasional yang mensimulasikan jaringan


sel saraf (neuron) dari pusat sistem saraf makhluk hidup (manusia atau hewan)
(Graupe, 2007). Jaringan saraf tiruan pertama kali didesain oleh Warren Mc-Culloh
dan Walter Pitts pada tahun 1943. Mc Cullah-Pitts menemukan bahwa dengan
mengkombinasikan banyak neuron sederhana sehingga menjadi sebuah sistem saraf
merupakan peningkatan tenaga komputasional.

Jaringan saraf tiruan disusun dengan asumsi yang sama seperti jaringan saraf
biologi (Puspitaningrum, 2006):
1.

Pengolahan informasi terjadi pada elemen-elemen pemrosesan (neuron).

2.

Sinyal antara dua buah neuron diteruskan melalui link-link koneksi.

3.

Setiap link koneksi memiliki bobot terasosiasi.

4.

Setiap neuron menerapkan sebuah fungsi aktivasi terhadap input jaringan (jumlah
sinyal input berbobot). Tujuannya adalah untuk menentukan sinyal output.

15

2.4.1 Komponen Jaringan Saraf Tiruan

Jaringan saraf tiruan terdiri dari banyak neuron yang menyusun jaringan tersebut.
Neuron-neuron tersebut dikelompokkan ke dalam beberapa lapisan (layer) dan
lapisan-lapisan tersebut memiliki hubungan satu sama lain.

Lapisan-lapisan penyusun jaringan saraf tiruan dapat dibagi menjadi 3, yaitu:


1.

Lapisan input
Pada lapisan ini neuron-neuron akan menerima input yang selanjutnya diproses
untuk dikirimkan ke lapisan selanjutnya.

2.

Lapisan tersembunyi
Lapisan ini berada di antara lapisan input dan lapisan output. Pada lapisan ini
bobot yang diterima dari lapisan input diproses untuk selanjutnya diproses untuk
dikirimkan ke lapisan selanjutnya. Output dari lapisan ini tidak secara langsung
dapat diamati.

3.

Lapisan output
Lapisan ini merupakan lapisan akhir dimana nilai output dihasilkan. Pada lapisan
ini ditetapkan nilai output aktual untuk dibandingkan dengan nilai output target
untuk mengetahui apakah jaringan sudah sesuai dengan hasil yang diinginkan.

2.5 Algoritma Propagasi Balik

Algoritma propagasi balik (Back Propagation) pertama dikembangkan pada tahun


1986 oleh Rumelhart, Hinton dan Williams untuk menentukan bobot dan digunakan
untuk pelatihan perceptron multi lapis (Graupe, 2007). Metode propagasi balik
merupakan metode yang sangat baik dalam menangani masalah pengelanan pola-pola
kompleks. Metode ini merupakan metode jaringan saraf tiruan yang populeer.
Beberapa contoh aplikasi yang melibatkan metode ini adalah pengompresian data,
pendeteksian virus komputer, pengidentifikasian objek, sintesis suara dari teks, dan
lain lain (Puspitaningrum, 2006).

16

Istilah propagasi balik diambil dari cara kerja jaringan ini, yaitu bahwa
gradient error unit-unit tersembunyi diturunkan dari penyiaran kembali error-error
yang diasosiasikan dengan unit-unit output. Hal ini karena nilai target untuk unit-unti
tersembunyi tidak diberikan (Puspitaningrum, 2006). Propagasi balik adalah metode
pembelajaran terawasi (supervised learning). Metode ini membutuhkan nilai yang
sudah ditentukan sebelumnya untuk mendapatkan output yang diinginkan pada proses
pembelajaran. Contoh jaringan propagasi balik dengan satu buah lapisan tersembunyi
dapat dilihat pada gambar 2.6.

Gambar 2.6 Jaringan propagasi balik dengan satu buah lapisan tersembunyi
(Puspitaningrum, 2006)

Algoritma propagasi balik dapat dibagi ke dalam 2 bagian (Puspitaningrum,


2006):
1.

Algoritma pelatihan
Terdiri dari 3 tahap: tahap umpan maju pola pelatihan input, tahap pemropagasian
error, dan tahap pengaturan bobot.

2.

Algoritma aplikasi
Yang digunakan hanyalah tahap umpan maju saja.

17

Algoritma Pelatihan
1.

Inisialisasi bobot-bobot.
Tentukan angka pembelajaran ().
Tentukan pula nilai toleransi error atau nilai ambang (bila menggunakan nilai
ambang sebagai kondisi berhenti); atau set maksimal epoch (bila menggunakan
banyaknya epoch sebagai kondisi berhenti).

2.

While kondisi berhenti tidak terpenuhi do langkah ke-2 sampai langkah ke-9.

3.

Untuk setiap pasangan pola pelatihan, lakukan langkah ke-3 sampai langkah ke-8.

Tahap Umpan Maju


4.

Setiap unit input xi (dari unit ke-1 sampai unit ke-n pada lapisan input)
mengirimkan sinyal input ke smua unit yang ada di lapisan atasnya (ke lapisan
tersembunyi)

5.

Pada setiap unit di lapisan tersembunyi zj (dari unit ke-1 sampai unit ke-p;
i=i,,n; j=1,...,p) sinyal output lapisan tersembunyinya dihitung dengan
menerapkan fungsi aktivasi terhadap penjumlahan sinyal-sinyal input berbobot xi:
(

kemudian dikirim ke semua unit di lapisan atasnya.


6.

Setiap unit di lapisan output yk (dari unit ke-1 sampai unit ke-m; i=1,...,n;
k=1,,m) dihitung sinyal outputnya dengan menerapkan fungsi aktivasi terhadap
penjumlahan sinyal-sinyal input berbobot zj bagi lapisan ini:
(

Tahap Pemropagasibalikan Error


7.

Setiap unit output yk (dari unit ke-1 sampai unit ke-m; i=1,,p; k=1,.,m)
menerima pol target tk lalu informasi kesalahan lapisan output (k) dihitung. k
dikirim ke lapisan di bawahnya dan digunakan untuk mengitung besar koreksi
bobot dan bias (wjk dan w0k) antara lapisan tersembunyi dengan lapisan output:
(

) (

18

wjk = k zj
w0k = k
8.

Pada setiap unit di lapisan tersembunyi (dari unit ke-1 sampai unit ke-p; i=1,,n;
j=1,,p; k=1,,m) dilakukan perhitungan informasi kesalahan lapisan
tersembunyi (j). j kemudian digunakan untuk menghitung besar koreksi bobot
dan bias (wjk dan w0k) antara lapisan input dan lapisan tersembunyi.
(

)) (

vij = j xi
v0j = j
Tahap Peng-update-an Bobot dan Bias
9.

Pada setiap unit output yk (dari unit ke-1 sampai unit ke-m) dilakukan pengupdate-an bias dan bobot (j=0,,p; k=1,,m) sehingga bias dan bobot baru
menjadi:
wjk (baru) = wjk (lama) + wjk
Dari unit ke-1 sampai unit ke-p di lapisan tersembunyi juga dilakukan pengupdate-an pada bias dan bobotnya (i=0,,n; j=1,,p):
vij (baru) = vij (lama) + vij

10. Tes kondisi berhenti.

Algoritma Aplikasi
0.

Inisialisasi bobot. Bobot ini diambil dari bobot-bobot terakhir yang diperoleh dari
algoritma pelatihan.

1.

Untuk seitap vektor input, lakukanlah langkah ke-2 sampai ke-4.

2.

Setiap unit input xi (dari unit ke-1 sampai unit ke-n pada lapisan input; i=1,,n)
menerima sinyal input pengujian xi dan menyiarkan sinyal xi ke semua unikt pada
lapisan di atasnya (unit-unit tersembunyi).

3.

Setiap unit di lapisaan tersembunyi zj (dari unit ke-1 sampai unit ke-p; i=1,,n;
j=1,.,p) menghitung sinyal outputnya dengan menerapkan fungsi aktivasi
terhadap penjumlahan sinyal-sinyal input xi. Sinyal output dari lapisan
tersembunyi kemudian dikirim ke semua unit pada lapisan di atasnya:

19

(
4.

Setiap unit output yk (dari unit ke-1 sampai unit ke-m; j=1,,p; k=1,,m)
menghitung sinyal outputnya dengan menerapkan fungsi aktivasi terhadap
penjumlahan sinyal-sinyal input bagi lapisan ini, yaitu sinyal-sinyal input zj dari
lapisan tersembunyi:
(

2.5.1 Fungsi Aktivasi

Pilihan fungsi aktivasi yang dapat digunakan pada metode propagasi balik yaitu fungsi
sigmoid biner, sigmoid bipolar dan tangent hiperbolik. Karakteristiki yang harus
imiliki fungsi aktivasi tersebut adalah kontinu, diferensiabel dan tidak menurun secara
monoton. Fungsi aktivasi diharapkan jenuh (mendekati nilai-nilai maksimum dan
minimum secara asimtot) (Puspitaningrum, 2006).

2.5.1.1 Fungsi Sigmoid Biner

Fungsi ini merupakan fungsi yang umum digunakan. Rentang-nya adalah (0,1) dan
didefenisikan sebagai :
( )
dengan turunan :
( )

( )(

( ))

Fungsi sigmoid biner diilustrasikan pada gambar 2.7.

20

Gambar 2.7 Fungsi sigmoid biner dengan rentang (0,1)

2.5.2 Inisialisasi Bobot dan Bias

Cepat atau tidaknya pembelajaran pada pelatihan jaringan propagasi balik salah
satunya dipengaruhi oleh nilai bobot antar neuron dan nilai bias. Semakin baik
inisialisasi bobot dan bias semakin cepat pula pembelajaran jaringan propagasi balik.
Bobot dan bias pada jaringan propagasi balik dapat dinisialisasi dengan berbagai cara
seperti inisialisasi acak, nguyen-widrow dan lain-lain.

2.5.2.1 Inisialisasi Acak

Prosedur yang umum dilakukan adalah menginisialisasi bias dan bobot, baik dari unit
input ke unit tersembunyi maupun dari unit tersembunyi ke unit output secara acak
dalam sebuah interval tertentu (- dan ), misalnya antara -0.4 sampai 0.4, -0.5 sampai
0.5, dan -1 sampai 1 (Puspitaningrum, 2006).

2.5.2.2 Inisialisasi Nguyen Widrow

Waktu pembelajaran jaringan propagasi balik yang bobot dan biasnya diinisalisasi
dengan inisialisasi Nguyen-Widrow lebih cepat dibandingkan bila diinisialisasi
dengan inisialisasi acak. Pada inisialisasi Nguyen-Widrow, inisialisasi acak tetap
terpakai tetapi digunakan untuk menginisialisasi bias dan bobot dari unit tersembunyi

21

ke unit output saja. Untuk bias dan bobot dari unit-unit input ke unit-unit tersembuyi
digunakan bias dan bobot yang khusus diskala agar jatuh pada range tertentu. Dengan
penskalaan maka diharapkan kemampuan belajar dari unit-unit tersembunyi dapat
meningkat.
Faktor skala Nguyen-Widrow () didefenisikan sebagai :
( )

di mana :
n = banyak unit input
p = banyak unit tersembunyi
= faktor skala

Prosedur inisialisasi Nguyen-Widrow


Untuk setiap unit tersembunyi dari unit ke-1 sampai unit ke-p :
1. Inisialisasi vektor bobot dari unit-unit input ke unit-unit tersembunyi (j = 1, , p)
dengan cara :
a. Menentukan bobot-bobot antara unit input ke unit tersembunyi (vij) :
vij(lama) = bilangan acak antara - dan
di mana i = 1, , n.
b. Menghitung || vij ||.
c. Menginisialisasi kembali vij :
(

2. Menentukan bias antara unit input ke unit tersembuni (j = 1, , p). voj diset
dengan bilangan acak yang terletak pada skala antara - dan .

2.5.3 Pengupdate Bobot dengan Momentum

Penambahan parameter momentum dalam mengupdate bobot seringkali bisa


mempercepat proses pelatihan. Ini disebabkan karena momentum memkasa proses
perubahan bobot terus bergerak sehingga tidak terperangkap dalam minimumminimum lokal. Pengupdatean bobot pada proses pelatihan jaringan yang biasa adalah
sebagai berikut :

22

wjk = k zj
vij = jxi
Jika error tidak terjadi (output actual telah sama dengan output target) maka k
menjadi nol dan hal ini akan menyebabkan koreksi bobot wjk = 0, atau dengan kata
lain pengupdatean bobot berlanjut dalam arah yang sama seperti sebelumnya.

Jika

parameter

momentum

digunakan

maka

persamaan-persamaan

pengupdatean bobot dengan langkah pelatihan t, dan t+1 untuk langkah pelatihan
selajutnya, mengalami modifikasi sebagai berikut :
wjk(t + 1) = k zj + wjk(t)
vij(t + 1) = j xi + vij(t)
dengan adalah parameter momentum dalam range antara 0 sampai 1.

BAB 3

ANALISIS DAN PERANCANGAN

Ekstraksi fitur adalah salah satu tahap penting pada optical character recognition
(OCR). Ekstraksi fitur dilakukan untuk mendapatkan nilai fitur yang mewakili
karakter yang akan dikenali. Satu metode ekstraksi fitur dapat digunakan untuk
mendapatkan nilai fitur, tetapi pada penelitian ini dua metode ekstraksi fitur, yaitu
metode zoning dan diagonal based feature extraction, dikombinasikan untuk
mendapatkan nilai fitur yang diharapkan dapat mewakili karakter dengan lebih baik
dan meningkatkan tingkat pengenalan daripada menggunakan salah satu metode saja.
Pada penelitian ini, kombinasi kedua metode tersebut diujikan pada pengenalan angka
tulisan tangan menggunakan jaringan propagasi balik. Secara umum skema dasar
tahap-tahap pengenalan angka tulisan tangan yang dibangun dapat dilihat pada gambar
3.1.

24

Akuisisi Citra

Ekstraksi fitur

Prapengolahan
Citra

Ekstraksi Fitur
Zoning

Ekstraksi Fitur
DBFE

Nilai Fitur

Klasifikasi JST

Keluaran

Gambar 3.1 Skema Dasar Pengenalan Angka Tulisan Tangan

Tahap pertama adalah akuisisi data, yaitu membaca citra angka tulisan tangan
yang telah dikumpulkan dan dipindai. Pada setiap citra angka tulisan tangan dilakukan
tahap prapengolahan citra. Pada tahap ini citra angka tulisan tangan akan diolah
menjadi citra yang seragam dan sesuai untuk tahap selanjutnya. Tahap selanjutnya
adalah ekstraksi fitur dari setiap citra. Pada penelitian ini digunakan kombinasi dua
metode ekstraksi fitur, yaitu metode zoning dan diagonal based feature extraction.
Nilai fitur yang didapatkan dari kedua metode tersebut kemudian digabungkan dan
digunakan sebagai masukan jaringan propagasi balik. Tahap selanjutnya adalah tahap
klasifikasi menggunakan jaringan propagasi balik. Tahap ini terdiri dari proses
pelatihan dan proses pengujian. Setelah itu akan didapatkan keluaran dari proses
klasifikasi, baik itu hasil pelatihan atau hasil pengujian.

Tahap-tahap pengenalan angka tulisan tangan tersebut akan dijelaskan pada


bab selanjutnya menjadi tiga bagian, yaitu sebelum eksraksi fitur, ekstraksi fitur dan
setelah ekstraksi fitur.

25

3.1 Tahap Sebelum Ekstraksi Fitur

Tahap sebelum ekstraksi fitur terdiri dari akuisisi data dan prapengolahan citra. Pada
tahap ini dilakukan persiapan data sampel agar dapat digunakan untuk ekstraksi fitur.
Ekstraksi fitur tidak dapat dilakukan sebelum tahap ini diselesaikan.

3.1.1 Akuisisi Data

Data sampel yang digunakan adalah angka tulisan tangan yang dibubuhkan pada
kertas putih menggunakan pena tinta cair warna hitam. Data sampel dikumpulkan dari
36 mahasiswa Teknologi Informasi USU. Masing-masing menuliskan angka dari 0
sampai 9. Angka yang dituliskan diasumsikan tegak, yaitu memiliki perbedaan derajat
rotasi penulisan yang hampir sama. Hal ini dilakukan karena pada penelitian ini tidak
dibahas prapengolahan citra untuk objek yang mengalami rotasi atau miring.
Penggunaan pena dengan tinta cair dilakukan supaya angka yang dituliskan memiliki
ketebalan warna yang baik. Perbedaan penulisan menggunakan pena tinta cair dengan
tinta biasa dapat dilihat pada gambar 3.2.

Gambar 3.2 Tulisan menggunakan tinta cair (kiri) dan tinta biasa (kanan)

Setelah data sampel dikumpulkan, kemudian dipindai menggunakan scanner.


Citra hasil pemindaian disimpan dengan format bitmap (.bmp). Setiap angka tulisan
tangan disimpan pada file citra yang berbeda. Ukuran setiap citra yang disimpan tidak
ditentukan, karena akan diolah pada tahap prapengolahan.

26

Total seluruh data sampel adalah 360 angka tulisan tangan. Dari total data
tersebut, dibagi penggunaannya untuk data pelatihan dan data pengujian. Banyaknya
data pelatihan adalah 260 angka tulisan tangan (26 pola), dan banyaknya data
pengujian adalah 100 angka tulisan tangan (10 pola) baru yang tidak dilatihkan. Data
sampel yang digunakan pada penelitian ini dapat dilihat pada lampiran B.

3.1.2 Prapengolahan Citra

Tahapan proses pengolahan citra dapat dilihat pada gambar 3.3.

Grayscaling

Noise Reduction

Thresholding

Filling

Cropping

Normalization

Thinning

Gambar 3.3 Tahapan Prapengolahan Citra

Pengolahan citra dimulai dengan mengubah citra warna (RGB) menjadi citra
grayscale, kemudian dilakukan pengurangan derau pada citra tersebut, selanjutnya
dilakukan proses thresholding untuk mendapatkan citra biner. Tahap selanjutnya
adalah proses filling untuk mengubah piksel putih yang dikelilingi oleh beberapa
piksel hitam menjadi hitam dan kemudian akan dipotong dan dinormalisasi menjadi
ukuran 60x90 piksel. Citra yang sudah dinormalisasi kemudian dithinning untuk

27

mendapatkan kerangka dari objek angka. Citra hasil thinning ini adalah citra yang
dapat digunakan pada tahap ekstraksi fitur. Tahap-tahap prapengolahan citra
dijelaskan pada bab selanjutnya.

3.1.2.1 Pembentukan Citra Keabuan (Grayscaling)

Tahap pemrosesan citra dimulai dengan mengubah citra warna (RGB) menjadi citra
keabuan. Nilai R (merah), G (hijau) dan B (biru) dari setiap piksel dijumlahkan dan
dihitung rata-ratanya. Nilai dari proses ini adalah nilai keabuan (grayscale) 8 bit
dengan rentang 0 (hitam) - 254 (putih). Flowchart proses grayscaling dapat dilihat
pada gambar 3.4.

Start

Inisialisasi
img(RGB)
tinggi img(height)
lebar img(width)
x, y

y0

yy+1

y < tinggi

No

End

Yes
x0
No
x < lebar

xx+1

Yes
img(x, y) (R + G + B)/3

Gambar 3.4 Flowchart proses grayscaling

28

Contoh citra RGB yang diubah menjadi citra keabuan dapat dilihat pada
gambar 3.5.

Gambar 3.5 Citra hasil grayscaling

3.1.2.2 Pengurangan Derau (Noise Reduction)

Pada citra keabuan yang didapatkan dari proses grayscale kemudian dilakukan proses
pengurangan derau. Proses ini akan menghilangkan derau yang terdapat di sekitar
objek angka tulisan tangan. Teknik penghilangan derau yang digunakan pada
penelitian ini adalah median filter. Tahapan dari proses ini dapat dilihat pada sub bab
2.2.2 mengenai noise reduction. Contoh citra hasil pengurangan derau dapat dilihat
pada gambar 3.6.

Gambar 3.6 Citra hasil noise reduction

3.1.2.3 Pembentukan Citra Biner (Thresholding)

Citra keabuan yang telah melalui proses penghilangan derau kemudian akan diubah
menjadi citra biner, yaitu citra yang hanya memiliki dua nilai warna, yaitu 0 (hitam)
dan 254 (putih). Pada tahap ini ditentukan nilai threshold yang akan menjadi batasan.
Nilai threshold dimasukkan oleh pengguna sebelum proses dimulai. Pada penelitian
ini nilai threshold yang digunakan adalah 190. Nilai yang lebih kecil dari threshold

29

diubah menjadi 0 dan nilai yang lebih besar dari threshold diubah menjadi 254.
Flowchart proses thresholding dapat dilihat pada gambar 3.7.

Start

Inisialisasi
img (hasil Noise reduction)
tinggi img(height)
lebar img(width)
threshold, x, y

y0

y < tinggi

No

End

Yes
x0

yy+1

No

x < lebar

Yes

Yes

img(x, y) > threshold

img(x, y) 255

No
img(x, y) 0

xx+1

Gambar 3.7 Flowchart proses thresholding

Contoh citra keabuan yang diubah menjadi citra biner dapat dilihat pada
gambar 3.8.

30

Gambar 3.8 Citra hasil thresholding

3.1.2.4 Pengisian Piksel Putih (Filling)

Pemrosesan citra selanjutnya adalah pengisian piksel putih (filling). Pada citra hasil
threshold ada kemungkinan terdapat piksel putih yang dikelilingi oleh beberapa piksel
hitam. Pada penelitian ini, piksel putih yang dikelilingi oleh 5, 6, 7 atau 8 piksel hitam
diubah menjadi warna hitam. Hal ini dilakukan agar setelah proses thinning tidak
terjadi

tulang yang bercabang yang bertemu kembali, yang membentuk seperti

lingkaran sehingga tidak terbentuk tulang objek yang seharusnya. Flowchart proses
filling dapat dilihat pada gambar 3.9.

31

Start
img(x-1, y) = 0
img (hasil Thresholding)
tinggi img(height)
lebar img(width)
tetangga
x, y

Yes

tetangga tetangga + 1

Yes

tetangga tetangga + 1

Yes

tetangga tetangga + 1

Yes

tetangga tetangga + 1

Yes

tetangga tetangga + 1

Yes

tetangga tetangga + 1

Yes

tetangga tetangga + 1

Yes

tetangga tetangga + 1

No

img(x-1, y-1) = 0
y1
No
End

No

y < tinggi
img(x, y-1) = 0
Yes
No

x1
Yes

img(x+1, y-1) = 0
x < lebar

No

yy+1
No

Yes
tetangga 0

img(x+1, y) = 0

No

img(x, y) = 255

img(x+1, y+1) = 0

No
No

No

tetangga > 4

img(x, y+1) = 0
Yes
img(x, y) 0

No
No

xx+1
img(x-1, y+1) = 0

Gambar 3.9 Flowchart proses filling

Contoh citra hasil filling dapat dilihat pada gambar 3.10.

32

Gambar 3.10 Citra hasil filling

3.1.2.5 Pemotongan Citra (Cropping)

Pemrosesan citra selanjutnya adalah pemotongan citra (crop), yaitu menghilangkan


area putih yang tidak berisi objek angka. Citra hasil filling dipotong sesuai dengan
batasan objek angka tulisan tangan, yaitu batas atas, batas bawah, batas kanan dan
batas kiri. Dari batasan tersebut disisakan 1 piksel putih mengelilingi objek angka
tulisan tangan. Hal ini dilakukan untuk membantu proses pengurusan objek (thinning).
Flowchart proses cropping dapat dilihat pada gambar 3.11.

33

i0

Start
Yes

Inisialisasi
img (hasil Filling)
tinggi img(height)
lebar img(width)
img_temp, tinggi_temp 0,lebar_temp 0
a10, a20, b10, b20
hist_hor[img(height)] 0
hist_ver[img(width)] 0
x, y, i

No
ii+1

y0

i < tinggi

y < tinggi

No
x0
No

No

Yes

a1 i

No

i tinggi - 1

Yes

Yes

yy+1

hist_hor[i] = 0
AND
hist_hor[i+1] > 0

hist_hor[i] = 0
AND
hist_hor[i-1] > 0

ii-1

Yes

a2 i

x < lebar
i >= 0

No

i0

Yes
No
img(x, y) = 0

No

xx+1

Yes

Yes
No

hist_ver[i] = 0
AND
hist_ver[i+1] > 0

Yes

hist_hor[y]
hist_hor[y] + 1
ii+1

b1 i

x0
i < tinggi

No

i lebar - 1

x < lebar
Yes

Yes
y0

No

xx+1

No

y < tinggi

hist_ver[i] = 0
AND
hist_ver[i-1] > 0

ii-1

Yes

b2 i

Yes
i >= 0
img(x, y) = 0

No

No

yy+1

tinggi_temp b2-b1+1
lebar_temp a2-a1+1

Yes
34
hist_ver[x]
hist_ver[x] + 1

Gambar 3.11 Flowchart proses cropping

34

33

y a1

No

img.resize(b2-b1+1, a2-1+1)

y0
y <= a2

Yes

y <= tinggi_temp

No

x b1
Yes
x0
yy+1

No

x <= b2

Yes

yy+1

img(x, y) = 0

No

No

x <= lebar _temp

xx+1

Yes

Yes

img_temp(x, y) = 0

img_temp(x-b1, y-a1) 0

No

Yes

img(x, y) 255

img(x, y) 0

Gambar 3.11 Flowchart proses cropping (lanjutan)

Contoh citra biner yang dipotong dapat dilihat pada gambar 3.12.

Gambar 3.12 Citra hasil croping

End

35

3.1.2.6 Normalisasi Resolusi Citra (Normalization)

Citra hasil pemotongan (crop) memiliki resolusi yang berbeda-beda sehingga belum
dapat digunakan sebagai masukan standar untuk diekstrak. Citra tersebut harus
dinormalisasi, yaitu mengubah resolusi citra menjadi resolusi yang sesuai untuk
diekstrak yaitu 60x90 piksel. Contoh citra hasil pemotongan yang dinormalisasi dapat
dilihat pada gambar 3.13.

Gambar 3.13 Citra hasil normalisasi

3.1.2.7 Pengurusan Objek Citra (Thinning)

Proses selanjutnya adalah pengurusan objek citra, yaitu objek angka tulisan tangan
yang terdapat pada citra akan dikuruskan (thinning) hingga ketebalannya hanya 1
piksel tetapi tidak merubah informasi dan karakteristik penting dari objek tersebut.
Melalui proses pengurusan ini akan didapatkan kerangka dari objek angka tulisan
tangan. Pengenalan objek seperti huruf atau silhouette akan lebih mudah dengan
memperhatikan kerangkanya (Phillips, 2000). Aloritma thinning ada banyak yang
tersedia, pada penelitian ini akan digunakan algoritma thinning Zhang-Suen.
Algoritma Zhang-Suen menggunakan metode paralel dimana nilai baru bagi tiap-tiap
piksel dihasilkan dari nilai piksel pada iterasi sebelumnya. Tahapan dari proses ini
dapat dilihat pada sub bab 2.2.4 mengenai thinning. Contoh citra hasil thinning dapat
dilihat pada gambar 3.14.

36

Gambar 3.14 Citra hasil thinning

Citra hasil thinning ini adalah hasil akhir dari seluruh tahap prapengolahan
citra. Citra ini dapat digunakan pada tahap ekstraksi fitur.

3.2 Tahap Ekstraksi Fitur

Pada penelitian ini ekstraksi fitur dilakukan menggunakan kombinasi metode zoning
dan diagonal based feature extraction. Kedua metode tersebut akan dilakukan secara
berurutan, pertama zoning dan kedua diagonal based feature extraction (DBFE). Nilai
fitur yang didapatkan dari kedua metode tersebut akan digabungkan, yaitu
menyambung nilai fitur yang didapatkan dari metode zoning dengan diagonal based
feature extraction. Nilai fitur dari kedua metode tersebut disimpan pada satu matrik
yang sama. Nilai fitur yang didapatkan dari metode zoning disimpan dari indeks 0
sampai indeks n dan nilai fitur yang didapatkan dari metode diagonal based feature
extraction disimpan dari index n+1 sampai indeks m. Matrik nilai fitur dapat dilihat
pada gambar 3.15.

..
Zoning

n+1

..
Diagonal based feature extraction

Gambar 3.15 Matrik penyimpanan nilai fitur

37

Setelah dilakukan tahap prapengolahan citra didapatkan data sampel yang


seragam. Ukuran data sampel hasil prapengolahan citra adalah 60x90 piksel. Ukuran
ini mengikuti ukuran yang digunakan oleh Pradeep et. al (2011). Pada penelitian yang
mereka lakukan, setiap data sampel dibagi menjadi zona-zona dengan ukuran 10x10
piksel. Dari pembagian zona tersebut didapatkan 6 kolom dan 9 baris zona. Jumlah
zona adalah sebanyak 54 zona seperti pada gambar 3.16.

Gambar 3.16 Pembagian zona menjadi 6 kolom dan 9 baris

Dari setiap zona tersebut akan diproses untuk mendapatkan nilai fitur.
Pembagian zona yang sama juga dilakukan pada penelitian ini terhadap kombinasi
metode ekstraksi yang digunakan.

Proses ekstraksi fitur menggunakan kombinasi metode zoning dan diagonal


based feature extraction dapat dijelaskan melalui diagram pada gambar 3.17.

38

Bagi citra menjadi


6 kolom dan 9 baris zona
dengan ukuran setiap zona
10x10 piksel

Hitung jumlah piksel


hitam setiap zona

Hitung histogram
diagonal setiap zona

Cari jumlah piksel


hitam tertinggi

Hitung rata-rata
histogram diagonal
setiap zona

Nilai fitur setiap zona


= jumlah piksel zona /
jumlah piksel hitam
tertinggi

Hitung rata-rata zona


per baris

Hitung rata-rata zona


per kolom

Nilai fitur = nilai zona, rata-rata histogram zona, rata-rata zona per baris, rata-rata zona per kolom

Gambar 3.17 Diagram ekstraksi fitur

Dari diagram di atas, proses sebelah kiri adalah metode zoning dan proses
sebelah kanan adalah metode diagonal based feature extraction. Kedua metode
ekstraksi tersebut dijelaskan pada bab berikut.

3.2.1 Metode Ekstraksi Zoning

Metode zoning terdiri dari tiga proses, yaitu :


1.

Hitung jumlah piksel hitam setiap zona dari Z1 sampai Z54.


Misalkan, Z1 = 5, Z10 = 10 dan Z15 = 3.

2.

Tentukan zona yang memiliki jumlah piksel hitam paling tinggi.


Misalkan dari contoh tahap 1, zona yang memiliki jumlah piksel paling tinggi
adalah Z10, yaitu 10 piksel.

3.

Hitung nilai fitur setiap zona dari Z1 sampai Z54.


Yaitu menggunakan rumus :

39

Nilai fitur Zn = Zn / Ztertinggi


dimana 1 n 54
Nilai fitur didapatkan dengan melakukan perbandingan jumlah piksel hitam dari
satu zona dengan zona yang didapatkan dari proses no 2.
Contoh :
Nilai fitur Z1 = Z1/Z10 = 5/10 = 0.5
Nilai fitur Z10 = Z10/Z10 = 10/10 = 1
Nilai fitur Z15 = Z15/Z10 = 3/10 = 0.3

Dari ekstraksi zoning didapatkan 54 nilai fitur yang mewakili setiap zona.
Flowchart dari proses ekstraksi zoning dapat dilihat pada gambar 3.18.

40

y0

Start

Inisialisasi
ZONA_L 6, ZONA_T 9
img (hasil Thinning)
tinggi img(height), lebar img(width)
piksel_zona[ZONA_T][ZONA_L] 0.0
piksel_zona_max 0.0
x, y, k, l

yy+1

y < ZONA_T

No

End

No
Yes
x0

y0
No

x < ZONA_L
y y + 10

y < tinggi

Yes
Yes
piksel_zona[y][x]
piksel_zona[y][x] /
piksel_zona_max

x0
No
x x + 10
x < lebar

piksel_zona_max
piksel_zona[y/10][x/10]

Yes
ky

kk+1

k < y + 10

No

Yes

piksel_zona[y/10][x/10]
>
piksel_zona_max

No

Yes
lx
No

l < x + 10

ll+1

Yes
No
img(l, k) = 0

Yes
piksel_zona[y/10][x/10]
piksel_zona[y/10][x/10] + 1

Gambar 3.18 Flowchart ekstraksi fitur zoning

xx+1

41

3.2.2 Metode Ekstraksi Diagonal Based Feature Extraction

Metode ini terdiri dari 4 proses, yaitu :


1.

Hitung histogram diagonal setiap zona.


Histogram diagonal adalah banyaknya piksel hitam setiap diagonal. Penghitungan
histogram diagonal setiap zona dilakukan seperti pada gambar 3.19.

Gambar 3.19 Histogram diagonal zona


Banyaknya histogram diagonal sebuah zona adalah :
Banyak histogram diagonal = Panjang zona + Tinggi zona - 1
Banyak histogram diagonal = 10 + 10 - 1 = 19
2.

Hitung rata-rata histogram setiap zona.


Rata-rata histogram setiap zona dihitung dengan rumus :
Nilai fitur Zn = Rata-rata histogram = (Hist1 + .. + Hist19) / 19
dimana 1 n 54

3.

Hitung rata-rata zona setiap baris.


Rata-rata zona setiap baris dihitung dengan rumus :
Baris 1 = (Z1+Z2+Z3+Z4+Z5+Z6) / 6
Baris 2 = (Z7+Z8+Z9+Z10+Z11+Z12) / 6
Baris 3 = (Z13+Z14+Z15+Z16+Z17+Z18) / 6
Baris 4 = (Z19+Z20+Z21+Z22+Z23+Z24) / 6
Baris 5 = (Z25+Z26+Z27+Z28+Z29+Z30) / 6

42

Baris 6 = (Z31+Z32+Z33+Z34+Z35+Z36) / 6
Baris 7 = (Z37+Z38+Z39+Z40+Z41+Z42) / 6
Baris 8 = (Z43+Z44+Z45+Z46+Z47+Z48) / 6
Baris 9 = (Z49+Z50+Z51+Z52+Z53+Z54) / 6
4.

Hitung rata-rata zona setiap kolom.


Rata-rata zona setiap kolom dihitung dengan rumus :
Kolom 1 = (Z1+Z7+Z13+Z19+Z25+Z31+Z37+43+49) / 9
Kolom 2 = (Z2+Z8+Z14+Z20+Z26+Z32+Z38+Z44+Z50) / 9
Kolom 3 = (Z3+Z9+Z15+Z21+Z27+Z33+Z39+Z45+Z51) / 9
Kolom 4 = (Z4+Z10+Z16+Z22+Z28+Z34+Z40+Z46+Z52) / 9
Kolom 5 = (Z5+Z11+Z17+Z23+Z29+Z35+Z41+Z47+Z53) / 9
Kolom 6 = (Z6+Z12+Z18+Z24+Z30+Z36+Z42+Z48+Z54) / 9

Dari metode diagonal based feature extraction didapatkan 54 nilai fitur ratarata histogram diagonal setiap zona, 9 nilai fitur rata-rata zona setiap baris dan 6 nilai
fitur rata-rata zona setiap kolom kolom. Total nilai fitur yang didapatkan dari metode
ini adalah 69 nilai fitur. Flowchart proses ekstraksi diagonal based feature extraction
dapat dilihat pada gambar 3.20.

43

Start

y0

ZONA_L 6, ZONA_T 9
img (hasil Thinning)
tinggi img(height), lebar img(width)
jml_piksel_zona 0
jml_hor 0.0, jml_ver 0.0
rata_rata_zona[ZONA_T][ZONA_L] 0.0
rata_rata_hor[ZONA_T] 0.0
rata_rata_ver[ZONA_L] 0.0
int x, y, k, l

yy+1

y < ZONA_T

No
Yes
x0

y0

xx+1

x < ZONA_L
y y + 10

y < tinggi
Yes
Yes

No

jml_hor jml_hor +
rata_rata_zona[y][x]

No

x0
rata_rata_hor[y]
jml_hor / ZONA_L
x x + 10

x < lebar

jml_hor 0

Yes
x0

jml_piksel_zona 0

ky
xx+1

kk+1

k < y + 10

No

rata_rata_zona[y/10][x/10]
jml_piksel_zona / 19

x < ZONA_L

No

End

Yes
y0

Yes
lx
y < ZONA_T

No

l < x + 10

ll+1

Yes
No

Yes
No

yy+1

jml_ver jml_ver +
rata_rata_zona[x][y]

img(l, k) = 0

rata_rata_ver[x]
jml_hor / ZONA_T

Yes

jml_ver 0

Jml_piksel_zona
jml_piksel_zona + 1

Gambar 3.20 Flowchart ekstraksi diagonal based feature extraction

44

3.2.3 Penggabungan nilai fitur

54 nilai fitur yang didapatkan dari metode zoning digabungkan dengan 69 fitur yang
didapatkan dari metode diagonal based feature extraction untuk mendapatkan 123
nilai fitur. 123 nilai fitur tersebut disimpan pada matrik dengan ukuran 1x123 seperti
pada gambar 3.21.

..

53

54

Zoning

..

122

Diagonal based feature extraction

Gambar 3.21 Matrik penyimpanan nilai fitur

Nilai fitur yang didapatkan dari proses ekstraksi fitur ini digunakan sebagai
masukan terhadap jaringan propagasi balik.

3.3 Tahap Setelah Ekstraksi Fitur

Setelah dilakukan tahap ekstraksi fitur maka dapat dilakukan tahap selanjutnya yaitu
klasifikasi menggunakan jaringan propagasi balik. Pada tahap ini, nilai fitur yang
didapatkan dari tahap ekstraksi fitur digunakan sebagai masukan bagi lapis masukan
jaringan propagasi balik. Tahap klasifikasi terdiri dari dua proses, yaitu proses
pelatihan dan proses pengujian. Pada tahap pelatihan dilakukan pelatihan jaringan
menggunakan nilai fitur yang didapatkan dari data latihan. Jaringan harus dilatih
terlebih dahulu agar dapat kemudian digunakan. Setelah tahap pelatihan, jaringan
propagasi balik dapat digunakan untuk tahap pengujian menggunakan nilai fitur yang
didapatkan dari data uji. Sebelum dapat dilakukan pelatihan dan pengujian, jaringan
harus dirancang terlebih dahulu.

45

3.3.1 Perancangan Jaringan Propagasi Balik

Berdasarkan jumlah nilai fitur yang didapatkan dari tahap ekstraksi fitur, yaitu 123,
maka jumlah neuron pada lapis masukan jaringan propagasi balik adalah 123 neuron.
Jumlah neuron pada lapis keluaran adalah 10 karena pada penelitian ini akan
dilakukan klasifikasi 10 karakter angka, yaitu angka 0 sampai 9. Setiap angka
direpresentasikan oleh 10 nilai keluaran dari setiap neuron pada lapisan keluaran.
Nilai keluaran setiap angka dapat dilihat pada tabel 3.1.

Tabel 3.1 Nilai keluaran dan target keluaran jaringan


Nilai Keluaran

Angka

0000000001

0000000010

0000000100

0000001000

0000010000

0000100000

0001000000

0010000000

0100000000

1000000000

Jumlah neuron lapisan tersembunyi dan parameter jaringan dirancang


berdasarkan jaringan yang digunakan oleh Khairunnisa (2012). Meskipun penelitian
yang dilakukan oleh Khairunnisa adalah pengenalan huruf bersambung bukan
pengenalan angka, tetapi

sama-sama meneliti pengenalan tulisan tangan yang

memiliki tingkat variasi yang tinggi. Dan juga membantu menguji arsitektur dan
parameter jaringan yang digunakannya untuk kasus pengenalan angka tulisan tangan.
Dari penelitian yang telah dilakukan oleh Khairunnisa, berikut adalah spesifikasi
jaringan yang memberikan tingkat generalisasi paling tinggi :

46

Satu lapisan tersembunyi yang terdiri dari 96 neuron.

Fungsi aktivasi sigmoid biner

Inisialisasi Nguyen-Widrow

Laju pembelajaran 0.1

Momentum 0.5

Toleransi error (MSE) 0.01

Maksimum epoch 10000

Berdasarkan perancangan di atas jaringan saraf tiruan yang dibangun pada


penelitian ini dapat dilihat pada gambar 3.22.

b1

b2

v0,1

w0,1

v0,2

w0,2
w1,0

V0,100

x1

v03

v1,1
v1,2

z1

w1,2

v1,3
w1,10

v2,1
v2,2

z2

v2,3
v2,100

w2,1
w2,2

y2

w2,3
w2,10

v3,1

w3,1
v3,2

x3

w3,2

z3

v3,3
v3,100

w100,2

v69,2
w100,1
v69,3

v69,100

y3

w3,3
w3,10

v69,1

x123

y1

w1,3

v1,100

x2

w0,3

w1,1

w100,3

z96

w100,10

Gambar 3.22 Arsitektur jaringan saraf tiruan

y10

47

Berdasarkan gambar 3.22, rincian rancangan arsitektur jaringan saraf tiruan


yang digunakan adalah :
1. 1 lapisan input. Lapisan input terdiri dari unit-unit input mulai dari unit input 1
sampai unit input i, dimana i = 123.
2. 1 lapisan tersembunyi. Lapisan tersembunyi terdiri dari unit-unit tersembunyi
mulai dari unit tersembunyi 1 sampai unit tersembunyi j, dimana j = 96.
3. 1 lapisan output. Lapisan output terdiri dari unit-unit output mulai dari unit output
1 sampai unit output k, dimana k = 10.
4. x1 sampai x123 merupakan unit-unit lapisan input, y1 sampai y10 merupakan unitunit lapisan output dan z1 sampai z96 merupakan unit-unit lapisan tersembunyi.
5. b1 merupakan bias ke lapisan tersembunyi dan b2 merupakan bias ke lapisan
keluaran.
6. v0j dan w0k masing-masing adalah bobot bias untuk unit tersembunyi ke-j dan unit

output ke-k. vij adalah bobot koneksi antara unit ke-i lapisan input dengan unit ke-j
lapisan tersembunyi, sedangkan wjk adalah bobot koneksi antara unit ke-j lapisan
tersembunyi dengan unit ke-k lapisan output.

Setelah jaringan dibangun, maka dapat dilakukan proses pelatihan dan


pengujian jaringan.

3.3.2 Proses Pelatihan

Proses pelatihan dilakukan untuk melatih jaringan agar dapat mengenali angka tulisan
tangan, baik yang dilatihkan maupun tidak dilatihkan. Setiap pelatihan dilakukan
menggunakan parameter-parameter yang telah ditentukan. Pelatihan jaringan
propagasi balik terdiri dari tiga tahap, yaitu umpan maju, pemropagasian error, dan
perbaikan nilai bobot. Ketiga tahapan tersebut terus dilakukan sampai error keluaran
jaringan lebih kecil dari toleransi error atau dicapai maksimal epoch. Bobot terakhir
yang didapatkan dari proses pelatihan digunakan pada proses pengujian. Tahapan
proses pelatihan jaringan dapat dilihat pada bab 2.5 mengenai algoritma propagasi
balik.

48

3.3.3 Proses Pengujian

Proses pengujian adalah menguji jaringan yang telah dilatihkan untuk mengenali data
uji yang tidak digunakan pada tahap pelatihan jaringan. Menggunakan bobot yang
didapatkan setelah proses pelatihan, jaringan diharapkan mampu mengenali angka
yang terdapat pada data uji. Tahap pengujian hanya menggunakan tahap umpan maju
yang dipakai untuk mencari nilai keluaran lapisan tersembunyi dan lapisan keluaran.
Tahapan proses pengujian dapat dilihat pada bab 2.5 mengenai algoritma propagasi
balik.

BAB 4

IMPLEMENTASI DAN PENGUJIAN

4.1 Implementasi

Analisis dan pemodelan pengenalan angka tulisan tangan yang telah dilakukan pada
bab sebelumnya harus diimplementasikan ke dalam kode program agar dapat
dilakukan pengujian untuk mengetahui kemampuan kombinasi metode zoning dan
diagonal based faeature extraction.

Pengkodean dibagi menjadi lima modul utama, yaitu :


1.

Modul prapengolahan citra


Merupakan modul untuk melaksakan semua proses prapengolahan citra dan
melaksanakan proses ekstraksi fitur.

2.

Modul inisialisasi
Merupakan modl untuk melaksanakan inisialisasi bobot awal.

3.

Modul pelatihan jaringan


Merupakan modul untuk melaksanakan proses pelatihan jaringan propagasi balik.

4.

Modul pengujian jaringan


Merupakan modul untuk melaksanakan proses pengujian jaringan propagasi balik
yang telah dilatihkan.

5.

Modul program utama


Merupakan modul untuk menjalankan modul prapengolahan citra, pelatihan
jaringan dan pengujian jaringan.

Pada penelitian ini, pengkodean dilakukan menggunakan bahasa pemrograman


C++. Compiler yang digunakan adalah GNU GCC 4.2.1 yang digunakan melalui IDE
Codeblocks 8.02. Karena bahasa C++ tidak memiliki modul untuk melakukan

50

pengolahan citra, maka pada penelitian ini digunakan modul tambahan untuk proses
pengolahan citra, yaitu modul CImg. Modul ini dapat diunduh dari situs resminya
http://cimg.sourceforge.net. Fungsi-fungsi dari modul CImg yang digunakan dapat
dilihat pada tabel 4.1.

Tabel 4.1 Fungsi-fungsi CImg yang digunakan


Fungsi
CImg<float>
img(filename)

Deskripsi Fungsi
Fungsi untuk membuat objek dengan nama img dari kelas
CImg dengan tipe template pixel float. Filename (string)
adalah nama file yang akan dijadikan objek.
Contoh : CImg<float> img(Lena.bmp);

CImg<float> img(x,
y, z, channel,
color)

Fungsi untuk membuat objek dengan nama img dari kelas


CImg dengan tipe template pixel float. Objek yang dibuat
berdasarkan parameter yang dimasukkan. X adalah lebar
citra, y adalah tinggi citra, z adalah kedalaman citra (2d atau
3d), channel adalah banyaknya channel warna (3 untuk warna
RGB), color adalah warna untuk citra tersebut. Nilai 0 adalh
warna hitam dan nilai 255 adalah warna putih.
Contoh : CImg<float> img(640, 480, 1, 3, 0);

img.save(filename)

Fungsi untuk menyimpan objek CImg dengan nama img ke


file citra dengan nama filename (string). Pada filename
dituliskan juga format citra yang akan disimpan.
Contoh : img.save(Lena 2.bmp);

img(x, y, 0)

Fungsi untuk mendapatkan nilai warna dari objek CImg


dengan nama img pada koordinat piksel (x, y) dan channel
pertama, yaitu 0.
Contoh : img(10, 20, 0);
Selain itu, untuk mengubah nilai piksel pada koordinat dan
channel tertentu juga menggunakan fungsi ini.
Contoh : img(10, 20, 0) = 254;

img.width()

Fungsi untuk mendapatkan nilai lebar dari objek CImg


dengan nama img.

51

Tabel 4.1 Fungsi-fungsi CImg yang digunakan (lanjutan)


Fungsi
img.height()

Deskripsi Fungsi
Fungsi untuk mendapatkan nilai tinggi dari objek CImg
dengan nama img.

img.resize(x, y)

Fungsi untuk mengubah resolusi dari objek CImg dengan


nama img menjadi ukuran sesuai dengan parameter x (lebar)
dan y (tinggi).
Contoh : img.resize(600, 400);

Seluruh kode program yang telah dibuat dapat dilihat pada lampiran A.

4.2 Pengujian

Setelah dilakukan tahap implementasi dilakukan pengujian kemampuan kombinasi


metode zoning dan diagonal based feature extraction pada jaringan propagasi balik
untuk pengenalan angka tulisan tangan. Untuk mengetahui penambahan tingkat
pengenalan yang didapatkan dengan menggunakan kombinasi metode tersebut,
dibangun dua jaringan lain dengan arsitektur dan parameter yang sama tetapi masingmasing menggunakan satu metode ekstraksi saja, yaitu zoning atau diagonal based
feature extraction. Jaringan yang menggunakan kombinasi metode zoning dan
diagonal based feature extraction menggunakan 123 nilai fitur, jaringan yang
menggunakan metode zoning menggunakan 54 nilai fitur dan jaringan yang
menggunakan metode diagonal based feature extraction menggunakan 69 nilai fitur
sebagai masukan.

4.2.1 Persiapan Jaringan

Ketiga jaringan tersebut memiliki lapis tersembunyi dan lapis keluaran yang sama,
yaitu 96 neuron lapis tersembunyi dan 10 neuron lapis keluaran. Lapis masukan
dibangun sesuai dengan metode ekstraksi yang digunakan, yaitu zoning (54 neuron

52

masukan), diagonal based feature extraction (69 neuron masukan) dan kombinasinya
(123 neuron masukan). Arsitektur ketiga jaringan tersebut dapat dilihat pada tabel 4.2.

Tabel 4.2 Arsitektur tiga jaringan yang diujikan


Jaringan

Metode Ekstraksi

Lapis
Masukan

Lapis
Tersembunyi

Lapis
Keluaran

Zoning

54

96

10

69

96

10

123

96

10

II
III

Diagonal Based Feature


Extraction
Zoning dan Diagonal
Based Feature Extraction

Sebelum diuji, ketiga jaringan tersebut dilatih menggunakan data latihan


dengan parameter pelatihan, yaitu laju pembelajaran 0.1, momentum 0.5 dan batas
error 0.01. Ketiga jaringan tersebut dilatih hingga nilai error (MSE) yang dicapai lebih
kecil dari 0.01. Data latihan dapat dilihat pada lampiran B.

4.2.2 Hasil Pengujian

Setelah ketiga jaringan tersebut dilatih, dilakukan pengujian tingkat pengenalan dari
ketiga jaringan tersebut. Tingkat pengenalan diuji menggunakan diuji menggunakan
data uji, yaitu data baru yang tidak digunakan pada tahap pelatihan. Data yang
digunakan untuk pengujian adalah 100 pola angka (Lampiran B). Hasil pengenalan
data uji dari ketiga jaringan yang diujikan dapat dilihat pada tabel 4.3, tabel 4.4 dan
tabel 4.5 untuk jaringan I, II dan III.

Tabel 4.3 Hasil pengenalan data uji jaringan I (Zoning)


Jaringan
I

Pola
0
1
2
3
4
5

Target
0
0
0
0
0
0

Matrik Output
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001

Output
0
0
0
0
0
0

53

Tabel 4.3 Hasil pengenalan data uji jaringan I (Zoning) (lanjutan)


Jaringan
Pola
Target
Matrik Output
Output
I
6
0
0000000001
0
7
0
0000000001
0
8
0
0000000001
0
9
0
0000000001
0
10
1
0000000010
1
11
1
0000000010
1
12
1
0000000010
1
13
1
0000000010
1
14
1
0000000010
1
15
1
0000000010
1
16
1
0000000010
1
17
1
0000000010
1
18
1
0000000010
1
19
1
0000000010
1
20
2
0001000000
6
21
2
0000000100
2
22
2
0000000100
2
23
2
0000000100
2
24
2
0000000100
2
25
2
0000000100
2
26
2
0010000000
7
27
2
0000000100
2
28
2
0000000100
2
29
2
0000000100
2
30
3
0000001000
3
31
3
0000001000
3
32
3
0000000000
33
3
1010000000
34
3
0000001000
3
35
3
0000000000
36
3
1000001000
37
3
0000001000
3
38
3
0000001000
3
39
3
0000000000
40
4
0000010000
4
41
4
0000010000
4
42
4
0000010000
4
43
4
0000010000
4
44
4
0001000000
6
45
4
0000010000
4
46
4
0000010000
4
47
4
0000010000
4
48
4
0100010000
49
4
0000010000
4

54

Tabel 4.3 Hasil pengenalan data uji jaringan I (Zoning) (lanjutan)


Jaringan
I

Pola
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

Target
5
5
5
5
5
5
5
5
5
5
5
6
6
6
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
8
8
8
8
8
8
8
8
8
8
9
9
9
9

Matrik Output
0000100000
0000100000
0000101000
0000100000
0000100000
0000100000
0000100000
0000000000
0000100000
0000100000
0001000000
0001000000
0000000000
0001000000
0001000000
0001000000
0001000000
0001000000
0001000000
0101000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
1100000000
0000000100
0000000000
0100000000
0100000000
0100000000
0100000000
0100000000
0000000000
0100000000
1100000000
0000000000
0000000000
1000000000

Output
5
5
5
5
5
5
5
5
6
6
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
2
8
8
8
8
8
8
9

55

Tabel 4.3 Hasil pengenalan data uji jaringan I (Zoning) (lanjutan)


Jaringan
I

Pola
94
95
96
97
98
99

Target
9
9
9
9
9
9

Matrik Output
1000000000
1000000000
1000000000
1000000000
1000000000
1000000000

Output
9
9
9
9
9
9

Tabel 4.4 Hasil pengenalan data uji jaringan II (Diagonal Based Feature
Extraction)
Jaringan
II

Pola
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Target
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
3
3

Matrik Output
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0001000000
0000000100
0000000100
0000000100
0000000100
0000000100
0010000100
0000000100
0000000100
0000000100
0000001000
0000001000

Output
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
6
2
2
2
2
2
2
2
2
3
3

56

Tabel 4.4 Hasil pengenalan data uji jaringan II (Diagonal Based


Feature Extraction) (lanjutan)
Jaringan
Pola
Target
Matrik Output
Output
II
32
3
0000001000
3
33
3
1010000000
34
3
0000001000
3
35
3
0000001000
3
36
3
0000001000
3
37
3
0000001000
3
38
3
0000001000
3
39
3
1000001000
40
4
0000010000
4
41
4
0000010000
4
42
4
0000010000
4
43
4
0000010000
4
44
4
0001000000
6
45
4
0000010000
4
46
4
0000010000
4
47
4
0000010000
4
48
4
0100010000
49
4
0000010000
4
50
5
0000100000
5
51
5
0000100000
5
52
5
0000101000
53
5
0000100000
5
54
5
0000100000
5
55
5
0000100010
56
5
0000100000
5
57
5
0000000000
58
5
0000100000
5
59
5
0000100000
5
60
5
0001000000
6
61
6
0001000000
6
62
6
0000000001
0
63
6
0001000000
6
64
6
0001000000
6
65
6
0001000000
6
66
6
0001000000
6
67
6
0001000000
6
68
6
0001000001
69
6
0001000000
6
70
7
0000000000
71
7
0010000000
7
72
7
0010000000
7
73
7
0010000000
7
74
7
0010000000
7
75
7
0010000000
7

57

Tabel 4.4 Hasil pengenalan data uji jaringan II (Diagonal Based


Feature Extraction) (lanjutan)
Jaringan
Pola
Target
Matrik Output
Output
II
76
7
0010000000
7
77
7
0010000000
7
78
7
0010000000
7
79
7
0010000000
7
80
8
0100000000
8
81
8
0000000100
2
82
8
1000000000
9
83
8
0100000000
8
84
8
0100000000
8
85
8
0100000000
8
86
8
0100000000
8
87
8
0100000000
8
88
8
0100000000
8
89
8
0100000000
8
90
9
1000000000
9
91
9
1100000000
92
9
0000000000
93
9
1000000000
9
94
9
1000000000
9
95
9
1000000000
9
96
9
1000000000
9
97
9
1000000000
9
98
9
1000000000
9
99
9
1000000000
9
Tabel 4.5 Hasil pengenalan data uji jaringan III (Zoning dan Diagonal Based
Feature Extraction)
Jaringan
III

Pola
0
1
2
3
4
5
6
7
8
9
10
11
12

Target
0
0
0
0
0
0
0
0
0
0
1
1
1

Matrik Output
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000010
0000000010
0000000010

Output
0
0
0
0
0
0
0
0
0
0
1
1
1

58

Tabel 4.5 Hasil pengenalan data uji jaringan III (Zoning dan Diagonal
Based Feature Extraction) (lanjutan)
Jaringan
III

Pola
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

Target
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
3
3
3
3
3
3
3
3
3
3
4
4
4
4
4
4
4
4
4
4
5
5
5
5
5
5

Matrik Output
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0001000000
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000001000
0000001000
0000001000
1000000000
0000001000
0000000000
0000001000
0000001000
0000001000
1000001000
0000010000
0000010000
0000010000
0000010000
0001000000
0000010000
0000010000
0000010000
0000010000
0000010000
0000100000
0000100000
0000101000
0000100000
0000100000
0000100000

Output
1
1
1
1
1
1
1
6
2
2
2
2
2
2
2
2
2
3
3
3
9
3
3
3
3
4
4
4
4
6
4
4
4
4
4
5
5
5
5
5

59

Tabel 4.5 Hasil pengenalan data uji jaringan III (Zoning dan Diagonal
Based Feature Extraction) (lanjutan)
Jaringan

Pola
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

Target
5
5
5
5
5
6
6
6
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
8
8
8
8
8
8
8
8
8
8
9
9
9
9
9
9
9
9
9
9

Matrik Output
0000100000
0000000000
0000100000
0000100000
0001000000
0001000000
0000000001
0001000000
0001000000
0001000000
0001000000
0001000000
0001000001
0001000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0100000000
0000000100
1000000000
0100000000
0100000000
0100000000
0100000000
0100000000
0100000000
0100000000
1000000000
1100000000
0000000000
1000000000
1000000000
1000000000
1000000000
1000000000
1000000000
1000000000

Output
5
5
5
6
6
0
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
8
2
9
8
8
8
8
8
8
8
9
9
9
9
9
9
9
9

60

Dari tabel 4.3, tabel 4.4 dan tabel 4.5 diketahui tingkat pengelan dari ketiga
jaringan tersebut seperti pada tabel 4.6.

Tabel 4.6 Tingkat pengenalan tiga jaringan yang diujikan


Jaringan

Metode Ekstraksi

Pengenalan
(/100)

Tingkat
Pengenalan (%)

Zoning

80

80

II

Diagonal Based Feature


Extraction

85

85

III

Zoning dan Diagonal


Based Feature Extraction

87

87

Dari tabel 4.6 diketahui bahwa tingkat pengenalan jaringan yang menggunakan
kombinasi metode zoning dan diagonal based feature extraction lebih tinggi dari
jaringan yang menggunakan metode zoning dan jaringan yang menggunakan metode
diagonal based feature extraction.

BAB 5

KESIMPULAN DAN SARAN

5.1 Kesimpulan

Berdasarkan hasil analisis dan pengujian yang dilakukan pada bab-bab sebelumnya,
dapat disimpulan bahwa penggunaan kombinasi metode zoning dan diagonal based
feature extraction dapat menambah tingkat pengenalan jaringan propagasi balik. Dari
pengujian yang dilakukan dicapai tingkat pengenalan sebesar 87%, yaitu lebih tinggi
dari penggunaan satu metode saja, yaitu yaitu 80% untuk penggunaan metode zoning
dan 85% untuk penggunaan metode diagonal based feature extraction.

5.2 Saran

Pada penelitian ini, jaringan yang digunakan hanya dilatih hingga mencapai batas
error 0.01. Nilai error yang dicapai setelah pelatihan belum tentu merupakan kondisi
global minimum. Oleh karena itu perlu dilakukan penelitian selanjutnya untuk
mencapai kondisi global minimum, agar mendapatkan tingkat pengenalan yang lebih
baik.

62

DAFTAR PUSTAKA

Althaf, M. K. M. dan Begum M. B. 2012. Handwritten Characters Pattern Recognition


using Neural Networks. International Conference on Computing and Control
Engineering (ICCCE).

Arica N. dan Yarman-Vural. 2001. An Overview of Character Recognition Focused


on Off-line Handwriting. IEEE Transactions on Systems, Man and
Cybernetics, Part C: Applications and Review. 31(2): 216-233.

Ayyaz, M. N., Javed, I., Mahmood, W. 2012. Handwritten Character Recognition


Using Multiclass SVM Classification with Hybrid Feature Extraction. Pak J.
Engg. & Appl. Sci. 10: 57-67.

Bosker, M. 1992. Omnidocument Technologies. Proceeding of the IEEE. 80: 10661078.

Emanuel, A. W. R. dan Hartono, A. 2008. Pengembangan Aplikasi Pengenalan


Karakter Alfanumerik Dengan Menggunakan Algoritma Neural Network
Three-Layer Backpropagation. Jurnal Informatika. 4(1):49-58.
Graupe, D. 2007. Principles of Artificial Neural Networks (2nd edition). Chicago:
World Scientific.

Handayani, M. R. 2008. Model Deformable untuk Mengenali Angka Tulisan Tangan.


Jurnal Teknologi Informasi DIMANIK. 8(1): 54-58.

Jain, A. K. dan Taxt, T. 1996. Feature Extraction Methods for Character RecognitionASurvey. Pattern Recognition. 29(4): 641-662.

63

Khairunnisa. 2012. Pengenalan Tulisan Tangan Latin Bersambung Menggunkan


Jaringan Saraf Tiruan Propagasi Balik. S.Ti Skripsi. Medan, Indonesia:
Universitas Sumatera Utara.

Lauer, F., Suen, C. Y. dan Bloch, G. A Trainable Feature Extractor for Handwritten
Digit Recognition. Patter Recognition. 40(6):1816-1824.

Munir, R. 2004. Pengolahan Citra Digital dengan Pendekatan Alogritmik. Bandung:


Informatika.

Murthy, O. V. R. dan Hanmandlu, M. 2011. Zoning Based Devanagri Character


Recognition. International Journal of Computer Applications (0975-8887).
27(4): 21-25.

Phillips, D. 2000. Image Processing in C Second Edition. Kansas: R&D Publications.

Pradeep, J., Srinivasan, E., dan Himavathi, S. 2011. Diagonal Based Feature
Extraction for Handwritten Alphabets Recognition System Using Neural
Network. International Journal of Computer Science & Information
Technology (IJCSIT). 3(1): 27-38.

Putra, D. 2009. Sistem Biometrika, Konsep Dasar, Teknik Analisis Citra, dan Tahapan
Membangun Aplikasi Sistem Biometrika. Yogyakarta: Andi.

Puspitaningrum, D. 2006. Pengantar Jaringan Saraf Tiruan. Yogyakarta: Andi.

Sharma, O. P, Ghose, M. K. dan Shah, K. B. 2012. An Improved Zone Based Hybrid


Feature Extraction Model for Handwritten Alphabets Recognition Using Euler
Number. International Journal of Soft Computing and Engineering (IJSCE).
2(2): 504-508.

64

Sheth, R., Chauhan, N. C., Goyani, M. M. dan Mehta, K. A. 2011. Handwritten


Character Recognition System using Chain Code and Correlation Coefficient.
International Journal of Computer Applications. 31-36.

65

LAMPIRAN A : LISTING PROGRAM

1.

Main.cpp
/*
Nama file : Main.cpp
Deskrpisi : Modul menu utama untuk menjalankan semua proses
pengenalan angka tulisan tangan
*/
#include
#include
#include
#include
#define
#define
#define
#define
#define

<iostream.h>
<ctype.h>
<stdlib.h>
<fstream.h>
MENU_PRE "preprocessing.exe"
MENU_INIT "initialization.exe"
MENU_TRAIN "training.exe"
MENU_TEST "testing.exe"
MENU_PRE_DISPLAY "preprocessing_display.exe"

void show_menu()
{
cout << endl;
cout << "Main Menu
-" << endl;
cout << "=====================" << endl;
cout << "1. Preprocessing" << endl;
cout << "2. Training" << endl;
cout << "3. Testing" << endl;
cout << "4. Preprocessing Example" << endl;
cout << "8. Initialization" << endl;
cout << "9. About" << endl;
cout << "0. Exit" << endl << endl;
}
int main()
{
system("TITLE Pengenalan Angka Tulisan Tangan");
int no_menu;
do
{
show_menu();
cout << "Menu? ";
cin >> no_menu;
if(no_menu == 1)
{
cout << endl << "PREPROCESSING" << endl;
cout << "=============" << endl;
system(MENU_PRE);
}
else if(no_menu == 2)
{
cout << endl << "TRAINING" << endl;
cout << "========" << endl;

66

system(MENU_TRAIN);
}
else if(no_menu == 3)
{
cout << endl << "TESTING" << endl;
cout << "========" << endl;
system(MENU_TEST);
}
else if(no_menu == 4)
{
cout << endl << "PREPROCESSING EXAMPLE" << endl;
cout << "=====================" << endl;
system(MENU_PRE_DISPLAY);
}
else if(no_menu == 8)
{
cout << endl << "INITALIZATION" << endl;
cout << "=============" << endl;
system(MENU_INIT);
}
else if(no_menu == 9)
{
cout << endl;
cout << "Nanda Putra - 081402030" << endl;
cout << "S1 Teknologi Informasi USU" << endl;
cout << "Fakultas Ilmu Komputer dan Teknologi
Informasi" << endl;
cout << "Universitas Sumatera Utara" << endl;
cout << endl;
system("pause");
}
else if(no_menu == 0)
{
break;
}
else
no_menu = 99;
}while(no_menu != 0);
cout << "Goodbye :)" << endl;
system("pause");
return 0;
}

2.

Preprocessing.cpp
/*
Nama file : Preprocessing.cpp
Deskrpisi : Modul Preprocessing untuk melakukan proses
prapengolahan citra dan ekstraksi fitur.
Proses prapengolahan citra yang dilakukan adalah
:Grayscale, Noise Reduction, Threshold, Filling, Crop, Resize,
Thinning
Proses ekstraksi fitur yang dilakukan adalah :
Zoning dan Diagonal Based Feature Extraction
*/

67

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
#define LEBAR 60
#define TINGGI 90
#define ZONA_L 6
#define ZONA_T 9
#define NIN 123
#include "CImg.h"
using namespace cimg_library;
int main()
{
int n, m, i, j, k, l;
//n dan m untuk pengulangan images |
i, j, k, l untuk pengulangan biasa
char filename[30]; //string untuk menyimpan nama file image
char folder_raw[20];
//string untuk menyimpan lokasi
folder raw image
char folder[20];
//string untuk menyimpan lokasi folder
image
int nImages;
//variabel jumlah image
int no_menu;
//variabel untuk menu pelatihan atau
pengujian
//Variabel untuk fungsi Grayscale
float valR, valG, valB, avg;
//Deklarasi variable untuk
RGB dan avg(nilai grayscale)
//Variabel untuk fungsi Threshold
int threshold; //variabel threshold
cout
cout
cout
cout

<<
<<
<<
<<

"Prapengolahan untuk : " << endl;


"1. Pelatihan (Training)" << endl;
"2. Pengujian (Testing)" << endl;
"? "; cin >> no_menu;

if(no_menu == 1)
{
strcpy(folder_raw,"data_latihan_raw");
strcpy(folder,"data_latihan");
}
else if(no_menu == 2)
{
strcpy(folder_raw,"data_uji_raw");
strcpy(folder,"data_uji");
}
else
{
strcpy(folder_raw,"data_latihan_raw");
strcpy(folder,"data_latihan");
}
cout << "Jumlah pola : "; cin >> nImages;
image
cout << "Threshold : "; cin >> threshold;
threshold untuk binary image

//input jumlah
//input nilai

68

//Variabel untuk menyimpan input jst


double input_jst[10*nImages][NIN];
//array untuk menyimpan
final input untuk jst
int indeks=0; //variabel untuk indeks input_jst
int pola=0; //variabel untuk pola mana yg di cari inputnya
//Inisialisasi array input_jst
for(i=0; i<10*nImages; i++)
{
for(j=0; j<NIN; j++)
{
input_jst[i][j] = 0.0;
}
}
//Pengulangan untuk pemrosesan semua image
for(n=0; n<10; n++)
{
for(m=0; m<nImages; m++)
{
sprintf(filename, "%s/%d/%d.bmp", folder_raw, n, m);
CImg<float> img(filename);
//Variabel untuk fungsi Crop setiap image
int a1=0, a2=0, b1=0, b2=0; //variabel untuk
menyimpan nilai koordinat (a1, b1) dan (a2, b2)
int hist_hor[img.height()], hist_ver[img.width()];
//variabel untuk menyimpan histogram horizontal dan vertikal
//Inisialisasi hist_hor
for(i=0; i<img.height(); i++)
{
hist_hor[i] = 0;
}
//Inisialisasi hist_ver
for(i=0; i<img.width(); i++)
{
hist_ver[i] = 0;
}
//Mulai semua fungsi image processing
//
//Grayscale
//img.display("Input Image");
for(i=0; i<img.height(); i++)
//Pengulangan untuk
tinggi
{
for(j=0; j<img.width(); j++)
//Pengulangan
untuk lebar
{
valR = img(j, i, 0); //Set nilai R
valG = img(j, i, 1); //Set nilai G
valB = img(j, i, 2); //Set nilai B
avg = (valR + valG + valB)/3;
//Hitung
nilai grayscale
img(j, i, 0) = avg;
//Set nilai avg ke
pixel (j,i)
img(j, i, 1) = avg;

69

img(j, i, 2) = avg;
}
}
// Noise Reduction
CImg<float> img_noise(img.width()+2, img.height()+2,
1, 3, 255);
float matrik[9];
float temp;
// Copy img ke img_noise dengan batas
for(i=1; i<img.height()+1; i++)
{
for(j=1; j<img.width()+1; j++)
{
img_noise(j, i, 0) = img(j-1,
img_noise(j, i, 1) = img(j-1,
img_noise(j, i, 2) = img(j-1,
}
}

keliling 1 px

i-1, 0);
i-1, 1);
i-1, 2);

// Cari median dar matrik 3x3 pixel dai img_noise dan


set ke img
for(i=1; i<img.height()+1; i++)
{
for(j=1; j<img.width()+1; j++)
{
// Set matrik dengan 0
for(k=0; k<9; k++)
matrik[k] = 0;
matrik[0]
matrik[1]
matrik[2]
matrik[3]
matrik[4]
matrik[5]
matrik[6]
matrik[7]
matrik[8]

=
=
=
=
=
=
=
=
=

img_noise(j-1, i-1, 0);


img_noise(j, i-1, 0);
img_noise(j+1, i-1, 0);
img_noise(j-1, i, 0);
img_noise(j, i, 0);
img_noise(j+1, i, 0);
img_noise(j-1, i+1, 0);
img_noise(j, i+1, 0);
img_noise(j+1, i+1, 0);

// Sortir matrik
for(int a=0; a<9; a++)
{
for(int b=a; b<9; b++)
{
if(matrik[b] < matrik[a])
{
temp = matrik[a];
matrik[a] = matrik[b];
matrik[b] = temp;
}
}
}
// Set kembali img
img(j-1, i-1, 0) =
img(j-1, i-1, 1) =
img(j-1, i-1, 2) =
}

nilai median
matrik[5];
matrik[5];
matrik[5];

70

}
// Threshold
for(i=0; i<img.height(); i++)
//Pengulangan untuk
tinggi
{
for(j=0; j<img.width(); j++)
//Pengulangan
untuk lebar
{
if(img(j, i, 0)>threshold) //Cek nilai piksel
{
img(j, i, 0) = 255;
//Set nilai 254
(putih/background) ke pixel (j,i), jika nilai warna > threshold
img(j, i, 1) = 255;
img(j, i, 2) = 255;
}
else
{
img(j, i, 0) = 0;
//Set nilai 0 (hitam)
ke pixel (j,i), jika nilai warna < threshold
img(j, i, 1) = 0;
img(j, i, 2) = 0;
}
}
}
// Filling
int tetangga;
for(i=1; i<img.height(); i++)
//Pengulangan untuk
tinggi
{
for(j=1; j<img.width(); j++)
//Pengulangan
untuk lebar
{
tetangga = 0;
if(img(j, i, 0) == 255)
{
if(img(j-1, i, 0) == 0)
tetangga++;
if(img(j-1, i-1, 0) == 0)
tetangga++;
if(img(j, i-1, 0) == 0)
tetangga++;
if(img(j+1, i-1, 0) == 0)
tetangga++;
if(img(j+1, i, 0) == 0)
tetangga++;
if(img(j+1, i+1, 0) == 0)
tetangga++;
if(img(j, i+1, 0) == 0)
tetangga++;
if(img(j-1, i+1, 0) == 0)
tetangga++;
}
if(tetangga >
{
img(j, i,
img(j, i,
img(j, i,

4)
0) = 0;
1) = 0;
2) = 0;

71

}
}
}
// Crop
//Hitung histogram horizontal
for(i=0; i<img.height(); i++)

//Pengulangan untuk

tinggi
{
for(j=0; j<img.width(); j++)

//Pengulangan

untuk lebar
{
if(img(j, i, 0) == 0)
hist_hor[i] += 1;
}
}
//Hitung histogram vertikal
for(i=0; i<img.width(); i++)

//Pengulangan untuk

lebar
{
for(j=0; j<img.height(); j++)

//Pengulangan

untuk tinggi
{
if(img(i, j, 0) == 0)
hist_ver[i] += 1;
}
}
//Cari a1
for(i=0; i<img.height(); i++)
{
if(hist_hor[i] == 0 && hist_hor[i+1] > 0)
{
a1 = i;
break;
}
}
//Cari a2
for(i=img.height()-1; i>=0; i--)
{
if(hist_hor[i] == 0 && hist_hor[i-1] > 0)
{
a2 = i;
break;
}
}
//Cari b1
for(i=0; i<img.width(); i++)
{
if(hist_ver[i] == 0 && hist_ver[i+1] > 0)
{
b1 = i;
break;
}
}
//Cari b2

72

for(i=img.width()-1; i>=0; i--)


{
if(hist_ver[i] == 0 && hist_ver[i-1] > 0)
{
b2 = i;
break;
}
}
//Deklarasi img_r untuk menampung image crop
sementara
CImg <float> img_temp(b2-b1+1, a2-a1+1, 1, 1, 255);
//Crop ke img_temp
for(i=a1; i<=a2; i++)
{
for(j=b1; j<=b2; j++)
{
if(img(j, i, 0) == 0)
{
img_temp(j-b1, i-a1, 0) = 0;
}
}
}
//Resize img
img.resize(b2-b1+1, a2-a1+1);
//Pindahkan img_temp ke img yang sudah di resize
for(i=0; i<img_temp.height(); i++)
{
for(j=0; j<img_temp.width(); j++)
{
if(img_temp(j, i, 0) == 0)
{
img(j, i, 0) = 0;
img(j, i, 1) = 0;
img(j, i, 2) = 0;
}
else
{
img(j, i, 0) = 255;
img(j, i, 1) = 255;
img(j, i, 2) = 255;
}
}
}
// Normalization
//Resize img menjadi 60x90 piksel untuk feature
extraction
img.resize(60, 90);
// Thinning
int arr_flag[img.height()][img.width()];
//Array
2d untuk menyimpan koordinat piksel yang akan dihapus
int jml_flag; //Variabel untuk menyimpan jumlah flag
pada arr_flag
int n_p1, s_p1;
//Deklarasi variabel untuk
thinning, n=N(P1), s=S(P1)

73

//Inisialisasi arr_flag dg nilai 0


for(i=0; i<img.height(); i++)
{
for(j=0; j<img.width(); j++)
{
arr_flag[i][j] = 0;
}
}
//Pengulangan jika masih ada piksel yang ditandai
do
{
//Pengulangan thinning tahap 1
n_p1 = s_p1 = jml_flag = 0;
for(i=1; i<(img.height()-1); i++)
{
for(j=1; j<(img.width()-1); j++)
{
if(img(j, i, 0) == 0)
//Jika nilai
piksel img[j][i] = 0
{
//Hitung N(P1)
for(k=i-1; k<=i+1; k++)
{
for(l=j-1; l<=j+1; l++)
{
if(img(l, k, 0) == 0)
n_p1 += 1;
}
}
n_p1 -= 1; //Kurangi N(P1) dengan 1,
yaitu piksel tengah
if(n_p1 >= 2 && n_p1 <= 6)
{
//Hitung S(P1)
//P(2) -> P(3)
if(img(j, i-1, 0) == 255)
{
if(img(j+1, i-1, 0) == 0)
s_p1 += 1;
}
//P(3) -> (4)
if(img(j+1, i-1, 0) == 255)
{
if(img(j+1, i, 0) == 0)
s_p1 += 1;
}
//P(4) -> (5)
if(img(j+1, i, 0) == 255)
{
if(img(j+1, i+1, 0) == 0)
s_p1 += 1;
}
//P(5) -> (6)
if(img(j+1, i+1, 0, 0) == 255)
{
if(img(j, i+1, 0, 0) == 0)
s_p1 += 1;

74

}
//P(6) -> (7)
if(img(j, i+1, 0, 0) == 255)
{
if(img(j-1, i+1, 0, 0) == 0)
s_p1 += 1;
}
//P(7) -> (8)
if(img(j-1, i+1, 0, 0) == 255)
{
if(img(j-1, i, 0, 0) == 0)
s_p1 += 1;
}
//P(8) -> (9)
if(img(j-1, i, 0, 0) == 255)
{
if(img(j-1, i-1, 0, 0) == 0)
s_p1 += 1;
}
//P(9) -> (2)
if(img(j-1, i-1, 0, 0) == 255)
{
if(img(j, i-1, 0, 0) == 0)
s_p1 += 1;
}
//Jika S(P1)=1 && P2*P4*P6=0 &&
P4*P6*P8=0, maka tandai piksel untuk dihapus
if(s_p1 == 1 && (img(j, i-1, 0,
0) || img(j+1, i, 0, 0) || img(j, i+1, 0, 0) == 255) && (img(j+1,
i, 0, 0) || img(j, i+1, 0, 0) || img(j-1, i, 0, 0) == 255))
{
arr_flag[i][j] = 1;
jml_flag += 1;
}
}
}
n_p1 = s_p1 = 0; //Set N(P1) dan S(P1)
menjadi 0 kembali
}
}
//Hapus piksel yang ditandai dari pengulangan
thinning 1
for(i=0; i<img.height(); i++)
{
for(j=0; j<img.width(); j++)
{
if(arr_flag[i][j] == 1)
{
img(j, i, 0) = 255;
img(j, i, 1) = 255;
img(j, i, 2) = 255;
arr_flag[i][j] = 0; //Set kembali
arr_flag yang ditandai menjadi 0
}
}
}

75

//Pengulangan thinning tahap 2


n_p1 = s_p1 = 0;
for(i=1; i<(img.height()-1); i++)
{
for(j=1; j<(img.width()-1); j++)
{
if(img(j, i, 0) == 0)
//Jika nilai
piksel img_biner[j][i] = 0
{
//Hitung N(P1)
for(k=i-1; k<=i+1; k++)
{
for(l=j-1; l<=j+1; l++)
{
if(img(l, k, 0) == 0)
n_p1 += 1;
}
}
n_p1 -= 1; //Kurangi N(P1) dengan 1,
yaitu piksel tengah
if(n_p1 >= 2 && n_p1 <= 6)
{
//Hitung S(P1)
//P(2) -> P(3)
if(img(j, i-1, 0) == 255)
{
if(img(j+1, i-1, 0) == 0)
s_p1 += 1;
}
//P(3) -> (4)
if(img(j+1, i-1, 0) == 255)
{
if(img(j+1, i, 0) == 0)
s_p1 += 1;
}
//P(4) -> (5)
if(img(j+1, i, 0) == 255)
{
if(img(j+1, i+1, 0) == 0)
s_p1 += 1;
}
//P(5) -> (6)
if(img(j+1, i+1, 0) == 255)
{
if(img(j, i+1, 0) == 0)
s_p1 += 1;
}
//P(6) -> (7)
if(img(j, i+1, 0) == 255)
{
if(img(j-1, i+1, 0) == 0)
s_p1 += 1;
}
//P(7) -> (8)
if(img(j-1, i+1, 0) == 255)
{
if(img(j-1, i, 0) == 0)
s_p1 += 1;
}

76

//P(8) -> (9)


if(img(j-1, i, 0) == 255)
{
if(img(j-1, i-1, 0) == 0)
s_p1 += 1;
}
//P(9) -> (2)
if(img(j-1, i-1, 0) == 255)
{
if(img(j, i-1, 0) == 0)
s_p1 += 1;
}
//Jika S(P1)=1 && P2*P4*P8=0 &&
P2*P6*P8=0, maka tandai piksel untuk dihapus
if(s_p1 == 1 && (img(j, i-1, 0)
|| img(j+1, i, 0) || img(j-1, i, 0) == 255) && (img(j, i-1, 0) ||
img(j, i+1, 0) || img(j-1, i, 0) == 255))
{
arr_flag[i][j] = 1;
jml_flag += 1;
}
}
}
n_p1 = s_p1 = 0; //Set N(P1) dan S(P1)
menjadi 0 kembali
}
}
//Hapus piksel yang ditandai dari pengulangan
thinning 2
for(i=0; i<img.height(); i++)
{
for(j=0; j<img.width(); j++)
{
if(arr_flag[i][j] == 1)
{
img(j, i, 0) = 255;
img(j, i, 1) = 255;
img(j, i, 2) = 255;
arr_flag[i][j] = 0; //Set kembali
arr_flag yang ditandai menjadi 0
}
}
}
}while(jml_flag>0);
// Zoning
double piksel_zona[ZONA_T][ZONA_L];
double piksel_zona_max=0.0;
// Inisialisasi piksel_ona
for(i=0; i<ZONA_T; i++)
{
for(j=0; j<ZONA_L; j++)
{
piksel_zona[i][j] = 0.0;
}
}

77

//Pengulangan untuk pembagian zona 10x10 pixel


for(i=0; i<img.height(); i+=10)
{
for(j=0; j<img.width(); j+=10)
{
//Hitung jumlah piksel hitam setiap zona
for(k=i; k<i+10; k++)
{
for(l=j; l<j+10; l++)
{
if(img(l, k, 0) == 0)
piksel_zona[i/10][j/10]++;
}
}
if(piksel_zona[i/10][j/10] > piksel_zona_max)
piksel_zona_max =
piksel_zona[i/10][j/10];
}
}
// Hitung nilai setiap zona
for(i=0; i<ZONA_T; i++)
{
for(j=0; j<ZONA_L; j++)
{
piksel_zona[i][j] /= piksel_zona_max;
input_jst[pola][indeks++] =
piksel_zona[i][j];
}
}
// Diagonal Based Feature Extraction
int jml_piksel_zona=0;
//variabel untuk setiap
zona
double jml_hor=0.0, jml_ver=0.0;
//variabel untuk
menyimpan jumlah nilai dari setiap zona secara horizontal dan
vertikal
double rata_rata_zona[ZONA_T][ZONA_L],
rata_rata_hor[ZONA_T], rata_rata_ver[ZONA_L];
//array untuk
menyimpan nilai semua rata-rata (zona, horizontal dan vertikal)
//Inisialisasi array
for(i=0; i<ZONA_T; i++)
{
for(j=0; j<ZONA_L; j++)
{
rata_rata_zona[i][j] = 0.0; //array
rata_rata_zona
rata_rata_ver[j] = 0.0; //array
rata_rata_ver
}
rata_rata_hor[i] = 0.0; //array rata_rata_hor
}
//Pengulangan untuk pembagian zona 10x10 pixel
for(i=0; i<img.height(); i+=10)
{

78

for(j=0; j<img.width(); j+=10)


{
//Hitung jumlah piksel hitam setiap zona
jml_piksel_zona = 0;
for(k=i; k<i+10; k++)
{
for(l=j; l<j+10; l++)
{
if(img(l, k, 0) == 0)
jml_piksel_zona++;
}
}
//Hitung rata-rata setiap zona => rata_zona =
jml_piksel_zona/(panjang + tinggi - 1)
rata_rata_zona[i/10][j/10] =
(double)jml_piksel_zona/19;
//Masukkan rata_rata_zona ke array input_jst
input_jst[pola][indeks++] =
rata_rata_zona[i/10][j/10];
}
}
//Hitung rata-rata zona horizontal
for(i=0; i<ZONA_T; i++)
{
for(j=0; j<ZONA_L; j++)
{
jml_hor += rata_rata_zona[i][j];
}
rata_rata_hor[i] = jml_hor/ZONA_L;
jml_hor = 0.0;
//Masukkan rata_rata_zona ke array input_jst
input_jst[pola][indeks++] = rata_rata_hor[i];
}
//Hitung rata-rata zona vertikal
for(i=0; i<ZONA_L; i++)
{
for(j=0; j<ZONA_T; j++)
{
jml_ver += rata_rata_zona[j][i];
}
rata_rata_ver[i] = jml_ver/ZONA_T;
jml_ver = 0.0;
//Masukkan rata_rata_zona ke array input_jst
input_jst[pola][indeks++] = rata_rata_ver[i];
}
//
//Akhir semua fungsi image processing
sprintf(filename,"%s/%d/%d.bmp", folder,n, m);
img.save(filename);
indeks = 0; //Reset indeks menjadi 0 untuk image
selanjutnya

79

pola += 1;

//Lanjut ke pola selanjutnya

}
}
if(no_menu == 1)
{
//Tuliskan array input_jst ke dalam file input_jst.dat
ofstream out("data_latihan.dat", ios::binary);
out.write((char *)&nImages,sizeof(nImages));
out.write((char *)&threshold,sizeof(threshold));
out.write((char *)&input_jst,sizeof(input_jst));
out.close();
}
else if(no_menu == 2)
{
//Tuliskan array input_jst ke dalam file data_uji.dat
ofstream out("data_uji.dat", ios::binary);
out.write((char *)&nImages,sizeof(nImages));
out.write((char *)&threshold,sizeof(threshold));
out.write((char *)&input_jst,sizeof(input_jst));
out.close();
}
system("pause");
return 0;
}

3.

Initialization.cpp
/*
Nama file : Initialization.cpp
Deskrpisi : Program untuk melakukan inisialisasi bobot (NguyenWidrow)
*/
#include
#include
#include
#include
#include
#define
#define
#define
#define

<iostream.h>
<math.h>
<stdlib.h>
<fstream.h>
<time.h>
NIN 123
// jumlah neuron input
NH 96
// jumlah neuron hidden
NOUT 10
// jumlah neuron output
PATTERN 260
// jumlah pola

int main()
{
// Deklarasi array bobot input, hidden, output dan bias
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
double deltaweightIH[NIN][NH];
double deltaweightHO[NH][NOUT];
// Input data

80

int i, h, o, rndnum, total_epoch=0;


double beta, min, max, eucval, pembagi=10000.0;
// Hitung faktor skala Nguyen-Widrow
beta = 0.7*(pow(NH, 1.0/NIN));
min = -beta*pembagi;
max = beta*pembagi;
srand( (unsigned)time( NULL ) );
// Inisialisasi weightIH
for(h=0; h<NH; h++)
{
eucval = 0.0;
for(i=0; i<NIN; i++)
{
rndnum = (unsigned)rand();
weightIH[i][h] = ((rndnum%(int)(max-min)) + min) /
pembagi;
deltaweightIH[i][h] = 0.0;
deltaweightIH dengan 0

// Inisialisasi

eucval += pow(weightIH[i][h], 2);


bobot untuk menghitung Euclidean Norm Value
}
eucval = sqrt(eucval);

// Jumlahkan

// Hitung Euclidean Norm Value

// Set kembali weightIH


for(i=0; i<NIN; i++)
{
weightIH[i][h] = (beta * weightIH[i][h]) / eucval;
}
rndnum = (unsigned)rand();
biasH[h] = ((rndnum%(int)(max-min)) + min) / pembagi;
}
// Inisialisasi weightHO
for(o=0; o<NOUT; o++)
{
for(h=0; h<NH; h++)
{
rndnum = (unsigned)rand();
weightHO[h][o] = ((rndnum%(int)(max-min)) + min) /
pembagi;
deltaweightHO[h][o] = 0.0;
deltaweightHO dengan 0
}

// Inisialisasi

rndnum = (unsigned)rand();
biasY[o] = ((rndnum%(int)(max-min)) + min) / pembagi;
}
//Tuliskan array bobot dan bias ke dalam file weight.dat
ofstream out("weight.dat", ios::binary);
out.write((char *)&weightIH,sizeof(weightIH));
out.write((char *)&biasH,sizeof(biasH));
out.write((char *)&weightHO,sizeof(weightHO));

81

out.write((char
out.write((char
out.write((char
out.write((char
out.close();

*)&biasY,sizeof(biasY));
*)&deltaweightIH,sizeof(deltaweightIH));
*)&deltaweightHO,sizeof(deltaweightHO));
*)&total_epoch,sizeof(total_epoch));

system("pause");
return 0;
}

4.

Training.cpp
/*
Nama file : Training.cpp
Deskrpisi : Program untuk melakukan pelatihan Backpropagation
untuk mengenali Angka Tulisan Tangan 0-9
Arsitektur : 123-96-10.
Inisialisasi bobot : Nguyen-Widrow
Fungsi Aktivasi : Sigmoid Biner
Error : Mean Square Error (MSE)
Ekstraksi Fitur : Zoning + Diagonal Based Feature
Extraction
*/
#include
#include
#include
#include
#include
#define
#define
#define
#define

<iostream.h>
<math.h>
<stdlib.h>
<fstream.h>
<time.h>
NIN 123
// jumlah neuron input
NH 96
// jumlah neuron hidden
NOUT 10
// jumlah neuron output
PATTERN 260
// jumlah pola

class backpropagation
{
// Deklarasi array neuron input, hidden, output dan target
double X[PATTERN][NIN];
double H[NH];
double Y[PATTERN][NOUT];
double targetY[NOUT][NOUT];
// Deklarasi array bobot input, hidden, output dan bias
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
// Deklarasi array untuk perubahan bobot dan bias
double deltaY[NOUT];
double deltaH[NH];
double deltaweightIH[NIN][NH];
double deltaweightHO[NH][NOUT];
// Deklarasi jumlah nepoch, learning, momentum dan tanda
ditemukan solusi

82

int nepoch;
int epoch;
int total_epoch;
double error;
double learning_rate;
double momentum;
int nImages;
bool isFindSolution;
double mse;
public:
backpropagation();
backpropagation(double, int, double, double, int);
void init(double _X[PATTERN][NIN], double
_targetY[NOUT][NOUT], double _weightIH[NIN][NH], double
_weightHO[NH][NOUT], double _biasH[NH], double _biasY[NOUT],
double _deltaweightIH[NIN][NH], double _deltaweightHO[NH][NOUT],
int _total_epoch);
bool training();
void calNet(int, int);
void deltaChange(int, int);
void weightAndbiasChange(int);
void calMSE();
void printResult();
double sigmoid(double);
void saveWeight();
};
backpropagation::backpropagation()
{
learning_rate = 0.5;
nepoch = 10000;
error = 0.01;
momentum = 0.5;
nImages = 1;
}
backpropagation::backpropagation(double _learning_rate, int
_nepoch, double _error, double _momentum, int _nImages)
{
learning_rate= _learning_rate;
nepoch = _nepoch;
error = _error;
momentum = _momentum;
nImages = _nImages;
}
void backpropagation::init(double _X[PATTERN][NIN], double
_targetY[NOUT][NOUT], double _weightIH[NIN][NH], double
_weightHO[NH][NOUT], double _biasH[NH], double _biasY[NOUT],
double _deltaweightIH[NIN][NH], double _deltaweightHO[NH][NOUT],
int _total_epoch)
{
// Input data
int a, b, i, h, o, rndnum;
double beta, min, max, eucval, pembagi=10000.0;
total_epoch = _total_epoch;
// Inisialisasi X

83

for(a=0; a<nImages*10; a++)


{
for(b=0; b<NIN; b++)
{
X[a][b] = _X[a][b];
}
}cout << endl;
// Inisialisasi targetY
for(a=0; a<NOUT; a++)
{
for(b=0; b<NOUT; b++)
{
targetY[a][b] = _targetY[a][b];
}
}
// Inisialisasi weightIH
for(h=0; h<NH; h++)
{
for(i=0; i<NIN; i++)
{
weightIH[i][h] = _weightIH[i][h];
}
biasH[h] = _biasH[h];
}
// Inisialisasi weightHO
for(o=0; o<NOUT; o++)
{
for(h=0; h<NH; h++)
{
weightHO[h][o] = _weightHO[h][o];
}
biasY[o] = _biasY[o];
}
// Inisialisasi deltaweightIH
for(h=0; h<NH; h++)
{
for(i=0; i<NIN; i++)
{
deltaweightIH[i][h] = _deltaweightIH[i][h];
}
}
// Inisialisasi deltaweightHO
for(o=0; o<NOUT; o++)
{
for(h=0; h<NH; h++)
{
deltaweightHO[h][o] = _deltaweightHO[h][o];
}
}
}
bool backpropagation::training()
{
int p, o, numberTarget, a, b;
epoch=0;

84

do{
epoch++;
for(p=0; p<nImages*10; p++)
{
numberTarget = p / nImages;
calNet(p, numberTarget);
deltaChange(p, numberTarget);
weightAndbiasChange(p);
}
calMSE();
}while(!isFindSolution&&epoch<nepoch);
total_epoch += epoch;
return isFindSolution;
}
void backpropagation::calNet(int p, int numberTarget)
{
int i, h, o;
// Operasi pada hidden layer
for(h=0; h<NH; h++)
{
H[h] = 0.0;
for(i=0; i<NIN; i++)
{
H[h] += X[p][i] * weightIH[i][h];
}
H[h] += biasH[h];
// Fungsi Aktivasi
H[h] = sigmoid(H[h]);
}
// Operasi pada output layer
for(o=0; o<NOUT; o++)
{
Y[p][o] = 0.0;
for(h=0; h<NH; h++)
{
Y[p][o] += H[h] * weightHO[h][o];
}
Y[p][o] += biasY[o];
// Fungsi Aktivasi
Y[p][o] = sigmoid(Y[p][o]);
}
}
void backpropagation::deltaChange(int p, int numberTarget)
{
int h, o;
double sigmadeltaY;
// Hitung nilai deltaY
for(o=0; o<NOUT; o++)

85

{
deltaY[o] = (targetY[numberTarget][o]-Y[p][o]) * Y[p][o]
* (1.0-Y[p][o]);
}
// Hitung nilai deltaH
for(h=0; h<NH; h++)
{
sigmadeltaY = 0.0;
for(o=0; o<NOUT; o++)
{
sigmadeltaY += deltaY[o] * weightHO[h][o];
}
deltaH[h] = sigmadeltaY * H[h] * (1-H[h]);
}
}
void backpropagation::weightAndbiasChange(int p)
{
int i, h, o;
// Hitung perubahan bobot weightHO
for(h=0; h<NH; h++)
{
for(o=0; o<NOUT; o++)
{
deltaweightHO[h][o] = (learning_rate * deltaY[o] *
H[h]) + (momentum * deltaweightHO[h][o]);
weightHO[h][o] += deltaweightHO[h][o];
}
}
// Hitung perubahan bobot biasY
for(o=0; o<NOUT; o++)
{
biasY[o] += learning_rate * deltaY[o];
}
// Hitung perubahan bobot weightIH
for(i=0; i<NIN; i++)
{
for(h=0; h<NH; h++)
{
deltaweightIH[i][h] = (learning_rate * deltaH[h] *
X[p][i]) + (momentum * deltaweightIH[i][h]);
weightIH[i][h] += deltaweightIH[i][h];
}
}
// Hitung perubahan bobot biasH
for(h=0; h<NH; h++)
{
biasH[h] += learning_rate * deltaH[h];
}
}
void backpropagation::printResult()
{
int i, h, o, p, memorisasi;
if(isFindSolution)

86

{
cout << "Found Solution!" << endl;
}
else
{
cout << "Fail to find a solution" << endl;
}
memorisasi = 0;
for(p=0; p<nImages*10; p++)
{
// Ubah semua nilai Y menjadi 0 dan 1
for(o=0; o<NOUT; o++)
{
if(Y[p][o] >= 0.5)
{
Y[p][o] = 1;
}
else if (Y[p][o] < 0.5)
{
Y[p][o] = 0;
}
}
// Cek apakah Y = targetY
if(Y[p][0]==targetY[p/nImages][0] &&
Y[p][1]==targetY[p/nImages][1] &&
Y[p][2]==targetY[p/nImages][2] &&
Y[p][3]==targetY[p/nImages][3] &&
Y[p][4]==targetY[p/nImages][4] &&
Y[p][5]==targetY[p/nImages][5] &&
Y[p][6]==targetY[p/nImages][6] &&
Y[p][7]==targetY[p/nImages][7] &&
Y[p][8]==targetY[p/nImages][8] &&
Y[p][9]==targetY[p/nImages][9])
{
memorisasi ++;
}
}
cout << "Learning rate :
cout << "Momentum
:
cout << "MSE
:
cout << "Epoch
:
cout << "Total Epoch
:
cout << "Memorisasi
:
<< p-memorisasi << ") : " <<
endl;
}

" << learning_rate << endl;


" << momentum << endl;
" << mse << endl;
" << epoch << endl;
" << total_epoch<< endl;
" << memorisasi << "/" << p << "("
((double)memorisasi/p*100) << "%" <<

void backpropagation::calMSE()
{
int a, b;
mse = 0.0;
for(a=0; a<nImages*10; a++)
{
for(b=0; b<NOUT; b++)
{
mse += pow(Y[a][b]-targetY[a/nImages][b], 2);

87

}
}
mse = ((mse/2))/(nImages*10);
cout << "mse " << mse << endl;
if(mse>error)
isFindSolution = false;
else
isFindSolution = true;
}
double backpropagation::sigmoid(double x)
{
return 1.0/(1.0+exp(-x));
}
void backpropagation::saveWeight()
{
//Tuliskan array bobot dan bias ke dalam file weight.dat
ofstream out("weight.dat", ios::binary);
out.write((char *)&weightIH,sizeof(weightIH));
out.write((char *)&biasH,sizeof(biasH));
out.write((char *)&weightHO,sizeof(weightHO));
out.write((char *)&biasY,sizeof(biasY));
out.write((char *)&deltaweightIH,sizeof(deltaweightIH));
out.write((char *)&deltaweightHO,sizeof(deltaweightHO));
out.write((char *)&total_epoch,sizeof(total_epoch));
out.close();
}
int main ()
{
// Variabel untuk menghitung lama waktu training
clock_t startT, endT;
double timeT;
int total_epoch;
// Deklarasi array bobot input, hidden, output dan bias yang
akan di set ke class
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
double deltaweightIH[NIN][NH];
double deltaweightHO[NH][NOUT];
// Baca file weight.dat
ifstream in_weight("weight.dat", ios::binary);
in_weight.read((char*)&weightIH,sizeof(weightIH));
// Baca
weightIH
in_weight.read((char*)&biasH,sizeof(biasH));
// Baca biasH
in_weight.read((char*)&weightHO,sizeof(weightHO));
// Baca
weightHO
in_weight.read((char*)&biasY,sizeof(biasY));
// Baca biasY
in_weight.read((char*)&deltaweightIH,sizeof(deltaweightIH));
// Baca deltaweightIH
in_weight.read((char*)&deltaweightHO,sizeof(deltaweightHO));
// Baca deltaweightHO
in_weight.read((char*)&total_epoch,sizeof(total_epoch));
// Baca total_epoch

88

// Baca file input_jst.dat


ifstream in("data_latihan.dat", ios::binary);
int nImages;
in.read((char*)&nImages,sizeof(nImages));
// Baca nImages
int threshold;
in.read((char*)&threshold,sizeof(threshold));
double input_jst[10*nImages][NIN];
// array untuk
menyimpan final input untuk jst
in.read((char*)&input_jst,sizeof(input_jst));
// Baca input
JST
int nepoch;
double error;
double learning_rate;
double momentum;
double targetY[NOUT][NOUT] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
// Input parameter
cout << "Threshold = " << threshold << endl;
cout << "Jumal pola = " << nImages << endl;
cout << "nEpoch = "; cin >> nepoch;
cout << "Error = "; cin >> error;
cout << "Learning rate = "; cin >> learning_rate;
cout << "Momentum = "; cin >> momentum;
backpropagation BP(learning_rate, nepoch, error, momentum,
nImages);
cout << endl << "Inisialisasi :";
cout << endl << "========================" << endl;
BP.init(input_jst, targetY, weightIH, weightHO, biasH, biasY,
deltaweightIH, deltaweightHO, total_epoch);
cout << "OK" << endl;
system("pause");
cout << endl << "Training :";
cout << endl << "========================" << endl;
startT = clock();
BP.training();
endT = clock();
timeT = ((double)(endT - startT))/(double)CLOCKS_PER_SEC;
system("pause");
cout << endl << "Result :";
cout << endl << "========================" << endl;
BP.printResult();
cout << "Lama training : " << timeT << " s" << endl;
BP.saveWeight();
cout << endl << "Bobot disimpan." << endl;

89

in.close();
system("pause");
return 0;
}

5.

Testing.cpp
/*
Nama file : Testing.cpp
Deskrpisi : Program untuk melakukan pengujian jaringan yang
telah dilatih
Arsitektur : 123-96-10.
Fungsi Aktivasi : Sigmoid Biner
*/
#include
#include
#include
#include
#include
#include
#include

<iostream.h>
<ctype.h>
<stdlib.h>
<fstream.h>
<math.h>
<conio.h>
<string.h>

#define NIN 123


#define NH 96
#define NOUT 10

// jumlah neuron input


// jumlah neuron hidden
// jumlah neuron output

double sigmoid(double x)
{
return 1.0/(1.0+exp(-x));
}
int main()
{
int no_menu, p, i, h, o, a, b, numberTarget, generalisasi=0,
counter_output;
char file_input[20];
// Deklarasi array bobot input, hidden, output dan bias
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
// Baca file weight.dat
ifstream in_weight("weight.dat", ios::binary);
in_weight.read((char*)&weightIH,sizeof(weightIH));
// Baca
weightIH
in_weight.read((char*)&biasH,sizeof(biasH));
// Baca biasH
in_weight.read((char*)&weightHO,sizeof(weightHO));
// Baca
weightHO
in_weight.read((char*)&biasY,sizeof(biasY));
// Baca biasY
cout << "Pengujian :" << endl;
cout << "1. Memorisasi" << endl;
cout << "2. Generalisasi" << endl;
cout << "? ";
cin >> no_menu;

90

if(no_menu == 1)
{
strcpy(file_input,"data_latihan.dat");
}
else if(no_menu == 2)
{
strcpy(file_input,"data_uji.dat");
}
// Baca file data input jst
int nImages, threshold; //variabel jumlah image dan batas
threshold
ifstream in_data_jst(file_input, ios::binary);
in_data_jst.read((char*)&nImages,sizeof(nImages));
in_data_jst.read((char*)&threshold,sizeof(threshold));
double input_jst[10*nImages][NIN]; //array untuk menyimpan
final input untuk jst
in_data_jst.read((char*)&input_jst,sizeof(input_jst));
double H[NH];
double Y[10*nImages][NOUT];
// Deklarasi array untuk
menyimpan nilai output
double targetY[NOUT][NOUT] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
////////////////////////
// Proses Testing
for(p=0; p<nImages*10; p++)
{
numberTarget = p / nImages;
// Operasi pada hidden layer
for(h=0; h<NH; h++)
{
H[h] = 0.0;
for(i=0; i<NIN; i++)
{
H[h] += input_jst[p][i] * weightIH[i][h];
}
H[h] += biasH[h];
// Fungsi Aktivasi
H[h] = sigmoid(H[h]);
}
// Operasi pada output layer
for(o=0; o<NOUT; o++)
{
Y[p][o] = 0.0;
for(h=0; h<NH; h++)

91

{
Y[p][o] += H[h] * weightHO[h][o];
}
Y[p][o] += biasY[o];
// Fungsi Aktivasi
Y[p][o] = sigmoid(Y[p][o]);
}
// Tampilkan output
counter_output = 0;
cout << "Pola " << p << " : ";
for(o=0; o<NOUT; o++)
{
//cout << Y[p][o] << " ";
if(Y[p][o] >= 0.5)
{
Y[p][o] = 1;
cout << "1 ";
counter_output++;
}
else if (Y[p][o] < 0.5)
{
Y[p][o] = 0;
cout << "0 ";
}
}
cout << "
cout << "

Target = " << numberTarget << " ";


Output = ";

// Cek apakah Y = targetY


if(Y[p][0]==targetY[p/nImages][0] &&
Y[p][1]==targetY[p/nImages][1] &&
Y[p][2]==targetY[p/nImages][2] &&
Y[p][3]==targetY[p/nImages][3] &&
Y[p][4]==targetY[p/nImages][4] &&
Y[p][5]==targetY[p/nImages][5] &&
Y[p][6]==targetY[p/nImages][6] &&
Y[p][7]==targetY[p/nImages][7] &&
Y[p][8]==targetY[p/nImages][8] &&
Y[p][9]==targetY[p/nImages][9])
{
generalisasi++;
}
// Cek angka apa yang dikenali
if(counter_output == 1)
{
b=0;
for(a=9; a>=0; a--)
{
if(Y[p][a] == 1)
{
break;
}
else
{
b++;
}

92

}
cout << b;
}
else
cout << "-";
cout << endl;
// Pisahkan setiap kelompok angka
if((p+1) % 10 == 0)
cout << endl;
//system("pause");
}
//
///////////////////////
cout <<
cout <<
cout <<
cout <<
nImages*10
endl;

endl;
"Threshold = " << threshold << endl;
"Jumlah pola = " << nImages << endl;
"Generalisasi = " << generalisasi << "/" <<
<< " = " << (generalisasi*100)/(nImages*10) << "%" <<

in_data_jst.close();
in_weight.close();
system("pause");
return 0;
}

93

LAMPIRAN B : DATA SAMPEL

1.

Data latihan

Pola

Citra

Pola

Citra

Pola

Citra

Pola

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

Citra

94

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

95

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

96

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

97

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

98

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

99

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

100

2.

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

Data uji
Pola

Citra

Pola

Citra

Pola

Citra

Pola

10

11

12

13

Citra

101

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

102

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

103

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

Anda mungkin juga menyukai