Kompresi Sidik Jari Dengan Menggunakan Algoritma WSQ (Wavelet Scalar Quantization).

(1)

ABSTRAK

Seiring berkembangnya teknologi, digitalisasi sidik jari sudah sering

digunakan, terutama pada passport, ID Card, visa dan dokumen lainnya. Karena

kapasitas penyimpanan untuk menyimpan sidik jari sangat besar, maka dilakukan

kompresi sidik jari dalam tugas akhir ini. Teknik yang digunakan yaitu

menggunakan algoritma WSQ (Wavelet Scalar Quantization). WSQ adalah

metoda kompresi jenis lossy yang sesuai digunakan untuk menjaga resolusi yang

tinggi dari citra keabu-abuan ketika mempertahankan rasio kompresi yang tinggi.

Algoritma ini sudah digunakan oleh FBI sebagai standarisasi untuk

mentransmisikan dan menyimpan sidik jari yang telah didigitalisasi.

Ada 3 tahap utama dalam proses WSQ encoding dan decoding.

Tahap-tahap dalam WSQ encoding yaitu DWT, skalar kuantisasi, dan pengkodean

Huffman. Dan tahap-tahap dalam WSQ decoding yaitu pengkodean balik

Huffman, skalar dekuantisasi, dan IDWT. Pada tahap DWT, citra digital

dipisahkan dalam 64 spatial band frekuensi menggunakan 2-dimensi transformasi

wavelet diskrit dengan men-kaskade-kan berbagai jenis filter digital. Keluaran

DWT kemudian dikuantisasi menggunakan skalar kuantisasi. Pada tahap ini

terjadi kompresi lossy. Setelah itu, hasil keluaran dari DWT yang dikuantisasi

dikodekan menggunakan Huffman-coded (jenis entropy coding) untuk

meminimalkan jumlah bit yang diperlukan untuk ditransmisikan. Untuk

merekonstruksikan citra yang telah dikompresi, WSQ decoder melakukan

pengkodean balik Huffman, memetakan balik koefisien dari DWT yang

dikuantisasi. Setelah itu, dilakukan proses DWT balik.

Rasio kompresi citra fingerprint yang dihasilkan berkisar antara 9,7

sampai 12,06 untuk tingkat 1, 12,57 sampai 17,08 untuk tingkat 2, dan 13,78

sampai 17,16 untuk tingkat 3. Ukuran file hasil kompresi menggunakan

transformasi Wavelet tingkat 3 lebih kecil dibandingkan ukuran file yang

menggunakan transformasi Wavelet tingkat 2 dan 1. Namun pada transformasi

Wavelet tingkat 3 RMSE-nya lebih besar daripada transformasi Wavelet tingakat

1 dan 2.


(2)

ABSTRACT

With the rapid growth of technology, digital fingerprint has always been

used, especially in passport, ID Card, Visa and other documents. Because the

needs of the storage to store the fingerprint is very large, and the solution is using

fingerprint compression. The technique that used in compression is using WSQ

(Wavelet Scalar Quantization) algorithm. WSQ is a lossy compression method

that is well-suited for preserving the very high resolution details of grayscale

images. This algorithm has been adopted by the FBI as its standard for

transmitting and storing digitized fingerprints.

There are 3 steps involved in WSQ encoding and decoding. The steps in

WSQ encoding are DWT, Scalar Quantization, and Huffman coding. And the

steps in WSQ decoding are Huffman decoding, Scalar Dequantization, and IDWT.

In the DWT step, the digital image is split into 64 spatial frequency bands by a

2-dimensional discrete wavelet transform, which is a cascaded digital filter bank.

The output of the DWT is then truncated (“quantized”) by the scalar quantization

step; this is the irreversible, “lossy” part of the process. Finally, the quantized

DWT output is Huffman-coded (a form of “entropy coding”) to minimize the

number of bits that need to be transmitted. To reconstruct the image after

compression, the WSQ decoder undoes the Huffman coding, maps the quantized

DWT coefficients back to close approximations of their original values, and runs

these quantized DWT coefficients through an inverse DWT.

The result compression ratio from fingerprints among 9,7 – 12,06 for level

1, 12,57 – 17,08 for level 2, and 13,78 – 17,16 for level 3. The size of the

compression files using wavelet transforms level 3 smaller than size of the

compression files using wavelet transforms level 1 and 2. The RSME using

wavelet transforms level 3 is greater than wavelet transforms level 1 and 2.


(3)

DAFTAR ISI

Halaman

LEMBAR PENGESAHAN

SURAT PERNYATAAN

ABSTRAK

i

ABSTRACT

ii

KATA PENGANTAR

iii

DAFTAR ISI

v

DAFTAR TABEL

vii

DAFTAR GAMBAR

viii

BAB I PENDAHULUAN

1

1.1

Latar Belakang

1

1.2

Tujuan

1

1.3

Identifikasi Masalah

2

1.4

Pembatasan Masalah

2

1.5

Sistematika Pembahasan

2

BAB II TEORI PENUNJANG

3

2.1

Citra

3

2.2

Ukuran File Suatu Citra

3

2.3

Kompresi

4

2.4

Transformasi Wavelet

6

2.5

Transformasi Wavelet Diskrit (DWT)

8

2.6

Kuantisasi

14

2.6.1

Representasi Nilai Dengan Penguantisasi

14

2.7

Huffman Coding

17

2.8

Program Matlab

19

BAB III PERANCANGAN PERANGKAT LUNAK

21

3.1

Diagram Blok Proses Kompresi dan Dekompresi

21

3.2

Diagram Alir Proses Kompresi dan Dekompresi

22


(4)

Halaman

3.4

Kuantisasi Skalar

32

3.5

Pengkodean (Huffman Coding)

34

3.6

Tampilan Perangkat Lunak Menggunakan Program Matlab

35

3.6.1

Tampilan Menu Utama Perangkat Lunak

35

3.6.2

Perangkat Lunak Kompresi

36

3.6.3

Perangkat Lunak Dekompresi

37

3.6.4

Tampilan Hasil Pada Proses Kompresi

37

3.7.4.1 Tampilan Hasil Pada Proses DWT

38

3.7.4.2 Tampilan Hasil Pada Proses Kuantisasi

39

3.7.5 Tampilan Hasil Pada Proses Dekompresi

40

3.7.5.1 Tampilan Hasil Pada Proses Pengkodean Balik

40

3.7.5.2 Tampilan Hasil Pada Proses Dekuantisasi

41

3.7.5.3 Tampilan Hasil Pada Proses IDWT

43

3.76

Tampilan Citra Asli dengan Citra Hasil Rekonstruksi

43

BAB IV DATA PENGAMATAN

45

BAB V KESIMPULAN DAN SARAN

52

5.1 Kesimpulan

52

5.2 Saran

52

DAFTAR PUSTAKA

x

LAMPIRAN

A

LISTING PROGRAM

A-1

B

CITRA ASLI DAN CITRA HASIL DEKOMPRESI

B-1

C

TAMPILAN HASIL PENCARIAN SIDIK JARI

C-1


(5)

DAFTAR TABEL

Halaman

Tabel 2.1. Koefisien untuk filter H dan filter G

10

Tabel 2.2. Tabel simbol yang telah diurutkan berdasarkan probabilitasnya

17

Tabel 2.3. Tabel kode hasil kompresi menggunakan Huffman coding

18

Tabel 2.4. Tabel jumlah bit informasi

18

Tabel 2.5. Tabel jumlah bit yang dibutuhkan untuk menyimpan informasi

dengan menggunakan algoritma Huffman coding 19

Tabel 3.1. Filter Transformasi Wavelet Maju

24

Tabel 3.2. Filter Transformasi Wavelet Balik

25

Tabel 3.3. Perencanaan untuk menulis dan membaca VLIC

35

Tabel 4.1. Data pengamatan kompresi dengan transformasi wavelet tingkat 1 48

Tabel 4.2. Data pengamatan kompresi dengan transformasi wavelet tingkat 2 48

Tabel 4.3. Data pengamatan kompresi dengan transformasi wavelet tingkat 3 49


(6)

DAFTAR GAMBAR

Halaman

Gambar 2.1. Proses kompresi jenis lossy secara umum

5

