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