Algoritma DHWT (Discrete Haar Wavelet Transform)


Algoritma DHWT (Discrete Haar Wavelet Transform) adalah salah satu algoritma yang dapat digunakan untuk melakukan kompresi sinyal ataupun gambar. Contoh yang dibahas kali ini adalah mengenai pengolahan file gambar.
Haar Wavelet adalah teknik analisa yang mirip seperti analisa Fourier, dan merupakan wavelet pertama yang diakui secara sah. Sama seperti algoritma transformasi sebelumnya, algoritma ini akan melakukan konversi data dari bentuk spasial menjadi bentuk frekuensi, kemudian melakukan pengolahan data frekuensi, dan dikonversi menjadi bentuk spasial menggunakan inversi metode yang bersangkutan.



Diketahui data awal adalah sebagai berikut. Dalam kasus ini akan digunakan gambar berwarna bertipe jpg dengan ukuran 128 x 128 pixel
lena

Perlu diingat bahwa ukuran lebar dan panjang yang direkomendasikan adalah kelipatan 2, dan ukuran gambar adalah persegi (ukuran lebar = ukuran panjang)
Jika ukuran gambar tidak persegi, maka gambar tersebut harus dikonversi agar menjadi ukuran persegi
Ada 2 cara untuk melakukan hal tersebut

  • Gambar tersebut diskala ulang
  • Dilakukan penambahan pixel warna hitam disekeliling gambar tersebut



Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan koefisien haar wavelet yang digunakan
Nilai yang digunakan adalah nilai default filter dekomposisi secara high pass dan filter rekonstruksi secara low pass

Private Const w0 As Double = 0.7071067812
Private Const w1 As Double = -0.7071067812
Private Const s0 As Double = 0.7071067812
Private Const s1 As Double = 0.7071067812


Langkah-langkah penggunaan algoritma ini adalah

1. Lakukan penyimpanan semua data warna dalam pixel yang terdapat dalam gambar tersebut
warna dalam sebuah pixel dibedakan menjadi 3 bagian, yaitu komponen merah, hijau, dan biru

For i = 0 To gmb.Width - 1
	For j = 0 To gmb.Height - 1
		inputPixel(i)(j)(0) = gmb.GetPixel(i, j).R
		inputPixel(i)(j)(1) = gmb.GetPixel(i, j).G
		inputPixel(i)(j)(2) = gmb.GetPixel(i, j).B
	Next j
Next i

* Karena gambar contoh adalah gambar berwarna, maka akan terdapat 3 komponen warna dalam gambar tersebut (merah, hijau, biru)
Masing-masing warna akan dilakukan proses perhitungan secara baris dan secara kolom,
Setelah itu akan dilakukan proses perhitungan inversi secara kolom dan secara baris,
Sehingga akan terdapat 12x perhitungan dengan menggunakan metode ini

2. Lakukan proses perhitungan pada setiap baris dari komponen warna merah
Lakukan normalisasi semua komponen warna merah dari rentang nilai 0 – 255 menjadi rentang nilai -1 – +1

For x = 0 To gmb.Width - 1
	For y As Integer = 0 To gmb.Height - 1
		tmpInput(x)(y) = (gmb.GetPixel(x, y).R - ((Byte.MaxValue + 1) / 2)) / ((Byte.MaxValue + 1) / 2)
	Next
Next

3. Lakukan proses perhitungan pada setiap kolom menggunakan metode DHWT (Discrete Haar Wavelet Transform)
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini

For x = 0 To gmb.Width - 1
	tmpOutput(x) = HitungDHWT(tmpInput(x))
Next

* Gunakan fungsi ini untuk melakukan proses perhitungan dengan metode DHWT (Discrete Haar Wavelet Transform)

Public Function HitungDHWT(ByVal data() As Double) As Double()
	Dim output As Double() = New Double(data.Length - 1) {}

	Dim h As Integer = data.Length / 2
	For i As Integer = 0 To h - 1
		Dim k As Integer = i * 2
		output(i) = (data(k) * s0 + data(k + 1) * s1) / (2 * s0)
		output(i + h) = (data(k) * w0 + data(k + 1) * w1) / (2 * w0)
	Next

	Return output
End Function

4. Catat semua nilai pada masing-masing kolom menjadi nilai baris
Kemudian lakukan proses perhitungan pada setiap baris menggunakan metode DHWT (Discrete Haar Wavelet Transform)
Penjelasan tentang fungsi ini sudah dijelaskan pada perhitungan sebelumnya

For x = 0 To gmb.Height - 1
	For y As Integer = 0 To gmb.Width - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Height - 1
	tmpOutput(x) = hitungDHWT(tmpInput(x))
Next

5. Simpan semua nilai output sementara menjadi nilai input
Kemudian lakukan proses perhitungan pada setiap baris menggunakan metode inversi DHWT
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini

For x = 0 To gmb.Height - 1
	For y As Integer = 0 To gmb.Width - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Height - 1
	tmpOutput(x) = hitungIDHWT(tmpInput(x))
Next

* Gunakan fungsi ini untuk melakukan proses perhitungan dengan metode inversi DHWT

