Joss-Sangad

Sebuah tempat berbagi informasi

Thursday, November 17, 2022

Tugas pertemuan 10 - 17200083 - 17.5a.97 - Ahmad Guntur Dwi Herjanto

Nim    : 17200083

Nama : Ahmad Guntur Dwi Herjanto

Kelas  : 17.5a.97

Mata Pelajaran : Pengolahan Citra


1. Algoritma Shannon Fano

Refrensi : Analisis Algoritma Shannon-Fano Dalam Kompresi Data Pengajuan Proposal Skripsi Mahasiswa STMIK CIC Cirebon Chairun Nas1 , Wanda Ilham2 , Ilwan Syafrinal3 ,

Algoritma Shannon-Fano pada dasarnya adalah metode yang mengganti setiap simbol yang ada pada data menjadi kode biner yang panjangnya ditentukan berdasarkan pada probabilitas simbol. Algoritma ini disebut sebagai teknik kompresi data paling awal yang ditemukan oleh Claude Shannon dan Robert Fano pada tahun 1949 di MIT. Algoritma Shannon-Fano menggunakan pendekatan top down dalam penyusunan binary tree, sehingga sangat efisien untuk mengkompresi data teks yang berukuran besar.

Secara garis besar, algoritma Shannon-Fano memiliki ketentuan sebagai berikut:

a. Setiap simbol yang berbeda memiliki kode yang berbeda. 
b. Simbol dengan probabilitas yang kecil memiliki kode panjang bit yang lebih panjang dan simbol dengan probabilitas yang lebih besar memiliki panjang bit yang lebih pendek. 
c. Meskipun kode yang dihasilkan memiliki panjang bit yang berbeda dengan kode pada karakter asli, tetapi dapat dikodekan secara unik.

Maka adapun langkah-langkah dalam kompresi data pada algoritma ShannonFano dapat dilihat sebagai berikut: 

a. Urutkan simbol sesuai dengan karakter tabel ASCII serta bangun tabel daftar kemunculan simbol dari data (Probabilitas simbol) 
b. Urutkan tabel kemunculan simbol sesuai dengan frekuensi kemunculan dari frekuensi kemunculan paling tinggi ke paling terendah. 
c. Bagilah tabel kemunculan simbol menjadi dua bagian dengan pembagian berdasarkan pada total frekuensi bagian (bagian atas) sedekat mungkin dengan jumlah frekuensi dengan bagian yang lain (bagian bawah). Hal ini dapat dilakukan dengan membentuk pohon biner.
d. Tetapkan bagian atas dengan digit biner 0 dan bagian bawah dengan digit biner 1 
e. Terapkan langkah 3 dan 4 secara berulang-ulang untuk masing-masing dua bagian. Bagilah kelompok dan tambahkan bit ke kode sehingga setiap simbol memperoleh daun yang sesuai dengan pohon biner.

1.1 Analisa Dan Pembahasan

Sebelum dilakukan implementasi kedalam Sistem, algoritma Shannon-Fano perlu dilakukan analisa untuk mengetahui bagaimana proses kompresi data yang dilakukan oleh algoritma. Pada pembahasan berikut data yang akan dilakukan analisa adalah berupa teks. Adapun contoh data kasus yang akan dilakukan analisa sebagai berikut:

“ PENELITIAN INI DILAKUKAN UNTUK MEMPEROLEH GELAR 
SARJANA ILMU KOMPUTER ”

Dari data teks berikut, selanjutnya dilakukan proses kompresi algoritma Shannon-Fano. Berdasarkan langkah-langkah pada algoritma Shannon-Fano, maka dapat dijabarkan proses analisis sebagai berikut:

a. Mengurutkan karakter sesuai dengan tabel ASCII dan menghitung frekuensi kemunculan. Adapun pengurutan berdasarkan karakter sesuai dengan tabel ASCII dan frekuensi kemunculan karakter dapat dilihat pada Tabel 1 berikut:

