Minggu, 11 September 2016

Discrete Wave Transform to Image Compression


[www.sofscients.web.id] DWT juga bisa digunakan untuk mengurangi ukuran sebuah gambar dengan teknik lossy (alias kualitas gambar bisa menurun). Untuk mempermudah dalam melakukan teknik kompressi, maka penulis bekerja menggunakan format grayscale untuk menggambarkan keluaran DWT yaitu



  • csA: Approximation Coefficient
  • csH: Horizontal Coefficient
  • csV: Vertical Coefficient
  • csD: Diagonal Coefficient
Setiap coeffisien akan menghasilkan angka lebih dari 255 dan kurang dari 0, Sehingga kita harus menjadikannya

x>=255 menjadi 255, dan
x<=0 menjadi 0


dimana x adalah nilai coefisien yang dihasilkan oleh DWT
berikut bila diterapkan pada citra berformat RGB


Tanpa compresi
1609 Kb   

Tercompresi
1395 Kb

Penulis menggunakan bahasa python untuk melakukan kompresi gambar, anda pun bisa menggunakan matlab koq, karena matlab lebih lengkap toolbox nya. Bila anda menggunakan python, maka anda perlu install modul PIL, Numpy, Matplotlib, PyWt.

Code yang penulis buatkan, telah dimodifikasi untuk support mengolah gambar format RGB dan Grayscale

'''
oleh mulkan.ms@gmailcom
untuk melakukan proses teknik kompresi gambar dengan teknik Discrete Wave Transform
'''


import pywt 
import matplotlib.pyplot as plt
import numpy as np 
import Image 

def compress(array,wavelet_type,filename,do_compress=False):
    if len(array.shape)==3:
        op = I.copy()
        for i in range(0,3):
            data = array[:,:,i] #ambil array tiap layer
            coeffs = pywt.dwt2(data, wavelet_type)
            csA, (csH, csV, csD) = coeffs
            if do_compress==True:
                csA = doRange(csA,255)
                csH = doRange(csH,255)
                csV = doRange(csV,255)
                csD = doRange(csD,255)
            clean_coeff = csA, (csH, csV, csD)
            values = pywt.waverec2(clean_coeff, wavelet_type)
            op[:,:,i] = values
        saveImage(op,filename)
    else    :
        coeffs = pywt.dwt2(array, wavelet_type)
        csA, (csH, csV, csD) = coeffs
        if do_compress == True:
            csA = doRange(csA,255)
            csH = doRange(csH,255)
            csV = doRange(csV,255)
            csD = doRange(csD,255)
        clean_coeff = csA, (csH, csV, csD)
        values = pywt.waverec2(clean_coeff, wavelet_type)
        saveImage(values,filename)
def rgb2gray(rgb): #digunakan untuk konversi dari rgb ke gray
    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
    return gray
def doRange(data,T): #untuk mengubah range pixel nya
    data = np.array(data)
    data[data>T] = 255
    data[data<0] = 0
    return data
def saveImage(values,lokasi): #untuk menyimpan array menjadi format image
    if len(values.shape)==3: 
        height, width, dimensi = values.shape
        new_image = Image.new('RGB', (width, height))
        new = new_image.load()
        values = values.astype(int)
        for w in range(width):
                for h in range(height):
                    new[w, h] = (values[h][w][0],values[h][w][1],values[h][w][2])
        new_image.save(lokasi)
    else    :
        height, width = values.shape
        new_image = Image.new('RGB', (width, height))
        new = new_image.load()
        values = values.astype(int)
        for w in range(width):
                for h in range(height):
                    new[w, h] = (values[h][w],values[h][w],values[h][w])
        new_image.save(lokasi)
    return new
    
plt.close('all')
I = plt.imread('D:/gambar2.jpg')
wavelet_type = 'Haar'
gray = rgb2gray(I)
coeffs = pywt.dwt2(gray, wavelet_type)
csA, (csH, csV, csD) = coeffs
plt.figure()
plt.subplot(2,2,1),plt.imshow(csA,cmap=plt.cm.gray),plt.title('Approximation ')
plt.subplot(2,2,2),plt.imshow(csH,cmap=plt.cm.gray),plt.title('Horizontal ')
plt.subplot(2,2,3),plt.imshow(csV,cmap=plt.cm.gray),plt.title('Vertical ')
plt.subplot(2,2,4),plt.imshow(csD,cmap=plt.cm.gray),plt.title('Diagonal')

compress(I,wavelet_type,'D:/2. compress.png',do_compress=True)
    




http://www.pybytes.com
http://octvi.blogspot.co.id/2013/05/assignment-6-image-compression.html

bila anda kesulitan dalam melakukan proses instalasi modul di python, anda bisa berkunjung ke www.softscients.web.id


sebenarnya teknik diatas tersebut dapat digunakan untuk de noise sebuah citra (akan dibahas di artikel selanjutnya)

Posting Komentar