1
Sistem dan Teknologi Informasi STEI ITB
Yusep Rosmansyah, Ph.D.
M. Rizki Nugraha, M.T.
Chessa Nur Triejunita, S.T.
Modul 06
Kompresi dan Dekompresi
06.01
Kompresi Lossless
II3150 Sistem Multimedia Program Studi
Sistem dan Teknologi Informasi
2
Kompresi Lossless
Run Length Encoding
Huffman Coding
Arithmetic Coding
Lempel-Ziv-Welch
3
Run Length Encoding (RLE)
RLE merupakan algoritma kompresi
data sederhana
Data disusun beserta
dengan jumlahnya Sangat cocok jika ada data-data yang
berdekatan nilainya sama
4
Run Length Encoding (RLE)
Mengurangi redudansi data dengan mengganti pengulangan karakter secara berturut-turut dalam suatu string dengan dua
entitas, yaitu angka jumlah pengulangan suatu karakter dan karakter itu sendiri
Contoh:
BBBBEEEEEEEECCCCDAAAAA dapat direpresentasikan dengan:
4B8E4C1D5A
5
Run Length Encoding (RLE)
Jika diasumsikan 1 byte per karakter, maka BBBBEEEEEEEECCCCDAAAAA adalah 22 byte, dan
4B8E4C1D5A
adalah 10 byte
6
Contoh RLE 1
1 2 1 1 1 1
1 3 4 4 4 4
1 1 3 3 3 5
1 1 1 1 3 3
Susunan bilangan pada tabel adalah:
121111134444113335111133 = 24 byte
7
Contoh RLE 1
• Dihitung jumlah kemunculan data:
(1,1) (2,1) (1,5) (3,1) (4,4) (1,2) (3,3) (5,1) (1,4) (3,2)
• Data kompresi:
1 1 2 1 1 5 3 1 4 4 1 2 3 3 5 1 1 4 3 2 = 20 byte
8
Contoh RLE 2
• Data asli sebagai berikut:
WWWWWWWWWWWWKWWWWWWWWWWWWKKKW WWWWWWWWWWWWWWWWWWWWWWWKWWWW
WWWWWWWWWW
• Ada 67 karakter
9
Contoh RLE 2
• Data disusun dengan algoritma RLE:
12W1K12W3K24W1K14W
Ada 18 karakter
10
Huffman Coding
Pengkodean karakter berdasarkan frekuensi kemunculan karakter tersebut
Karakter kemudian disusun menjadi pohon
biner
Karakter yang sering muncul terletak dekat dengan akar sedangkan karakter yang jarang
muncul terletak jauh dari akar
Dengan demikian, karakter yang sering muncul memiliki kode yang
pendek sedangkan yang jarang
muncul memiliki kode yang panjang
11
Huffman Coding
Frekuensi karakter dari string yang akan dikompres dianalisa terlebih dahulu
1
• Frekuensi terkecil dikerjakan terlebih dahulu dan diletakkan ke dalam leaf
• Leaf-leaf dikombinasikan dan dijumlahkan probabilitasnya atau frekuensinya menjadi root di atasnya
2
Selanjutnya dibuat pohon Huffman
12
Contoh Huffman
• Misalkan ada string:
AAAABBDCCAAAEEEBBBCDDAABCCDAAA = 30 byte
= 30 x 8 = 240 bit
Karakter Frekuensi Probabilitas
A 12 12/30
B 6 6/30
C 5 5/30
D 4 4/30
E 3 3/30
Hitung frekuensi setiap karakter:
13
Contoh Huffman (2)
String terdiri atas 5 karakter yaitu A, B, C,
D dan E
Setiap karakter
menjadi Subtree yang
terpisah
14
Contoh Huffman (3)
• Subtree untuk D dan E mempunyai frekuensi yang paling kecil, maka
keduanya digabung
15
Contoh Huffman (4)
• Subtree untuk B dan C mempunyai frekuensi yang paling kecil,
sehingga mereka digabungkan
16
Contoh Huffman (5)
• Subtree untuk {B, C} dan {D, E} mempunyai frekuensi terkecil,
kemudian digabungkan:
17
Contoh Huffman (6)
• Hasil akhir :
18
Contoh Huffman (7)
Maka:
• A dikodekan 1
• B dikodekan 000
Untuk mengkodekan karakter, setiap cabang kiri
diberi nilai 0 dan setiap cabang kanan diberi nilai 1
19
Contoh Huffman (8)
Jumlah bit yang diperlukan dengan kompresi Huffman menjadi: 12 + 18 + 15 + 12 + 9 = 66 bit
Karakter Frekuensi Kode Panjang Kode Jumlah bit=frekuensi x panjang kode
A 12 1 1 12
B 6 000 3 18
C 5 001 3 15
D 4 010 3 12
E 3 011 3 9
20
Huffman Decoding
Menggunakan LUT (Look Up Table), jika diterima bit:
1 → A
0 → ada 4 kemungkinan, lihat bit kedua
bit kedua 0 → ada dua kemungkinan, lihat bit ketiga bit ketiga 0 → yakin bahwa karakter adalah B
A A A A B B D C C … …
1 1 1 1 000 000 010 001 001
21
Arithmetic Coding
Memetakan seluruh pesan ke dalam bilangan asli antara 0 dan 1
1
Selang tersebut memiliki jumlah bilangan asli yang tidak terbatas sehingga memungkinkan
untuk encoding pesan apapun
2
Arithmeic compression memungkinkan
melakukan encoding pesan tanpa meng-assign bilangan biner tetap pada setiap karakter
3
22
D = Batas atas (UB) – Batas bawah (LB)
UB = LB + D x P(x), dimana P(x) adalah probabilitas dari karakter Range karakter [R(x)] = LB : UB
= LB : LB + D x P(x)
Nilai tag = nilai untuk melakukan decoding
23
Contoh Arithmetic Coding
Encoding Pesan “MURINU”
Total karakter : 6
Hitung probalibitas Karakter Probabilitas P(x)
U 2/6 0,33
R 1/6 0,17
N 1/6 0,17
M 1/6 0,17
I 1/6 0,17
24
1
0 0,17
I
0,34
M
0,51 0,68
R U
MURINU
0,34
0,17 0,1989
I
0,2278
M
0,256
7 N
0,2856
R U
D = UB – LB
= 0,34 – 0,17
= 0,17
R(I) = LB : LB + D x P(I)
= 0,17 : 0,17 + 0,17 x 0,17
= 0,17 : 0,1989
R(M) = LB : LB + D x P(M)
= 0,1989 : 0,1989 + 0,17 x 0,17
= 0,1989 : 0,2278 R(N) = LB : LB + D x P(N)
= 0,2278 : 0,2278 + 0,17 x 0,17
= 0,2278 : 0,2567 R(R) = LB : LB + D x P(R)
= 0,2567 : 0,2567 + 0,17 x 0,17
= 0,2567 : 0,2856 N
25
1
0 0,17
I
0,34
M
0,51 0,68
R U
MURINU
0,34
0,17 0,1989
I
0,2278
M
0,2567
N
0,2856
U
0,2856
I M
0,313344
N
0,322592
R U
0,322592
0,313344
I
0,31648832
M N
0,31963264
R U
0,31806048
0,31491616
0,31361127
I
0,31387854
M N R U
0,31414581 0,34
0,304096
0,294848 0,31491616
R
N
0,31414581
0,31392398
I
0,31396942
M N
0,3140603
R U
0,31401486
0,31387854 0,31441308
0,313344
26
0,3140603 < U < 0,31414581
Nilai tag untuk decoding : 0,31414581 + 0,3140603
2 = 0,31410306
27
Arithmetic Coding - Decoding
• Diketahui:
• Nilai tag = 0,31410306
• Banyak karakter = 6
• Nilai Probabilitas Karakter
Karakter Probabilitas P(x)
U 0,33
R 0,17
N 0,17
M 0,17
I 0,17
28
1
0 0,17
I
0,34
M
0,51 0,68
R U
Nilai tag = 0,31410306
0,34
0,17 0,1989
I
0,2278
M
0,2567
N
0,2856
U
0,2856
I M
0,313344
N
0,322592
R U
0,322592
0,313344
I
0,31648832
M N
0,31963264
R U
0,31806048
0,31491616
0,31361127
I
0,31387854
M N R U
0,31414581 0,34
0,304096
0,294848 0,31491616
R
N
0,31414581
0,31392398
I
0,31396942
M N
0,3140603
R U
0,31401486
0,31387854 0,31441308
0,313344
29
Kompresi Lossless
Lempel-Ziv-Welch
30
Lempel-Ziv-Welch
Dibuat oleh Abraham Lempel, Jacob Ziv dan Terry Welch
1
Mensubstitusi kumpulan karakter dengan suatu kode
2
Melakukan kompresi dengan menggunakan kamus
• Fragmen-fragmen text digantikan dengan indeks yang diperoleh dari sebuah kamus
3
31
Algoritma Kompresi LZW
1. Inisialisasi kamus
2. P ← karakter pertama dalam stream karakter 3. C ← karakter berikutnya dalam stream karakter 4. IF string (P+C) terdapat dalam kamus
THEN
P ← P+C
ELSE • Cetak indeks string P
• Tambahkan string (P+C) ke dalam kamus dan berikan indeks berikutnya
• P ← C
5. IF NOT EOF THEN GOTO 2
ELSE • Cetak indeks string P
• STOP
32
Initial
Dictionary
33
Algoritma Dekompresi LZW
1. Kamus diinisialisasi dengan semua karakter dasar yang ada 2. CW ← Input pertama
3. Lihat kamus dan simpan string dari kode tersebut (string CW) ke output
4. C ← karakter pertama dalam string CW
34
Algoritma Dekompresi LZW
5. PW ← CW;
CW ← indeks berikutnya dalam input 6. IF string CW terdapat dalam kamus
• THEN
1) Simpan string CW ke output 2) P ← string PW
3) C ← karakter pertama dari string CW 4) Tambahkan string (P+C) ke dalam kamus
• ELSE
1) Output string S ← string PW + C ke stream karakter 2) P ← string PW
3) C ← karakter pertama dari string S
4) Tambahkan string (P+C) ke dalam kamus
7. Kembali ke langkah 5
35
LZW Contoh 1 (1) (Kompresi)
• Input : ABABBABCAB
• Initial dictionary A = 1, B = 2, C = 3
Input = P NxCh = C Output Add to Dictionary
Index Index String
A B 1 4 AB
B A 2 5 BA
A B
AB B 4 6 ABB
B A
BA B 5 7 BAB
B C 2 8 BC
C A 3 9 CA
A B
AB EOF 4
Output:
1 2 4 5 2 3 4
36
LZW Contoh 1 (2) (Dekompresi)
• Input : 1 2 4 5 2 3 4
• Initial dictionary 1 = A, 2 = B, 3 = C
StringPW
CW P C Output
Add to Dictionary
Index String Index String
NULL 1 A A A
A 2 B A B B 4 AB
B 4 AB B A AB 5 BA
AB 5 BA AB B BA 6 ABB
BA 2 B BA B B 7 BAB
B 3 C B C C 8 BC
C 4 AB C A AB 9 CA
AB EOF
Output:
A B AB BA B C AB
37
LZW Contoh 2 (1) (Kompresi)
• Input : ITETEBEBE
• Initial dictionary A=1, ...., Z=26, (B=2, E=5, I=9, T=20)
Input = P NxCh = C Output Add to Dictionary
Index Index String
I T 9 27 IT
T E 20 28 TE
E T 5 29 ET
T E
TE B 28 30 TEB
B E 2 31 BE
E B 5 32 EB
B E
BE EOF 31
Output:
9 20 5 28 2 5 31
38
LZW Contoh 2 (2) (Dekompresi)
• Input : 9 20 5 28 2 5 31
• Initial dictionary A=1, ...., Z=26, (B=2, E=5, I=9, T=20)
StringPW
CW P C Output
Add to Dictionary
Index String Index String
NULL 9 I I I
I 20 T I T T 27 IT
T 5 E T E E 28 TE
E 28 TE E T TE 29 ET
TE 2 B TE B B 30 TEB
B 5 E B E E 31 BE
E 31 BE E B BE 32 EB
BE EOF
Output:
I T E TE B E BE
39
LZW SOAL 1 (1) (Kompresi)
• Buatlah kompresi dan dekompresi LZW
• Input : LOSSLESSLOSSLESS
• Initial dictionary A=1, …, Z=26
Input = P NxCh = C Output Add to Dictionary
Index Index String
L O 12 27 LO
40
LZW SOAL 1 (2) (Kompresi)
Input = P NxCh = C Output Add to Dictionary
Index Code String
Output:
41
LZW SOAL 1 (3) (Dekompresi)
• Input : 12 15 19 19 12 5 29 27 33 32 19
• Initial dictionary A=1, …, Z=26
StringPW
CW P C Output
Add to Dictionary
Index String Index String
NULL 12 L L L
42
LZW SOAL 1 (4) (Dekompresi)
StringPW
CW P C Output Add to Dictionary
Index String Index String
Output:
43
JAWABAN LZW SOAL 1 (1) (Kompresi)
• Input : LOSSLESSLOSSLESS
• Initial dictionary A=1, …, Z=26
Input = P NxCh = C Output Add to Dictionary
Index Index String
L O 12 27 LO
O S 15 28 OS
S S 19 29 SS
S L 19 30 SL
L E 12 31 LE
E S 5 32 ES
S S
SS L 29 33 SSL
L O
LO S 27 34 LOS
44
JAWABAN LZW SOAL 1 (2) (Kompresi)
Input = P NxCh = C Output Add to Dictionary
Index Code String
S S
SS L
SSL E 33 35 SSLE
E S
ES S 32 36 ESS
S EOF 19
Output:
12 15 19 19 12 5 29 27 33 32 19
45
JAWABAN SOAL 1 (3) (Dekompresi)
• Input : 12 15 19 19 12 5 29 27 33 32 19
• Initial dictionary A=1, …, Z=26
StringPW
CW P C Output
Add to Dictionary
Index String Index String
NULL 12 L L L
L 15 O L O O 27 LO
O 19 S O S S 28 OS
S 19 S S S S 29 SS
S 12 L S L L 30 SL
L 5 E L E E 31 LE
E 29 SS E S SS 32 ES
SS 27 LO SS L LO 33 SSL
46
JAWBAN LZW SOAL 1 (4) (Dekompresi)
StringPW
CW P C Output Add to Dictionary
Index String Index String
SS 33 SSL SS S SSL 34 SSS
SSL 32 ES SSL E ES 35 SSLE
ES 19 S ES S S 36 ESS
S EOF