Dari pengkodean ke dalam ASCII, maka dapat diketahui besar ukuran memori yang dibutuhkan untuk menyimpan data kasus tersebut. Untuk mengetahui ukuran memori yang dibutuhkan dari data kasus tersebut adalah sebagai berikut: 

                             Ukuran Memori Karakter = Banyak Karakter X Ukuran Bit (1) 

Maka dari rumus diatas peroleh ukuran memori dari data kasus seperti pada Tabel 2 Berikut:



Selanjutnya urutkan karakter berdasarkan frekuensi kemunculan tertinggi sampai yang terendah (descending) seperti pada Tabel 2 berikut:


Proses selanjutnya adalah membagi kemunculan karakter menjadi dua bagian, dimana jumlah frekuensi bagian atas (bagian pertama) sedekat mungkin dengan jumlah frekuensi dengan bagian bawah (bagian kedua). Untuk membagi bagian tersebut, dapat digunakan dengan cara membentuk pohon biner. Pada pohon biner, bagian atas dimulai dengan digit biner 0 dan bagian bawah dimulai dengan digit 1. Lakukan hal ini secara berulang sampai semua karakter memiliki digit biner. Adapun pohon biner yang terbentuk adalah seperti Gambar 2 berikut

  


setelah diperoleh pohon biner, maka dapat ditentukan kode ShannonFano untuk setiap karakter. Kode Shannon-Fano diperoleh dari setiap digit biner karakter, seperti pada karakter E, untuk melihat kode Shannon-Fano dapat dilihat digit biner dari atas ke bawah yaitu 001. Adapun kode Shannon-Fano untuk setiap karakter dapat dilihat pada Tabel 3 berikut:

Untuk menghitung ukuran memori karakter yang telah dikodekan dengan algoritma Shannon-Fano dapat mengikuti rumus menghitung ukuran memori karakter di atas. Adapun ukuran memori dari karakter yang telah dikodekan dapat dilihat pada Tabel 5 berikut: 


Setelah dilakukan kompresi dengan algoritma Shannon-Fano, maka ukuran memori data kasus dari 69 Byte menjadi 35,25 byte. Selanjutnya dapat dihitung rasio pemampatan dengan menggunakan rumus:


Maka dengan menggunakan rumus diatas, diperoleh rasio kompresi sebagai berikut:


Dari proses kompresi, maka diperoleh bahwa 48,92 % ukuran memori dari ukuran awal berhasil di kompresi. 

2. Metode Huffman

Refrensi: Teknik Kompresi Citra Menggunakan Metode Huffman Tri Rahmah Silviani, Ayu Arfiana Program Pascasarjana Universitas Negeri Yogyakarta

Metode Huffman Metode Huffman merupakan salah satu metode dalam teori persandian yang dimanfaatkan dalam proses kompresi data. Kode Huffman diusulkan oleh Dr. David A. Huffman pada tahun 1952 sebagai metode yang ditujukan untuk mengkonstruksi kode redundansi minimum [3]. Metode Huffman termasuk dalam kelompok metode kompresi lossless yaitu metode kompresi yang tidak menghilangkan informasi setelah dilakukan kompresi [1]. Hasil yang diperloleh dari proses kompresi dengan file asli tidak berubah, hanya saja bit dalam file tersebut berkurang. Cara kerja dalam metode ini adalah dengan melakukan pengkodean dalam bentuk bit untuk mewakili data karakter.

Citra yang telah dikompresi tentu harus didekompresi agar citra tersebut sesuai dengan citra aslinya. Terdapat dua cara yang dapat dilakukan dalam kompresi citra menggunakan metode Huffman, yaitu [2]: 1. Menggunakan pohon Huffman Langkah-langkah penguraian kode Huffman menggunakan pohon Huffman sebagai berikut: 
a. Membaca bit pertama dari string biner 
b. Melakukan traversal pada pohon Huffman mulai dari akar sesuai dengan bit yang dibaca. 
c. Jika bit yang dibaca nol maka akar yang dibaca adalah akar kiri, sementara itu jika yang dibaca 1 maka yang dibaca adalah akar kanan 
d. Jika anak dari pohon bukan daun maka baca bit berikutnya dari string biner e. Pada daun tersebut ditemukan simbol dan proses penguraian kode Huffman selesai

