apa perbedaan dekomposisi dan transformasi wavelet
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()