Gambar 2.2. Proses dekompresi jenis lossy secara umum

5

Gambar 2.3. (a) Analisa pada domain waktu, (b) Analisa pada domain

frekuensi, (c) Analisa dengan menggunakan STFT,

(d) Analisa dengan menggunakan Wavelet

7

Gambar 2.4. (a) Gelombang sinus, (b) Wavelet

8

Gambar 2.5. Transformasi Wavelet Maju

12

Gambar 2.6. Transformasi Wavelet Balik

13

Gambar 2.7. Kuantisasi dengan representasi nilai

14

Gambar 2.8. Kuantisasi Skalar

16

Gambar 2.9. Pohon hasil kompresi Huffman coding 18

Gambar 3.1. Diagram blok proses kompresi dengan algoritma WSQ

21

Gambar 3.2. Diagram blok proses dekompresi dengan algoritma WSQ

21

Gambar 3.3. Diagram alir proses kompresi

22

Gambar 3.4. Diagram alir proses dekompresi

23

Gambar 3.5. Diagram alir transformasi wavelet maju

26

Gambar 3.6. Diagram alir transformasi wavelet maju tingkat 1

26

Gambar 3.7. Diagram alir transformasi wavelet maju tingkat 2

27

Gambar 3.8. Diagram alir transformasi wavelet maju tingkat 3

28

Gambar 3.9. Diagram alir transformasi wavelet balik

29

Gambar 3.10. Diagram alir transformasi wavelet balik tingkat 1

29

Gambar 3.11. Diagram alir transformasi wavelet balik tingkat 2

30

Gambar 3.12. Diagram alir transformasi wavelet balik tingkat 2

30

Gambar 3.13. Dekomposisi pada tingkat 1

31

Gambar 3.14. Dekomposisi pada tingkat 2

31

Gambar 3.15. Dekomposisi pada tingkat 3

31

Gambar 3.16 Diagram alir proses kuantisasi

33

Gambar 3.17 Diagram alir proses dekuantisasi

33


(7)

Halaman

Gambar 3.18. Diagram alir Huffman coding 34

Gambar 3.19. Tampilan menu utama

36

Gambar 3.20. Tampilan menu kompresi

36

Gambar 3.21. Tampilan menu dekompresi

37

Gambar 3.22. Tampilan matrix citra asli

37

Gambar 3.23. Tampilan matrix nilai LL hasil DWT

38

Gambar 3.24. Tampilan matrix nilai LH hasil DWT

38

Gambar 3.25. Tampilan matrix nilai HL hasil DWT

38

Gambar 3.26. Tampilan matrix nilai HH hasil DWT

39

Gambar 3.27. Nilai LL yang dikuantisasi

39

Gambar 3.28. Nilai LH yang dikuantisasi

39

Gambar 3.29. Nilai HL yang dikuantisasi

40

Gambar 3.30. Nilai HH yang dikuantisasi

40

Gambar 3.31. Nilai hasil kuantisasi LL yang dilakukan pengkodean balik

40

Gambar 3.32. Nilai hasil kuantisasi LH yang dilakukan pengkodean balik

41

Gambar 3.33. Nilai hasil kuantisasi HL yang dilakukan pengkodean balik

41

Gambar 3.34. Nilai hasil kuantisasi HH yang dilakukan pengkodean balik

41

Gambar 3.35. Nilai hasil dekuantisasi dari LL

42

Gambar 3.36. Nilai hasil dekuantisasi dari LH

42

Gambar 3.37. Nilai hasil dekuantisasi dari HL

42

Gambar 3.38. Nilai hasil dekuantisasi dari HH

42

Gambar 3.39. Hasil transformasi balik tingkat 1

43

Gambar 3.40. (a) Tampilan citra asli pada perangkat lunak ; (b) Tampilan

citra hasil rekonstruksi tingkat 1 pada perangkat lunak

44

Gambar 4.1. Citra asli finger_1.bmp (310x393 piksel)

46

Gambar 4.2. (a) Citra finger_1.bmp mengalami proses transformasi

tingkat 1 ; (b) Citra hasil dekompresi tingkat 1

46

Gambar 4.3. (a) Citra finger_1.bmp mengalami proses transformasi

tingkat 2 ; (b) Citra hasil dekompresi tingkat 2

47

Gambar 4.4. (a) Citra finger_1.bmp mengalami proses transformasi


(8)

LAMPIRAN A

LISTING PROGRAM


(9)

Algoritma menu utama fcompher.m

clear all; clc;

form1=figure(... 'units','points',...

'position',[100 150 303 306],... 'color',[.8 .8 .9],...

'menubar','none',... 'resize','off',... 'numbertitle','off',...

'name','Software For Fingerprint Compression'); i = imread('front.bmp'); imshow(i,'truesize'); menu1=uimenu('parent',form1,'Label','File'); menu11=uimenu('parent',menu1,'Label','Open','Callback','menuopen'); menu12=uimenu('parent',menu1,'Label','Close','Callback','close'); menu13=uimenu('parent',menu1,'Label','Exit','Callback','close'); menu2=uimenu('parent',form1,'Label','View'); menu3=uimenu('parent',form1,'Label','Tools'); menu31=uimenu('parent',menu3,'Label','Compress','Callback','kompres'); menu32=uimenu('parent',menu3,'Label','Decompress','Callback','dekompres'); menu4=uimenu('parent',form1,'Label','Help'); menu41=uimenu('parent',menu4,'Label','About');

Algoritma menu kompres.m

formkomp=figure('units','points','position',[120 250 450 150],'color',[.8 .8 .9], 'menubar','none','resize','off','numbertitle','off','name','Compress');

label1=uicontrol('parent',formkomp,'units','points','position',[5 120 100 15], 'backgroundcolor',[.8 .8 .9],'style','Text','string','Input File Name ',

'fontname','arial','fontsize',10);

edit1=uicontrol('parent',formkomp,'units','points','position',[100 120 250 15], 'backgroundcolor',[1 1 1],'style','Edit','string','','horizontalalignment','left', 'fontname','arial','fontsize',10);

label2=uicontrol('parent',formkomp,'units','points','position',[5 90 100 15], 'backgroundcolor',[.8 .8 .9],'style','Text','string','Output File Name', 'fontname','arial','fontsize',10);

edit2=uicontrol('parent',formkomp,'units','points','position',[100 90 250 15], 'backgroundcolor',[1 1 1],'style','Edit','string','','horizontalalignment','left', 'fontname','arial','fontsize',10);

tombol_ok=uicontrol('parent',formkomp,'units','points','position',[70 40 60 15], 'style','pushbutton','string','Ok','fontname','arial','fontsize',10,

'callback','fungcomp');

tombol_cancel=uicontrol('parent',formkomp,'units','points',

'position',[150 40 60 15],'style','pushbutton','string','Cancel','fontname','arial', 'fontsize',10,'callback','close');


(10)

tombol_browse1=uicontrol('parent',formkomp,'units','points',

'position',[360 120 50 15],'style','pushbutton','string','Browse','fontname','arial', 'fontsize',10,'callback','pathload');

tombol_browse2=uicontrol('parent',formkomp,'units','points','position',[360 90 50 15],'style','pushbutton','string','Browse','fontname','arial','fontsize',10,'callback','pathsa ve');

label3=uicontrol('parent',formkomp,'units','points','position',[5 60 650 15], 'backgroundcolor',[.8 .8 .9],'style','Text','string','Level',

'fontname','arial','fontsize',10);

popup1=uicontrol('parent',formkomp,'units','points','position',[355 60 40 15], 'backgroundcolor',[1 1 1],'style','popupmenu','string',' 1| 2| 3',

'fontname','arial','fontsize',10);

proses=uicontrol('parent',formkomp,'units','points','position',[0 0 650 15], 'backgroundcolor',[.8 .8 .9],'style','Text','horizontalalignment','Left', 'string','','fontname','arial','fontsize',10);

Algoritma menu Dekompres.m

formdekomp=figure('units','points', 'position',[120 250 450 150], 'color',[.8 .8 .9], 'menubar','none','resize','off','numbertitle','off','name','Decompress');

label1=uicontrol('parent',formdekomp,'units','points','position',[5 120 100 15],... 'backgroundcolor',[.8 .8 .9],'style','Text','string','Input File Name ',

'fontname','arial','fontsize',10);

