×

apa perbedaan dekomposisi dan transformasi wavelet

apa perbedaan dekomposisi dan transformasi wavelet

526 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  Segmentasi Gambar

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

 

 

You May Have Missed