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
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)
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.