2. Menggunakan tabel kode Huffman Tabel kode Huffman disusun menggunakan prefix code, sehingga kode untuk sebuah karakter tidak bisa menjadi awalan dari kode yang lain. String biner yang dienkripsi dapat dipisahkan berdasarkan rangkaian bitnya untuk kemudian diuraikan menjadi data awal. Pada penguraian kode menggunakan tabel kode Huffman yang dapat dilakukan adalah melihat setiap rangkaian bit yang ditemukan dalam string biner dan hasil enkripsi data di dalam tabel kode Huffman. Berikut merupakan algoritma Huffman dalam mengkompresi data [6].


Contoh 1. Terdapat citra dengan representasi matriks, tiap piksel dikodekan dengan 8 bit warna, sebagai berikut:


Dari data tersebut akan dilakukan kompresi. Langkah-langkah pengkodean pada data citra sebagai berikut:

1. Bentuk vektor dari dari data citra yang berupa matriks tersebut yaitu:


Jumlah piksel 16

2. Probabilitas kemunculan warna pada citra

3. Simpul pohon biner

4. Pembentukan pohon biner

5. Konversi data


6. Penyimpan data

Ukuran: kode Huffman, data warna 
 Rasio kompresi citra pada contoh 1 
 Ukuran citra sebelum kompresi: 16 piksel 8 bit warna bit 
 Ukuran citra setelah kompresi: 


Jika dilakukan dekompresi maka file yang dihasilkan akan sama persis dengan file aslinya akan tetapi ukuran bit dalam citra tersebut menjadi 32 bit dengan rasio kompresi sebanyak 75 %.

3. Metode RLE (Running Length Enconding)


Algoritma RLE (Run Length Encoding) adalah salah satu algoritma yang dapat digunakan untuk melakukan kompresi data sehingga ukuran data yang dihasilkan menjadi lebih rendah dari ukuran sebenarnya. Contoh yang dibahas kali ini adalah mengenai kompresi dan pengembalian data dari sebuah kalimat.
RLE (Run Length Encoding) adalah bentuk paling mudah dari teknik kompresi data lossless dimana sederetan data dengan nilai yang sama secara berurutan akan disimpan menjadi sebuah nilai data dan jumlahnya. Algoritma ini sangat berguna pada data yang memiliki banyak data dengan nilai yang sama secara berurutan seperti file ikon, gambar garis, dan animasi. Algoritma ini tidak cocok diterapkan pada data normal karena akan hal tersebut akan mengakibatkan semakin bertambahnya ukuran data kompresi dibandingkan data awalnya

Langkah-langkah penggunaan algoritma ini adalah

* Tentukan kalimat yang digunakan sebagai data input
Diasumsikan data input adalah sebagai berikut:
LLLLLLoooooooooorrrrrrrrrrreeeeeeeeeeemmmmmmm IIIIIIIppppppppppsssssssuuuuuuuuuummmmmmmmm

1. Hitung ukuran data yang digunakan dalam perhitungan sebagai penanda ukuran data sebelum dilakukan kompresi

Dim inputData As Byte() = System.Text.Encoding.[Default].GetBytes(input)
Dim ukuranInputData As UInteger = CUInt(input.Length)
Console.WriteLine("Ukuran input data = " & ukuranInputData)

2. Lakukan proses kompresi data menggunakan algoritma ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim KompresiData As Byte() = New Byte(ukuranInputData * (257 / 256)) {}
Dim ukuranKompresiData As Integer = Compress(inputData, KompresiData, ukuranInputData)

* Gunakan fungsi ini untuk melakukan kompresi data