Public Function HitungIDHWT(ByVal data() As Double) As Double()
	Dim output As Double() = New Double(data.Length - 1) {}

	Dim h As Integer = data.Length / 2
	For i As Integer = 0 To h - 1
		Dim k As Integer = i * 2
		output(k) = (data(i) * s0 + data(i + h) * w0) / w0
		output(k + 1) = (data(i) * s1 + data(i + h) * w1) / s0
	Next

	Return output
End Function

6. Catat semua nilai pada masing-masing baris menjadi nilai kolom
Kemudian lakukan proses perhitungan pada setiap kolom menggunakan metode inversi DHWT
Penjelasan tentang fungsi ini sudah dijelaskan pada perhitungan sebelumnya

For x = 0 To gmb.Width - 1
	For y As Integer = 0 To gmb.Height - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Width - 1
	tmpOutput(x) = HitungIDHWT(tmpInput(x))
Next

7. Masukkan nilai output sementara sebagai nilai output untuk komponen warna merah
Jika nilai output ternyata diluar batas warna yang diperbolehkan,
maka kembalikan nilainya agar masuk dalam batas tersebut

For x = 0 To gmb.Width - 1
	For y = 0 To gmb.Height - 1
		tmpOutput(x)(y) = tmpOutput(x)(y) * ((Byte.MaxValue + 1) / 2) + ((Byte.MaxValue + 1) / 2)

		If tmpOutput(x)(y) < 0 Then
			outputPixel(x)(y)(0) = 0
		ElseIf tmpOutput(x)(y) > 255 Then
			outputPixel(x)(y)(0) = 255
		Else
			outputPixel(x)(y)(0) = tmpOutput(x)(y)
		End If
	Next
Next

8. Lakukan proses yang sama (poin 2 – 7) untuk komponen warna hijau dan biru

For x = 0 To gmb.Width - 1
	For y As Integer = 0 To gmb.Height - 1
		tmpInput(x)(y) = (gmb.GetPixel(x, y).G - ((Byte.MaxValue + 1) / 2)) / ((Byte.MaxValue + 1) / 2)
	Next
Next

For x = 0 To gmb.Width - 1
	tmpOutput(x) = HitungDHWT(tmpInput(x))
Next

For x = 0 To gmb.Height - 1
	For y As Integer = 0 To gmb.Width - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Height - 1
	tmpOutput(x) = HitungDHWT(tmpInput(x))
Next

For x = 0 To gmb.Height - 1
	For y As Integer = 0 To gmb.Width - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Height - 1
	tmpOutput(x) = HitungIDHWT(tmpInput(x))
Next

For x = 0 To gmb.Width - 1
	For y As Integer = 0 To gmb.Height - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Width - 1
	tmpOutput(x) = HitungIDHWT(tmpInput(x))
Next

For x = 0 To gmb.Width - 1
	For y = 0 To gmb.Height - 1
		tmpOutput(x)(y) = tmpOutput(x)(y) * ((Byte.MaxValue + 1) / 2) + ((Byte.MaxValue + 1) / 2)

		If tmpOutput(x)(y) < 0 Then
			outputPixel(x)(y)(1) = 0
		ElseIf tmpOutput(x)(y) > 255 Then
			outputPixel(x)(y)(1) = 255
		Else
			outputPixel(x)(y)(1) = tmpOutput(x)(y)
		End If
	Next
Next

For x = 0 To gmb.Width - 1
	For y As Integer = 0 To gmb.Height - 1
		tmpInput(x)(y) = (gmb.GetPixel(x, y).B - ((Byte.MaxValue + 1) / 2)) / ((Byte.MaxValue + 1) / 2)
	Next
Next

For x = 0 To gmb.Width - 1
	tmpOutput(x) = HitungDHWT(tmpInput(x))
Next

For x = 0 To gmb.Height - 1
	For y As Integer = 0 To gmb.Width - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Height - 1
	tmpOutput(x) = HitungDHWT(tmpInput(x))
Next

For x = 0 To gmb.Height - 1
	For y As Integer = 0 To gmb.Width - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Height - 1
	tmpOutput(x) = HitungIDHWT(tmpInput(x))
Next

For x = 0 To gmb.Width - 1
	For y As Integer = 0 To gmb.Height - 1
		tmpInput(x)(y) = tmpOutput(x)(y)
	Next
Next

For x = 0 To gmb.Width - 1
	tmpOutput(x) = HitungIDHWT(tmpInput(x))
Next

For x = 0 To gmb.Width - 1
	For y = 0 To gmb.Height - 1
		tmpOutput(x)(y) = tmpOutput(x)(y) * ((Byte.MaxValue + 1) / 2) + ((Byte.MaxValue + 1) / 2)

		If tmpOutput(x)(y) < 0 Then
			outputPixel(x)(y)(2) = 0
		ElseIf tmpOutput(x)(y) > 255 Then
			outputPixel(x)(y)(2) = 255
		Else
			outputPixel(x)(y)(2) = tmpOutput(x)(y)
		End If
	Next
Next

* Tampilkan pada layar

Dim bitMap As Bitmap = BuatBitmap(outputPixel, 2)
picHasil.Image = bitMap.Clone
bitMap.Dispose()


Hasil akhir adalah: (klik untuk perbesar gambar)

DHWT hasil akhir

Karena tidak melakukan proses pengolahan data frekuensi apapun, maka hasil akhir perhitungan tersebut akan mengembalikan gambar yang sama seperti awalnya.


Contoh source code lengkap dalam bahasa VB (Visual Basic) dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *