Kompresi Sidik Jari Dengan Menggunakan Algoritma WSQ (Wavelet Scalar Quantization).
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