edit1=uicontrol('parent',formdekomp,'units','points', 'position',[100 120 250 15], 'backgroundcolor',[1 1 1],'style','Edit', 'string','','horizontalalignment','left', 'fontname','arial','fontsize',10);

label2=uicontrol('parent',formdekomp,'units','points','position',[5 90 100 15], 'backgroundcolor',[.8 .8 .9],'style','Text','string','Output File Name', 'fontname','arial','fontsize',10);

edit2=uicontrol('parent',formdekomp,'units','points','position',[100 90 250 15], 'backgroundcolor',[1 1 1],'style','Edit','string','','horizontalalignment','left', 'fontname','arial','fontsize',10);

tombol_ok=uicontrol('parent',formdekomp,'units','points','position',[70 40 60 15], 'style','pushbutton','string','Ok','fontname','arial','fontsize',10,'callback','fungdecomp'); tombol_cancel=uicontrol('parent',formdekomp,'units','points','position',[150 40 60 15], 'style','pushbutton','string','Cancel','fontname','arial','fontsize',10,'callback','close'); tombol_browse1=uicontrol('parent',formdekomp,'units','points',

'position',[360 120 50 15],'style','pushbutton','string','Browse', 'fontname','arial','fontsize',10,'callback','pathloaddekom');


(11)

tombol_browse2=uicontrol('parent',formdekomp,'units','points', 'position',[360 90 50 15],'style','pushbutton','string','Browse', 'fontname','arial','fontsize',10,'callback','pathsavedekom');

proses=uicontrol('parent',formdekomp,'units','points','position',[0 0 650 15], 'backgroundcolor',[.8 .8 .9], 'style','Text', 'horizontalalignment','Left', 'string','', 'fontname','arial','fontsize',10);

Algoritma pathload.m

filenamex = ''; pathnamex = '';

[filenamex, pathnamex] = uigetfile( ...

{'*.bmp','BMP Files (*.bmp)'}, 'Choose a Image File'); text1 = [pathnamex filenamex];

set(edit1,'string',text1);

Algoritma pathsave.m

filenamey = ''; pathnamey = '';

[filenamey, pathnamey, filterindex] = uiputfile( ...

{'*.mat','Compressed Fingerprint Files (*.mat)'},'Save as'); text2=[pathnamey filenamey];

set(edit2,'string',text2)

;

Algoritma pathloaddekom.m

filenameq = ''; pathnameq = '';

[filenameq, pathnameq] = uigetfile( ...

{'*.mat','Compressed Fingerprint Files (*.mat)'}, 'Choose a Fingerprint Compressed File');

text1 = [pathnameq filenameq]; set(edit1,'string',text1);

Algoritma pathsavedekom.m

filenamez = ''; pathnamez = '';

[filenamez, pathnamez, filterindex] = uiputfile( ... {'*.bmp','BMP Files (*.bmp)'}, 'Save as');

text2=[pathnamez filenamez]; set(edit2,'string',text2);


(12)

Algoritma fungkom.m

location1=get(edit1,'String');location2=get(edit2,'String');pilihan=get(popup1,'Value'); a=''; wname='bior5.5';

if (isequal(location1,a) || isequal(location2,a))

disp('The Input and Output FileName must be Fill') else

set(proses,'backgroundcolor',[.5 .7 .9],... 'string',' Processing...');

[i,map]=imread(location1); y=rgb2gray(i); sx = size(y); switch pilihan

case 1

[cA1,cH1,cV1,cD1] = dwt2(y,wname); cA1_quant = uniquant(cA1,10,1,255); cH1_quant = uniquant(cH1,10,1,255); cV1_quant = uniquant(cV1,10,1,255); cD1_quant = uniquant(cD1,10,1,255); [ukuran1,hasil1] = huffcoding(cA1_quant); [ukuran2,hasil2] = huffcoding(cH1_quant); [ukuran3,hasil3] = huffcoding(cV1_quant); [ukuran4,hasil4] = huffcoding(cD1_quant); [hh,ww] = size(i); ukuran = int2str(hh*ww*8);

figure('name',['Original image (ukuran file(bits) = ' ukuran ')']), imshow(y,'truesize'); namafile=[filenamey];

file = [pathnamey namafile];

save(file,'hasil1','hasil2','hasil3','hasil4','pilihan','map','sx'); case 2

[C,S] = wavedec2(y,2,wname); C_quant = uniquant(C,10,1,255); [ukuran,hasil] = huffcoding(C_quant); [hh,ww] = size(i);

ukuran2 = int2str(hh*ww*8);

figure('name',['Original image (ukuran file(bits) = ' ukuran2 ')']), imshow(y,'truesize');

namafile=[filenamey]; file = [pathnamey namafile];

save(file,'hasil','pilihan','map','sx','S'); case 3

[C,S] = wavedec2(y,3,wname); C_quant = uniquant(C,10,1,255); [ukuran,hasil] = huffcoding(C_quant); [hh,ww] = size(i);

ukuran2 = int2str(hh*ww*8);

figure('name',['Original image (ukuran file(bits) = ' ukuran2 ')']), imshow(y,'truesize');

namafile=[filenamey]; file = [pathnamey namafile];

save(file,'hasil','pilihan','map','sx','S'); end;


(13)

Algoritma fungdekomp.m

location1=get(edit1,'String');location2=get(edit2,'String'); a='';b=1;wname='bior5.5';

if (isequal(location1,a) || isequal(location2,a))

disp('The Input and Output FileName must be Fill') b=2;

else

set(proses,'backgroundcolor',[.5 .7 .9],'string',' Processing...'); load(location1);

switch pilihan case 1

decodehuf_1 = huffdecoding(hasil1); decodehuf_2 = huffdecoding(hasil2); decodehuf_3 = huffdecoding(hasil3); decodehuf_4 = huffdecoding(hasil4); dequant_1 = uniquant(decodehuf_1,10,1); dequant_2 = uniquant(decodehuf_2,10,1); dequant_3 = uniquant(decodehuf_3,10,1); dequant_4 = uniquant(decodehuf_4,10,1);

X0 = idwt2(dequant_1,dequant_2,dequant_3,dequant_4,wname,sx); [hh,ww] = size(X0);

ukuran2 = int2str(hh*ww*24);

figure('name',['Fingerprint after decoding (ukuran file(bits) = ' ukuran2')']), imshow(X0,map,'truesize');

case 2

decodehuf = huffdecoding(hasil); C = uniquant(decodehuf,10,1); X0 = waverec2(C,S,wname); [hh,ww] = size(X0);

ukuran2 = int2str(hh*ww*24);

figure('name',['Fingerprint after decoding (ukuran file(bits) = ' ukuran2')']), imshow(X0,map,'truesize');

case 3

decodehuf = huffdecoding(hasil); C = uniquant(decodehuf,10,1); XO = waverec2(C,S,wname); [hh,ww] = size(X0);

ukuran2 = int2str(hh*ww*24); close;

figure('name',['Fingerprint after decoding (ukuran file(bits) = ' ukuran2')']), imshow(X0,map,'truesize');

end; end;

if isequal(b,1)

namafile=[filenamez '.bmp']; file = [pathnamez namafile]; frame = getframe(gcf); imwrite(frame.cdata,file); end;


(14)

Algoritma dwt2.m

function [a,h,v,d] = dwt2(x,varargin) if ischar(varargin{1})

[Lo_D,Hi_D] = wfilters(varargin{1},'d'); else

Lo_D = varargin{1}; Hi_D = varargin{2}; end

sx = size(x); shift = 2; sizeKEPT = 2*ceil(sx/2); z = wconv('row',x,Lo_D);

a = convdown(z,Lo_D,sizeKEPT,shift); h = convdown(z,Hi_D,sizeKEPT,shift); z = wconv('row',x,Hi_D);

v = convdown(z,Lo_D,sizeKEPT,shift); d = convdown(z,Hi_D,sizeKEPT,shift); % Internal Function(s)

function y = convdown(x,f,sizeKEPT,shift) y = wconv('col',x,f);

y = wkeep(y,sizeKEPT); y = dyaddown(y,'col',shift); y = dyaddown(y,'row',shift);