Public Function Compress(input As Byte(), ByRef output As Byte(), ukuranInput As UInteger) As Integer
	Dim byte1 As Byte, byte2 As Byte, penanda As Byte
	Dim i As UInteger, posisiInput As UInteger, posisiOutput As UInteger, count As UInteger
	Dim histogram As UInteger() = New UInteger(255) {}

	If ukuranInput < 1 Then
		Return 0
	End If

	For i = 0 To 255
		histogram(i) = 0
	Next

	For i = 0 To ukuranInput - 1
		histogram(input(i)) += 1
	Next

	penanda = 0

	For i = 1 To 255
		If histogram(i) < histogram(penanda) Then
			penanda = CByte(i)
		End If
	Next

	output(0) = penanda
	posisiOutput = 1

	byte1 = input(0)
	posisiInput = 1
	count = 1

	If ukuranInput >= 2 Then
		byte2 = input(posisiInput)
		posisiInput += 1
		count = 2

		Do
			If byte1 = byte2 Then
				While (posisiInput < ukuranInput) AndAlso (byte1 = byte2) AndAlso (count < 32768)
					byte2 = input(posisiInput)
					posisiInput += 1
					count += 1
				End While

				If byte1 = byte2 Then
					encodeDenganPerulangan(output, posisiOutput, penanda, byte1, count)

					If posisiInput < ukuranInput Then
						byte1 = input(posisiInput)
						posisiInput += 1
						count = 1
					Else
						count = 0
					End If
				Else
					encodeDenganPerulangan(output, posisiOutput, penanda, byte1, count - 1)
					byte1 = byte2
					count = 1
				End If
			Else
				encodeTanpaPerulangan(output, posisiOutput, penanda, byte1)
				byte1 = byte2
				count = 1
			End If
			If posisiInput < ukuranInput Then
				byte2 = input(posisiInput)
				posisiInput += 1
				count = 2
			End If
		Loop While (posisiInput < ukuranInput) OrElse (count >= 2)
	End If

	If count = 1 Then
		encodeTanpaPerulangan(output, posisiOutput, penanda, byte1)
	End If

	Return CInt(posisiOutput)
End Function

3. Dapatkan hasil kompresi data dan ukuran data hasil kompresi yang baru

Dim teksKompresiData As String = System.Text.Encoding.[Default].GetString(KompresiData)

4. Lakukan proses pengembalian data kompresi menggunakan algoritma ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim PengembalianData As Byte() = New Byte(ukuranInputData - 1) {}
Decompress(KompresiData, PengembalianData, CUInt(ukuranKompresiData))

* Gunakan fungsi ini untuk melakukan pengembalian data kompresi

Public Sub Decompress(input As Byte(), output As Byte(), ukuranInput As UInteger)
	Dim penanda As Byte, simbol As Byte
	Dim i As UInteger, posisiInput As UInteger, posisiOutput As UInteger, count As UInteger

	If ukuranInput < 1 Then
		Return
	End If

	posisiInput = 0
	penanda = input(posisiInput)
	posisiInput += 1
	posisiOutput = 0

	Do
		simbol = input(posisiInput)
		posisiInput += 1

		If simbol = penanda Then
			count = input(posisiInput)
			posisiInput += 1

			If count <= 2 Then
				For i = 0 To count
					output(posisiOutput) = penanda
					posisiOutput += 1
				Next
			Else
				If Convert.ToBoolean(count And &H80) Then
					count = ((count And &H7F) << 8) + input(posisiInput)
					posisiInput += 1
				End If

				simbol = input(posisiInput)
				posisiInput += 1

				For i = 0 To count
					output(posisiOutput) = simbol
					posisiOutput += 1
				Next
			End If
		Else
			output(posisiOutput) = simbol
			posisiOutput += 1
		End If
	Loop While posisiInput < ukuranInput
End Sub

5. Dapatkan hasil pengembalian data dan ukuran data hasil hasil pengembalian data kompresi yang baru

Dim teksPengembalianData As String = System.Text.Encoding.[Default].GetString(PengembalianData)
Dim ukuranPengembalianData As UInteger = CUInt(teksPengembalianData.Length)
6. Hasil Akhir



No comments:

Post a Comment