apa perbedaan dekomposisi dan transformasi wavelet

1,342 Views

apa perbedaan dekomposisi dan transformasi wavelet – Bila kita menilik lebih jauh menggunakan package pywavelet ada 2 fungsi yaitu dwt2 dan wavedec2. Keduanya merupakan penerapan wavelet untuk 2 dimensi.

Mari kita coba satu – persatu dengan pertanyan dari multi level wavelet dan bagaimana penerapannya nanti. Sesuai dokumentasi dari pywavelet sebagai berikut

Fungsi dwt2

Single-level discrete 2-D wavelet transform – The dwt2 command performs a single-level two-dimensional wavelet decomposition. Artinya fungsi ini hanya digunakan untuk level = 1, dan tidak bisa untuk multi level.

Fungsi wavedec

Multilevel 2-D wavelet decomposition Artinya nya untuk multilevel wavelet.

Perbedaannya adalah

  • dwt2 single-level (menghasilkan output A, H, V, D tunggal), dan
  • wavedec2 bertingkat (menghasilkan output array C, yang berisi banyak A, H, V, D di dalamnya):

Mari kita coba gunakan dwt2 yang dilakukan sebanyak 5 kali terus menerus (dalam pikiran kita yaitu output level 1 akan digunakan untuk level 2 dan seterusnya)

import numpy as np
import pywt
from pywt import wavedec
import matplotlib.pyplot as plt

def multiwavelet(data,level=1):
    LL = data
    LH = None
    HL = None
    HH = None
    for i in range(0,level):
        LL, (LH, HL, HH) = pywt.dwt2(LL, 'db32',mode='symmetric')
    return LL,LH,HL,HH

Kemudian kita akan langsung menerapkan fungsi diatas pada sebuah gambar

import cv2
img = cv2.imread('gambar.jpg',0) #dibaca sebagai gray
level = 5

LL,LH,HL,HH = multiwavelet(img,level=level)
plt.figure()
plt.imshow(LL,cmap='gray')
plt.title("Level: "+str(level))
plt.show()

namun apa yang terjadi

Malahan makin nggak karuan, harusnya kan mengecil ukurannya, kita coba dengan fungsi wavedec2 dengan level=2 saja

c = pywt.wavedec2(img, 'db2', mode='symmetric', level=level)
 # normalize each coefficient array independently for better visibility
c[0] /= np.abs(c[0]).max()
for detail_level in range(level):
    c[detail_level + 1] = [d/np.abs(d).max() for d in c[detail_level + 1]]
# show the normalized coefficients
arr, slices = pywt.coeffs_to_array(c)
plt.figure()
plt.imshow(arr,cmap='gray')
plt.title("Level: "+str(level))
plt.show()

Hasilnya

Ilustrasinya sebagai berikut https://pywavelets.readthedocs.io/en/latest/ref/2d-decompositions-overview.html

Kesimpulan

jadi kesimpulan dari apa perbedaan dekomposisi dan transformasi wavelet yaitu

  • dwt2 is the single level decomposition (transformasi untuk level=1)
  • wavedec2 is multilevel decomposition (jika dilakukan multilevel transformasi dinamakan dekomposisi)
See also  Deteksi Tepi / Edge Detection

Menggunakan Dwt2 untuk multi level

Sebenarnya kita juga bisa menggunakan dwt2 untuk multi level, tapi caranya satu-persatu, misalkan untuk level = 2, sebagai contoh menghilangkan derau/noise yaitu pada saat invers tidak meng include kan komponen HH

img = cv2.imread('gambar.jpg',0)
#level 1
LL, (LH, HL, HH) = pywt.dwt2(img, 'db32',mode='symmetric')
#level 2
LL1, (LH1, HL1, HH1) = pywt.dwt2(LL, 'db32',mode='symmetric')
LL2, (LH2, HL2, HH2) = pywt.dwt2(LH, 'db32',mode='symmetric')
LL3, (LH3, HL3, HH3) = pywt.dwt2(HL, 'db32',mode='symmetric')
LL4, (LH4, HL4, HH4) = pywt.dwt2(HH, 'db32',mode='symmetric')
#lakukan invers, misalkan dengan menghilangkan komponen HH
denoised1 = pywt.idwt2((LL1, (LH1, HL1, None)), 'db32',mode='symmetric')
denoised2 = pywt.idwt2((LL2, (LH2, HL2, None)), 'db32',mode='symmetric')
denoised3 = pywt.idwt2((LL3, (LH3, HL3, None)), 'db32',mode='symmetric')
denoised4 = pywt.idwt2((LL4, (LH4, HL4, None)), 'db32',mode='symmetric')
#lakukan invers lagi
final = pywt.idwt2((denoised1, (denoised2, denoised3, None)), 'db32',mode='symmetric')

Bila ingin ditampilkan, gunakan cara berikut

titles = ['asli','invers DWT tanpa komponen HH']
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(20, 15))
for i, a in enumerate([img2,final]):
    ax[i].imshow(a, cmap=plt.cm.gray)
    ax[i].set_title(titles[i], fontsize=10)
    ax[i].set_xticks([])
    ax[i].set_yticks([])
fig.tight_layout()
plt.show()

Sedangkan untuk fungsi wavedec2 yang memang digunakan untuk beragam level, maka caranya sangat mudah

coeffs = pywt.wavedec2(img, 'haar',mode='symmetric', level=2)

itu sebenarnya bila kita breakdown argument outputnya sebagai berikut

[cA2, (cH2, cV2, cD2),(cH1, cV1, cD1)] = pywt.wavedec2(img2, 'haar',mode='symmetric', level=2)

yaitu mengikuti rumus

Coefficients list [cAn, (cHn, cVn, cDn), … (cH1, cV1, cD1)]

Mari kita coba invers dengan menghilangkan komponen HH yaitu cD1 dan cD2 nya

reconstructed_signal = pywt.waverec2([cA2, (cH2, cV2, None),(cH1, cV1, None)], 'haar',mode='symmetric')
titles = ['asli','dekomposisi dengan menghilangkan komponen H yaitu cD1 dan dan cD2']
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(20, 15))
for i, a in enumerate([img2,reconstructed_signal]):
    ax[i].imshow(a, cmap=plt.cm.gray)
    ax[i].set_title(titles[i], fontsize=10)
    ax[i].set_xticks([])
    ax[i].set_yticks([])
fig.tight_layout()
plt.show()

 

 

Leave a Comment