Algoritma idwt2.m

function x = idwt2(a,h,v,d,varargin) if ischar(varargin{1})

[Lo_R,Hi_R] = wfilters(varargin{1},'r'); else

Lo_R = varargin{1}; Hi_R = varargin{2}; end

k=2;

while k<=length(varargin) if ischar(varargin{k}) k = k+2;

else

sx = varargin{k}; k = k+1; end

end

x = upsaconv('2D',a,{Lo_R,Lo_R},sx)+ ... % Approximation. upsaconv('2D',h,{Hi_R,Lo_R},sx)+ ... % Horizontal Detail. upsaconv('2D',v,{Lo_R,Hi_R},sx)+ ... % Vertical Detail. upsaconv('2D',d,{Hi_R,Hi_R},sx); % Diagonal Detail.


(15)

Algoritma wavedec2

function [c,s] = wavedec2(x,n,varargin) if nargin==3

[Lo_D,Hi_D] = wfilters(varargin{1},'d'); else

Lo_D = varargin{1}; Hi_D = varargin{2}; end

s = [size(x)]; c = []; for i=1:n

[x,h,v,d] = dwt2(x,Lo_D,Hi_D); % decomposition c = [h(:)' v(:)' d(:)' c]; % store details

s = [size(x);s]; % store size end

% Last approximation. c = [x(:)' c];

s = [size(x);s];

Algoritma waverec2.m

function x = waverec2(c,s,varargin) x = appcoef2(c,s,varargin{:},0);

Algoritma appcoef2.m

function a = appcoef2(c,s,varargin) rmax = size(s,1);

nmax = rmax-2; if ischar(varargin{1})

[Lo_R,Hi_R] = wfilters(varargin{1},'r'); else

Lo_R = varargin{1}; Hi_R = varargin{2} end

next = 2;

if nargin>=(2+next) , n = varargin{next}; else, n = nmax; end nl = s(1,1);

nc = s(1,2); a = zeros(nl,nc); a(:) = c(1:nl*nc); rm = rmax+1; for p=nmax:-1:n+1

[h,v,d] = detcoef2(c,s,p);

a = idwt2(a,h,v,d,Lo_R,Hi_R,s(rm-p,:)); end


(16)

Algoritma detcoef2.m

function varargout = detcoef2(c,s,n) k = size(s,1)-n;

first = s(1,1)*s(1,2)+3*sum(s(2:k-1,1).*s(2:k-1,2))+1; add = s(k,1)*s(k,2);

last = first+add-1;

varargout{1} = reshape(c(first:last),s(k,:)); first = first+add; last = first+add-1;

varargout{2} = reshape(c(first:last),s(k,:)); first = first+add; last = first+add-1;

varargout{3} = reshape(c(first:last),s(k,:));

Algoritma uniquant.m

function Y = UniQuant(X, del, thr, ymax) S=sign(X); X=abs(X);

if (nargin == 4) % kuantisasi dari X menjadi Y Y=floor((X-thr)/del)+1;

ymax=floor(ymax); I=find(Y>ymax); Y(I)=ymax; elseif (nargin == 3) % Dekuantisasi dari X menjadi Y Y=zeros(size(X)); I=find(X);

Y(I)=(X(I)*del)+(thr-del/2); else

error(‘jumlah input tidak sesuai’]); end

Y=Y.*S; return

Algoritma huffcoding.m

function [ukuranbit,hasil] = huffcoding(x) speed = 0;

level = 8; doubX = double(x); doubX = ceil(doubX);

[CompK,CompL]=size(doubX);

vecCompImg = mat2vec(doubX,level,CompK,CompL); [y,Res]=huff06(vecCompImg,level,speed);

ukuranbit = int2str(Res(CompK+1,3)); hasil = y;

Algoritma huffdecoding.m

function decodehuf = huffcoding(x) y=huff06(x);

uk = cell2mat(y(1)); matdecode = cell2mat(y);


(17)

Algoritma hufflen.m

function HL = HuffLen(S) if (length(S)==0) HL=0; return; end I=find(S<0); S(I)=0; if (sum(S)==max(S)) HL=zeros(size(S)); return; end

HL=zeros(size(S)); S=S(:); Ip=find(S>0); Sp=S(Ip);

N=length(Sp); HLp=zeros(size(Sp)); C=[Sp(:);zeros(N-1,1)]; Top=1:N; [So,Si]=sort(-Sp); last=N; next=N+1; while (last > 1)

C(next)=C(Si(last))+C(Si(last-1)); I=find(Top==Si(last));

HLp(I)=HLp(I)+1; Top(I)=next; I=find(Top==Si(last-1));

HLp(I)=HLp(I)+1; Top(I)=next; last=last-1; Si(last)=next; next=next+1; count=last-1;

while ((count> 0) & (C(Si(count+1)) >= C(Si(count)))) temp=Si(count); Si(count)=Si(count+1); Si(count+1)=temp; count=count-1; end end HL(Ip)=HLp; return;

Algoritma hufftablen.m

function HLlen = HuffTabLen(HL) if (nargin ~= 1);

error(‘Fungsi harus mempunyai satu input.’); end

if (nargout ~= 1);

error('Fungsi harus mempunyai satu input.’); end

HL=HL(:); Prev=2;HLlen=0; ZeroCount=0; L=length(HL);


(18)

for l=1:L if HL(l)==0

ZeroCount=ZeroCount+1; else

while (ZeroCount > 0)

if ZeroCount<3; HLlen=HLlen+5*ZeroCount; ZeroCount=0; elseif ZeroCount<19; HLlen=HLlen+11; ZeroCount=0; elseif ZeroCount<275; HLlen=HLlen+15; ZeroCount=0; else HLlen=HLlen+15; ZeroCount=ZeroCount-274; end; end

if HL(l)>16

HLlen=HLlen+11; else

Inc=HL(l)-Prev;

if Inc<0; Inc=Inc+16; end; if (Inc==0); HLlen=HLlen+1; elseif (Inc==1); HLlen=HLlen+2; elseif (Inc==2); HLlen=HLlen+5; elseif (Inc==15); HLlen=HLlen+4; else HLlen=HLlen+7; end Prev=HL(l); end end end HLlen=HLlen+7; return;

Algoritma huffcode.m

function HK = HuffCode(HL) N=length(HL);

L=max(HL); HK=zeros(N,L); [HLs,HLi] = sort(HL); Code=zeros(1,L); for n=1:N

if (HLs(n)>0)

HK(HLi(n),:) = Code; k = HLs(n);

while (k>0) Code(k) = Code(k) + 1; if (Code(k)==2) Code(k) = 0; k=k-1; else break end end end end


(19)

Algoritma hufftree.m

function Htree = HuffTree(HL,HK) if nargin<1

error('hufftree error.'); end

if nargin<2

HK = huffcode(HL); end N=length(HL); Htree=zeros(N*2,3); root=1; next=2; for n=1:N if HL(n)>0 pos=root; for k=1:HL(n)

if ((Htree(pos,1)==0) & (Htree(pos,2)==0)) Htree(pos,2)=next; Htree(pos,3)=next+1; next=next+2; end if HK(n,k) pos=Htree(pos,3); else pos=Htree(pos,2); end end Htree(pos,1)=1; Htree(pos,2)=n; end end if N==1 Htree(1,3)=2; end return

Algoritma huff06.m

function varargout = Huff06(xC, ArgLevel, ArgSpeed) global y Byte BitPos Speed Level

if (nargin < 1);

error(‘Fungsi harus mempunyai input.’]); end

if (nargout < 1);

error(‘Fungsi harus mempunyai output.’]); end

if (~iscell(xC))


(20)

y=xC(:); else

Encode=1;Decode=0; Speed=0;

Level=8;

NumOfX = length(xC); end if Encode Res=zeros(NumOfX,4); y=zeros(10,1); Byte=0;BitPos=1; PutVLIC(NumOfX); Ltot=0; for num=1:NumOfX x=xC{num}; x=full(x(:)); L=length(x);Ltot=Ltot+L; y=[y(1:Byte);zeros(50+2*L,1)]; maxx=max(x); minx=min(x); Negative=0;

if ( (((maxx*4)>L) | (maxx>1023)) & (L>1) & (maxx>minx)) LogCode=1; else LogCode=0; end PutBit(LogCode); PutBit(Negative); I=find(x); x=abs(x); if LogCode xa=x; x(I)=floor(log2(x(I))); xa(I)=xa(I)-2.^x(I); x(I)=x(I)+1; end [bits, ent]=EncodeVector(x); if LogCode for i=1:L for ii=(x(i)-1):(-1):1 PutBit(bitget(xa(i),ii)); end end bits=bits+sum(x)-length(I); ent=ent+(sum(x)-length(I))/L; end

if L>0; Res(num,1)=L; else Res(num,1)=1; end; Res(num,2)=ent;

Res(num,3)=bits; end


(21)

y=y(1:Byte); varargout(1) = {y}; if (nargout >= 2)

if Ltot<1; Ltot=1; end; Res(NumOfX+1,3)=Byte*8; Res(NumOfX+1,1)=Ltot;

Res(NumOfX+1,2)=sum(Res(1:NumOfX,1).*Res(1:NumOfX,2))/Ltot; Res(:,4)=Res(:,3)./Res(:,1);

varargout(2) = {Res}; end end if Decode Byte=0;BitPos=1; NumOfX=GetVLIC; xC=cell(NumOfX,1); for num=1:NumOfX LogCode=GetBit; Negative=GetBit; x=DecodeVector; L=length(x); I=find(x); if Negative Sg=zeros(size(I));

for i=1:length(I); Sg(i)=GetBit; end; Sg=Sg*2-1; else Sg=ones(size(I)); end if LogCode xa=zeros(L,1); for i=1:L for ii=2:x(i) xa(i)=2*xa(i)+GetBit; end end x(I)=2.^(x(I)-1); x=x+xa; end x(I)=x(I).*Sg; xC{num}=x; end

varargout(1) = {xC}; end

return

function [bits, ent] = EncodeVector(x, bits, HL, Maxx, Meanx) global y Byte BitPos Speed Level

Level = Level - 1; MaxL=50000;


(22)

L=length(x); if L==0 PutBit(0); PutVLIC(L); PutBit(0); bits=2+6; ent=0;

Level = Level + 1; return end if L==1 PutBit(0); PutVLIC(L); PutVLIC(x(1)); bits=1+2*6;

if (x(1)>=16); bits=bits+4; end; if (x(1)>=272); bits=bits+4; end; if (x(1)>=4368); bits=bits+5; end; if (x(1)>=69904); bits=bits+5; end; if (x(1)>=1118480); bits=bits+4; end; ent=0;

Level = Level + 1; return

end

if max(x)==min(x) PutBit(0); PutVLIC(L);

for i=1:7; PutBit(1); end; PutVLIC(x(1));

bits=1+6+7+6;

if (x(1)>=16); bits=bits+4; end; if (x(1)>=272); bits=bits+4; end; if (x(1)>=4368); bits=bits+5; end; if (x(1)>=69904); bits=bits+5; end; if (x(1)>=1118480); bits=bits+4; end; if (L>=16); bits=bits+4; end;

if (L>=272); bits=bits+4; end; if (L>=4368); bits=bits+5; end; if (L>=69904); bits=bits+5; end; if (L>=1118480); bits=bits+4; end; ent=0;

Level = Level + 1; return end I=find(x); if (L/2-length(I))>50 Maxx=max(x); Hi=IntHist(x,0,Maxx); Hinz=nonzeros(Hi); ent=log2(L)-sum(Hinz.*log2(Hinz))/L; x2=x(I);


(23)

I=[I(:);L+1];

for i=length(I):(-1):2; I(i)=I(i)-I(i-1); end; x1=I-1; % the runs

if Speed Byte=Byte+1; else PutBit(0); PutVLIC(0); PutBit(1); end;

[bits1, temp] = EncodeVector(x1); [bits2, temp] = EncodeVector(x2); bits=bits1+bits2+8;

Level = Level + 1; return end if (nargin==1) Maxx=max(x); Meanx=mean(x); Hi=IntHist(x,0,Maxx); Hinz=nonzeros(Hi); ent=log2(L)-sum(Hinz.*log2(Hinz))/L; HL=HuffLen(Hi); HLlen=HuffTabLen(HL); bits=6+HLlen+sum(HL.*Hi); if (L>=16); bits=bits+4; end; if (L>=272); bits=bits+4; end; if (L>=4368); bits=bits+5; end; if (L>=69904); bits=bits+5; end; if (L>=1118480); bits=bits+4; end; else ent=0; end if (L>MaxL) L1=ceil(L/2);L2=L-L1; x1=x(1:L1);x2=x((L1+1):L); elseif ((Level > 0) & (L>10)) xm=median(x);

x1=zeros(L,1);x2=zeros(L,1); x2(1)=x(1);i1=0;i2=1; for i=2:L

if (x(i-1) <= xm) i1=i1+1; x1(i1)=x(i); else i2=i2+1; x2(i2)=x(i); end end x1=x1(1:i1);x2=x2(1:i2); L1=length(x1);L2=length(x2); Maxx1=max(x1);Maxx2=max(x2);


(24)

Meanx1=mean(x1);Meanx2=mean(x2); Hi1=IntHist(x1,0,Maxx1); Hi2=IntHist(x2,0,Maxx2); HL1=hufflen(Hi1);HL2=hufflen(Hi2); HLlen1=HuffTabLen(HL1); HLlen2=HuffTabLen(HL2); bits1=6+HLlen1+sum(HL1.*Hi1); bits2=6+HLlen2+sum(HL2.*Hi2); if (L1>=16); bits1=bits1+4; end; if (L1>=272); bits1=bits1+4; end; if (L1>=4368); bits1=bits1+5; end; if (L1>=69904); bits1=bits1+5; end; if (L1>=1118480); bits1=bits1+4; end; if (L2>=16); bits2=bits2+4; end; if (L2>=272); bits2=bits2+4; end; if (L2>=4368); bits2=bits2+5; end; if (L2>=69904); bits2=bits2+5; end; if (L2>=1118480); bits2=bits2+4; end; else bits1=bits;bits2=bits; end if (L>MaxL) if Speed BitPos=BitPos-1;

if (~BitPos); Byte=Byte+1; BitPos=8; end; else

PutBit(1); end;

[bits1, temp] = EncodeVector(x1); [bits2, temp] = EncodeVector(x2); bits=bits1+bits2+1;

elseif ((bits1+bits2) < bits) if Speed

BitPos=BitPos-1;

if (~BitPos); Byte=Byte+1; BitPos=8; end; else

PutBit(1); end;

[bits1, temp] = EncodeVector(x1, bits1, HL1, Maxx1, Meanx1); [bits2, temp] = EncodeVector(x2, bits2, HL2, Maxx2, Meanx2); bits=bits1+bits2+1; else bits=bits+1; if Speed Byte=Byte+floor(bits/8); BitPos=BitPos-mod(bits,8);

if (BitPos<=0); BitPos=BitPos+8; Byte=Byte+1; end; else

StartPos=Byte*8-BitPos; PutBit(0);


(25)

PutHuffTab(HL); HK=huffcode(HL); for i=1:L; n=x(i)+1; for k=1:HL(n) PutBit(HK(n,k)); end end BitsUsed=Byte*8-BitPos-StartPos; end end

Level = Level + 1; return

function x = DecodeVector global y Byte BitPos MaxL=50000; if GetBit x1=DecodeVector; x2=DecodeVector; L=length(x1)+length(x2); if (L>MaxL) x=[x1(:);x2(:)]; else xm=median([x1;x2]); x=zeros(L,1); x(1)=x2(1); i1=0;i2=1; for i=2:L

if (x(i-1) <= xm) i1=i1+1; x(i)=x1(i1); else i2=i2+1; x(i)=x2(i2); end end end else L=GetVLIC; if (L>1) x=zeros(L,1); HL=GetHuffTab; if length(HL) Htree=HuffTree(HL); root=1;pos=root; l=0; while l<L if GetBit pos=Htree(pos,3); else pos=Htree(pos,2); end


(26)

if Htree(pos,1) l=l+1; x(l)=Htree(pos,2)-1; pos=root; end end else x=x+GetVLIC; end elseif L==0 if GetBit x1=DecodeVector; x2=DecodeVector; I=x1; I=I+1; L=length(I);

for i=2:L;I(i)=I(i-1)+I(i); end; x=zeros(I(L)-1,1); x(I(1:(L-1)))=x2; else x=[]; end elseif L==1 x=GetVLIC; end return function PutHuffTab(HL) global y Byte BitPos HL=HL(:); Prev=2; ZeroCount=0; L=length(HL); for l=1:L if HL(l)==0 ZeroCount=ZeroCount+1; else

while (ZeroCount > 0) if ZeroCount<3 for i=1:ZeroCount PutBit(1);PutBit(1);PutBit(0);PutBit(1);PutBit(1); end ZeroCount=0; elseif ZeroCount<19 PutBit(1);PutBit(1);PutBit(1);PutBit(0);PutBit(0);PutBit(0);PutBit(0); for (i=4:-1:1); PutBit(bitget(ZeroCount-3,i)); end;

ZeroCount=0; elseif ZeroCount<275

PutBit(1);PutBit(1);PutBit(1);PutBit(0);PutBit(0);PutBit(0);PutBit(1); for (i=8:-1:1); PutBit(bitget(ZeroCount-19,i)); end;


(27)

ZeroCount=0; else

PutBit(1);PutBit(1);PutBit(1);PutBit(0);PutBit(0);PutBit(0);PutBit(1); for (i=8:-1:1); PutBit(1); end;

ZeroCount=ZeroCount-274; end

end

if HL(l)>16

PutBit(1);PutBit(1);PutBit(1);PutBit(0);PutBit(0);PutBit(1);PutBit(0); for (i=4:-1:1); PutBit(bitget(HL(l)-17,i)); end;

else

Inc=HL(l)-Prev;

if Inc<0; Inc=Inc+16; end; if (Inc==0) PutBit(0); elseif (Inc==1) PutBit(1);PutBit(0); elseif (Inc==2) PutBit(1);PutBit(1);PutBit(0);PutBit(1);PutBit(0); elseif (Inc==15) PutBit(1);PutBit(1);PutBit(0);PutBit(0); else PutBit(1);PutBit(1);PutBit(1);

for (i=4:-1:1); PutBit(bitget(Inc,i)); end; end

Prev=HL(l); end

end end

for (i=7:-1:1); PutBit(1); end; return;

function HL=GetHuffTab global y Byte BitPos Prev=2; ZeroCount=0; HL=zeros(10000,1); HLi=0; EndOfTable=0; while ~EndOfTable if GetBit if GetBit if GetBit Inc=0;

for (i=1:4); Inc=Inc*2+GetBit; end; if Inc==0

ZeroCount=0;

for (i=1:4); ZeroCount=ZeroCount*2+GetBit; end; HLi=HLi+ZeroCount+3;


(28)

elseif Inc==1 ZeroCount=0;

for (i=1:8); ZeroCount=ZeroCount*2+GetBit; end; HLi=HLi+ZeroCount+19;

elseif Inc==2 HLi=HLi+1; HL(HLi)=0;

for (i=1:4); HL(HLi)=HL(HLi)*2+GetBit; end; HL(HLi)=HL(HLi)+17;

elseif Inc==15 EndOfTable=1; else

Prev=Prev+Inc;

if Prev>16; Prev=Prev-16; end; HLi=HLi+1;HL(HLi)=Prev; end else if GetBit if GetBit HLi=HLi+1; else Prev=Prev+2;

if Prev>16; Prev=Prev-16; end; HLi=HLi+1;HL(HLi)=Prev; end

else

Prev=Prev-1;

if Prev<1; Prev=16; end; HLi=HLi+1;HL(HLi)=Prev; end

end else

Prev=Prev+1;

if Prev>16; Prev=1; end; HLi=HLi+1;HL(HLi)=Prev; end else HLi=HLi+1;HL(HLi)=Prev; end end if HLi>0 HL=HL(1:HLi); else HL=[]; end return; function PutVLIC(N) global y Byte BitPos if (N<0)


(29)

error('Huff06-PutVLIC: Number is negative.'); elseif (N<16)

PutBit(0);PutBit(0);

for (i=4:-1:1); PutBit(bitget(N,i)); end; elseif (N<272)

PutBit(0);PutBit(1); N=N-16;

for (i=8:-1:1); PutBit(bitget(N,i)); end; elseif (N<4368)

PutBit(1);PutBit(0); N=N-272;

for (i=12:-1:1); PutBit(bitget(N,i)); end; elseif (N<69940)

PutBit(1);PutBit(1);PutBit(0); N=N-4368;

for (i=16:-1:1); PutBit(bitget(N,i)); end; elseif (N<1118480)

PutBit(1);PutBit(1);PutBit(1);PutBit(0); N=N-69940;

for (i=20:-1:1); PutBit(bitget(N,i)); end; elseif (N<17895696)

PutBit(1);PutBit(1);PutBit(1);PutBit(1); N=N-1118480;

for (i=24:-1:1); PutBit(bitget(N,i)); end; else

error('Huff06-PutVLIC: Number is too large.'); end

return

function N=GetVLIC global y Byte BitPos N=0;

if GetBit if GetBit if GetBit if GetBit

for (i=1:24); N=N*2+GetBit; end; N=N+1118480;

else

for (i=1:20); N=N*2+GetBit; end; N=N+69940;

end else

for (i=1:16); N=N*2+GetBit; end; N=N+4368;

end else

for (i=1:12); N=N*2+GetBit; end; N=N+272;

end else


(30)

if GetBit

for (i=1:8); N=N*2+GetBit; end; N=N+16;

else

for (i=1:4); N=N*2+GetBit; end; end

end return

function PutBit(Bit) global y Byte BitPos BitPos=BitPos-1;

if (~BitPos); Byte=Byte+1; BitPos=8; end; y(Byte) = bitset(y(Byte),BitPos,Bit); return

function Bit=GetBit global y Byte BitPos BitPos=BitPos-1;

if (~BitPos); Byte=Byte+1; BitPos=8; end; Bit=bitget(y(Byte),BitPos); return; function Hi=IntHist(W,i1,i2); W=W(:); L=length(W); Hi=zeros(i2-i1+1,1); if (i2-i1)>50 for l=1:L i=W(l)-i1+1; Hi(i)=Hi(i)+1; end else for i=i1:i2 I=find(W==i); Hi(i-i1+1)=length(I); end end return;


(31)

LAMPIRAN B

CITRA ASLI

DAN


(32)

Citra asli finger_1.bmp

Citra hasil dekompresi tingkat 1


(33)

Citra asli finger_2.bmp

Citra hasil dekompresi tingkat 1


(34)

Citra asli finger_3.bmp

Citra hasil dekompresi tingkat 1


(35)

Citra asli finger_4.bmp

Citra hasil dekompresi tingkat 1


(36)

Citra asli finger_5.bmp

Citra hasil dekompresi tingkat 1


(37)

Citra asli finger_6.bmp

Citra hasil dekompresi tingkat 1


(38)

Citra asli finger_7.bmp

Citra hasil dekompresi tingkat 1


(39)

Citra asli finger_8.bmp

Citra hasil dekompresi tingkat 1


(40)

Citra asli finger_9.bmp

Citra hasil dekompresi tingkat 1


(41)

Citra asli finger_10.bmp

Citra hasil dekompresi tingkat 1


(42)

LAMPIRAN C


(43)

Hasil pengecekan dekompresi finger_1.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_1.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_1.bmp level 3 dengan fingerprint

yang ada di database.


(44)

Hasil pengecekan dekompresi finger_2.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_2.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_2.bmp level 3 dengan fingerprint

yang ada di database.


(45)

Hasil pengecekan dekompresi finger_3.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_3.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_3.bmp level 3 dengan fingerprint

yang ada di database.


(46)

Hasil pengecekan dekompresi finger_4.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_4.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_4.bmp level 3 dengan fingerprint

yang ada di database.


(47)

Hasil pengecekan dekompresi finger_5.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_5.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_5.bmp level 3 dengan fingerprint

yang ada di database.


(48)

Hasil pengecekan dekompresi finger_6.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_6.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_6.bmp level 3 dengan fingerprint

yang ada di database.


(49)

Hasil pengecekan dekompresi finger_7.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_7.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_7.bmp level 3 dengan fingerprint

yang ada di database.


(50)

Hasil pengecekan dekompresi finger_8.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_8.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_8.bmp level 3 dengan fingerprint

yang ada di database.


(51)

Hasil pengecekan dekompresi finger_9.bmp level 1 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_9.bmp level 2 dengan fingerprint

yang ada di database.

Hasil pengecekan dekompresi finger_9.bmp level 3 dengan fingerprint

yang ada di database.


(52)

Hasil pengecekan dekompresi finger_10.bmp level 1 dengan

fingerprint yang ada di database.

Hasil pengecekan dekompresi finger_10.bmp level 2 dengan

fingerprint yang ada di database.

Hasil pengecekan dekompresi finger_10.bmp level 3 dengan

fingerprint yang ada di database.


(53)

Bab I Pendahuluan

BAB I

PENDAHULUAN

1.1 Latar

Belakang

Pada era-modern ini, penggunaan digitalisasi fingerprint (sidik jari) sudah

sering ditemukan di mana-mana. Di antaranya dapat ditemukan pada passport, ID

card, visa dan dokumen yang lainnya.

Karena bersifat digital maka gambar dari sidik jari adalah gambar dalam

format 8-bit gray-scale. Kapasitas dari suatu gambar sidik jari yang sudah

didigitalisasi dapat mencapai 1 atau 2 megabytes (untuk sepuluh buah citra sidik

jari). Karena gambar sidik jari yang disimpan mencapai puluhan atau ratusan juta,

maka kapasitas penyimpanan yang diperlukan sangat besar, sehingga pada saat

proses mengidentifikasi sidik jari menjadi lambat. Agar kapasitas penyimpanan

yang diperlukan tidak begitu besar, dan pada proses transmisi atau identifikasi

sidik jari menjadi lebih cepat, dilakukan pengkompresian citra sidik jari tersebut.

Hasil kompresi citra sidik jari harus mempunyai ukuran yang sekecil

mungkin dan apabila citra sidik jari yang dikompresi tidak sama dengan aslinya

maka untuk mengidentifikasi akan sangat sulit. Untuk mengatasi masalah di atas,

digunakan algoritma WSQ (Wavelet Scalar Quantization). WSQ adalah metoda

kompresi jenis lossy yang sesuai digunakan untuk menjaga resolusi yang tinggi

dari citra keabu-abuan ketika mempertahankan rasio kompresi yang tinggi.

Algoritma ini sudah digunakan oleh FBI sebagai standarisasi untuk

mentransmisikan dan menyimpan sidik jari yang telah didigitalisasi.

1.2 Tujuan

Tujuan penulisan tugas akhir ini adalah pengkompresian citra sidik jari agar

ukuran data dari citra sidik jari lebih kecil daripada citra asli dan citra rekonstruksi

sidik jari tetap dapat diidentifikasi.


(54)

Bab I Pendahuluan 2

1.3

Identifikasi Masalah

Beberapa masalah yang akan dibahas dalam tugas akhir ini adalah bagaimana cara

pengkompresian citra sidik jari agar ukuran data lebih kecil daripada citra asli dan

bagaimana hasil identifikasi dari citra rekonstruksi sidik jari ?

1.4 Pembatasan

Masalah

Pada tugas akhir ini masalah dibatasi sebagai berikut :

1.

Gambar sidik jari diambil dengan cara menggunakan scanner dengan

resolusi 96dpi, ukuran 240x320 piksel.

2.

Gambar yang dikompresi hanya gambar sidik jari (grayscale image)

bukan gambar biasa atau gambar berwarna.

3.

Perangkat lunak pendeteksi sidik jari digunakan dari perangkat lunak

yang sudah ada

[12]

.

1.5 Sistematika

Pembahasan

Sistematika pembahasan laporan tugas akhir ini disusun menjadi lima bab, yaitu

sebagai berikut:

Bab I

: Membahas pendahuluan dari laporan tugas akhir yang berisi latar

belakang, tujuan, pembatasan masalah, dan sistematika laporan.

Bab II

: Berisi tentang landasan teori yang menunjang tugas akhir ini.

Bab III

: Perancangan perangkat lunak yang akan dibahas mengenai diagram

alir proses kompresi dan dekompresi, diagram alir transformasi

wavelet, kuantisasi skalar, dan sistem pengkodean.

Bab IV

: Data pengamatan hasil percobaan dari kompresi citra sidik jari

dipaparkan pada bab ini.


(55)

Bab V Kesim pulan dan Sar an

BAB V

KESIMPULAN DAN SARAN

5.1 Kesimpulan

Kesimpulan dalam Tugas Akhir ini adalah sebagai berikut :

Hasil kompresi citra sidik jari dengan transformasi Wavelet tingkat 1

mempunyai range rasio kompresi 1:9,70 sampai 1:12,06, tingkat 2

mempunyai range rasio kompresi 1:12,57 sampai 1:17,08 dan untuk

tingkat 3 mempunyai range rasio kompresi 1:13,78 sampai 1:17,16.

Ukuran file hasil kompresi menggunakan transformasi Wavelet tingkat 3

lebih kecil dibandingkan ukuran file yang menggunakan transformasi

Wavelet tingkat 1 dan 2. Namun pada transformasi Wavelet tingkat 3

RMSE-nya lebih besar daripada transformasi Wavelet tingakat 1 dan 2.

Berdasarkan nilai PSNR, kualitas citra dengan menggunakan Wavelet

tingkat 1, 2, dan 3 sangat memuaskan karena kualitas citra dapat

dikatakan bagus apabila PSNR > 35 dB.

5.2 Saran

Saran yang dapat diberikan untuk pengembangan lebih lanjut adalah sebagai

berikut :

Perlu penelitian lebih lanjut untuk transformasi Wavelet tingkat 4 atau

lebih dengan rasio kompresi lebih besar dan rekonstruksi dari citra sidik

jari dapat diidentifikasi.


(56)

DAFTAR PUSTAKA

1.

B. G. Sherlock and D. M. Monro, “Optimized Wavelets For Fingerprint

Compression”, 9 Januari 1999.

2.

ClayM. Thompson and Loren Shure, “Image Processing-Toolbox for use

with Matlab”, The MathWorks,Inc., 1995.

3.

Gunaidi Abdia Away, “The Shortcut of MATLAB Programming”, Penerbit

Informatika Bandung, Juni 2006.

4.

James S. Walker, “A Primer on Wavelets and Their Scientific

Applications”, University of Wisconsin-Eau Claire, tahun 1999.

5.

M.A.Sid-Ahmed, “Image Processing Theory, Algorithms, and

Architecture” McGraw Hill, Inc

6.

Michael L Hilton, Bjorn D. Jawerth, Ayan Sengupta, “Compressing Still and

Moving Image with Wavelets”, April 18, 1994.

7.

Michel Misiti, Yves Misiti, Georges Oppenheim, Jean-Michel Poggi,

“Wavelet Toolbox for use with Matlab”, The MathWorks, Inc., 1997.

8.

“Matlab User’s Guide”, The MathWorks, Inc., 1992.

9.

Nalini K. Ratha, Jonathan H. Connel, Ruud M. Bolle, “Secure Data Hiding

in Wavelet Compressed Fingerprint Images”, 13 November 2000.

10.

Oyvind Ryan, “Application of the Wavelet Transform in Image

Processing”, Department of Informatics, University of Oslo, 12 November

2004.

11.

Polikar, Robi, “Fundamental Concept and an Overview of the Wavelet

Theory Second Edition”, tahun 1996.

12.

Ratnadewi, Didi Sugianto, “Identifikasi Sidik Jari Menggunakan Metoda

Modified Gabor Filter (MGF)”, JELMA, April 2004.

13.

Shuo-yen Choo and Gregory Chew, “JPEG 2000 and Wavelet

Compression”, download tanggal 27 Juli 2006.

14.

http://en.wikipedia.org/wiki/Huffman_coding, download tanggal 11 Agustus

2006.


(57)

15.

http://en.wikipedia.org/wiki/Quantization_(signal_processing), download

tanggal 11 Agustus 2006.

16.

http://en.wikipedia.org/wiki/Wavelet_compression, download tanggal 8

September 2006.

17.

http://www.c3.lanl.gov/~brislawn/index.html, 26 Juli 2006.

18.

http://www.ux.his.no/~karlsk, 28 Juli 2006.

19.

www.cognaxon.com, download tanggal 18 Agustus 2006.

20.

www.howitworks.com, download tanggal 11 Agustus 2006.


(1)

Hasil pengecekan dekompresi finger_10.bmp level 1 dengan

fingerprint yang ada di database.

Hasil pengecekan dekompresi finger_10.bmp level 2 dengan

fingerprint yang ada di database.

Hasil pengecekan dekompresi finger_10.bmp level 3 dengan

fingerprint yang ada di database.


(2)

Bab I Pendahuluan

BAB I

PENDAHULUAN

1.1 Latar Belakang

Pada era-modern ini, penggunaan digitalisasi fingerprint (sidik jari) sudah sering ditemukan di mana-mana. Di antaranya dapat ditemukan pada passport, ID card, visa dan dokumen yang lainnya.

Karena bersifat digital maka gambar dari sidik jari adalah gambar dalam format 8-bit gray-scale. Kapasitas dari suatu gambar sidik jari yang sudah didigitalisasi dapat mencapai 1 atau 2 megabytes (untuk sepuluh buah citra sidik jari). Karena gambar sidik jari yang disimpan mencapai puluhan atau ratusan juta, maka kapasitas penyimpanan yang diperlukan sangat besar, sehingga pada saat proses mengidentifikasi sidik jari menjadi lambat. Agar kapasitas penyimpanan yang diperlukan tidak begitu besar, dan pada proses transmisi atau identifikasi sidik jari menjadi lebih cepat, dilakukan pengkompresian citra sidik jari tersebut.

Hasil kompresi citra sidik jari harus mempunyai ukuran yang sekecil mungkin dan apabila citra sidik jari yang dikompresi tidak sama dengan aslinya maka untuk mengidentifikasi akan sangat sulit. Untuk mengatasi masalah di atas, digunakan algoritma WSQ (Wavelet Scalar Quantization). WSQ adalah metoda kompresi jenis lossy yang sesuai digunakan untuk menjaga resolusi yang tinggi dari citra keabu-abuan ketika mempertahankan rasio kompresi yang tinggi. Algoritma ini sudah digunakan oleh FBI sebagai standarisasi untuk mentransmisikan dan menyimpan sidik jari yang telah didigitalisasi.

1.2 Tujuan

Tujuan penulisan tugas akhir ini adalah pengkompresian citra sidik jari agar ukuran data dari citra sidik jari lebih kecil daripada citra asli dan citra rekonstruksi sidik jari tetap dapat diidentifikasi.

1


(3)

Bab I Pendahuluan 2

1.3 Identifikasi Masalah

Beberapa masalah yang akan dibahas dalam tugas akhir ini adalah bagaimana cara pengkompresian citra sidik jari agar ukuran data lebih kecil daripada citra asli dan bagaimana hasil identifikasi dari citra rekonstruksi sidik jari ?

1.4 Pembatasan Masalah

Pada tugas akhir ini masalah dibatasi sebagai berikut :

1. Gambar sidik jari diambil dengan cara menggunakan scanner dengan resolusi 96dpi, ukuran 240x320 piksel.

2. Gambar yang dikompresi hanya gambar sidik jari (grayscale image) bukan gambar biasa atau gambar berwarna.

3. Perangkat lunak pendeteksi sidik jari digunakan dari perangkat lunak yang sudah ada[12].

1.5 Sistematika Pembahasan

Sistematika pembahasan laporan tugas akhir ini disusun menjadi lima bab, yaitu sebagai berikut:

Bab I : Membahas pendahuluan dari laporan tugas akhir yang berisi latar belakang, tujuan, pembatasan masalah, dan sistematika laporan. Bab II : Berisi tentang landasan teori yang menunjang tugas akhir ini. Bab III : Perancangan perangkat lunak yang akan dibahas mengenai diagram

alir proses kompresi dan dekompresi, diagram alir transformasi wavelet, kuantisasi skalar, dan sistem pengkodean.

Bab IV : Data pengamatan hasil percobaan dari kompresi citra sidik jari dipaparkan pada bab ini.


(4)

Bab V Kesim pulan dan Sar an

BAB V

KESIMPULAN DAN SARAN

5.1 Kesimpulan

Kesimpulan dalam Tugas Akhir ini adalah sebagai berikut :

• Hasil kompresi citra sidik jari dengan transformasi Wavelet tingkat 1 mempunyai range rasio kompresi 1:9,70 sampai 1:12,06, tingkat 2 mempunyai range rasio kompresi 1:12,57 sampai 1:17,08 dan untuk tingkat 3 mempunyai range rasio kompresi 1:13,78 sampai 1:17,16. Ukuran file hasil kompresi menggunakan transformasi Wavelet tingkat 3

lebih kecil dibandingkan ukuran file yang menggunakan transformasi Wavelet tingkat 1 dan 2. Namun pada transformasi Wavelet tingkat 3 RMSE-nya lebih besar daripada transformasi Wavelet tingakat 1 dan 2. • Berdasarkan nilai PSNR, kualitas citra dengan menggunakan Wavelet

tingkat 1, 2, dan 3 sangat memuaskan karena kualitas citra dapat dikatakan bagus apabila PSNR > 35 dB.

5.2 Saran

Saran yang dapat diberikan untuk pengembangan lebih lanjut adalah sebagai berikut :

• Perlu penelitian lebih lanjut untuk transformasi Wavelet tingkat 4 atau lebih dengan rasio kompresi lebih besar dan rekonstruksi dari citra sidik jari dapat diidentifikasi.

52


(5)

DAFTAR PUSTAKA

1. B. G. Sherlock and D. M. Monro, “Optimized Wavelets For Fingerprint Compression”, 9 Januari 1999.

2. ClayM. Thompson and Loren Shure, “Image Processing-Toolbox for use with Matlab”, The MathWorks,Inc., 1995.

3. Gunaidi Abdia Away, “The Shortcut of MATLAB Programming”, Penerbit Informatika Bandung, Juni 2006.

4. James S. Walker, “A Primer on Wavelets and Their Scientific Applications”, University of Wisconsin-Eau Claire, tahun 1999. 5. M.A.Sid-Ahmed, “Image Processing Theory, Algorithms, and

Architecture” McGraw Hill, Inc

6. Michael L Hilton, Bjorn D. Jawerth, Ayan Sengupta, “Compressing Still and Moving Image with Wavelets”, April 18, 1994.

7. Michel Misiti, Yves Misiti, Georges Oppenheim, Jean-Michel Poggi, “Wavelet Toolbox for use with Matlab”, The MathWorks, Inc., 1997. 8. “Matlab User’s Guide”, The MathWorks, Inc., 1992.

9. Nalini K. Ratha, Jonathan H. Connel, Ruud M. Bolle, “Secure Data Hiding in Wavelet Compressed Fingerprint Images”, 13 November 2000.

10.Oyvind Ryan, “Application of the Wavelet Transform in Image

Processing”, Department of Informatics, University of Oslo, 12 November 2004.

11.Polikar, Robi, “Fundamental Concept and an Overview of the Wavelet Theory Second Edition”, tahun 1996.

12.Ratnadewi, Didi Sugianto, “Identifikasi Sidik Jari Menggunakan Metoda Modified Gabor Filter (MGF)”, JELMA, April 2004.

13.Shuo-yen Choo and Gregory Chew, “JPEG 2000 and Wavelet Compression”, download tanggal 27 Juli 2006.

14.http://en.wikipedia.org/wiki/Huffman_coding, download tanggal 11 Agustus 2006.


(6)

15.http://en.wikipedia.org/wiki/Quantization_(signal_processing), download tanggal 11 Agustus 2006.

16.http://en.wikipedia.org/wiki/Wavelet_compression, download tanggal 8 September 2006.

17.http://www.c3.lanl.gov/~brislawn/index.html, 26 Juli 2006. 18.http://www.ux.his.no/~karlsk, 28 Juli 2006.

19.www.cognaxon.com, download tanggal 18 Agustus 2006. 20.www.howitworks.com, download tanggal 11 Agustus 2006.

x i