Search what you want

Tuesday, January 5, 2016

[PPCD] Image Compresion

seperti yang kita tahu image / citra merupakan kumpulan dari ribuan bahkan jutaan pixel yang tersusun rapi sehingga membentuk suatu gambar yang bagus. kebayang ga sih bagaimana citra itu disimpan jika 1 pixel itu memakan memori sebanyak 3 byte (RGB)? sekarang misalkan saya memiliki kamera dengan resolusi 18Mp, jika kita kalkulasikan:

18 Mp = 18.000.000 px x 3 byte 
           = 54 = 10^6 byte
           = 54 MB

dengan begitu artinya, sekali saya melakukan pengambilan gambar, saya membutuh kan memori sebanyak 54MB. nah loh kebayang ga sih gimana membuka file sebesar itu? yang ada juga komputer atau device kita (kalau kuat) akam mengalami loading dulu kan ya? syukur2 ga error. jika kalian punya camera SLR (dengan resolusi yang sama) pernah ga mengambil gambar dan satu gambarnya memiliki ukuran file yang sangat besar, misal 54 MB? saya rasa tidak. lalu bagaimanakah gambar-gambar tersebut memiliki ukuran gambar yang relatif kecil? pada artikel ini saya akan membahas bagaimanakan gambar / citra dilakukan kompresi.

langsung saja, 
ide dasar dilakukannya compresi yaitu menghilangkan redudansi. nah dalam redudansi sendiri ada beberapa macam:
1. coding
2. psicovisual
3. interpixel

---------------------------------------

sedangkan kompresi sendiri memiliki 2 macam, yaitu:
1. Lossless  -> tidak ada pengurangan informasi
                   -> ukuran setelah kompresi > lossy
                   -> BMP, PNG, GIF
                   -> digunakan ketika kita lebih mementingkan keakuratan gambar
                   -> melakukan percetakan gambar
2. Lossy     -> terdapat pengurangan informasi
                   -> ukuran setelah komppresi < Lossles
                   -> untuk menghitung kebaikan algoritama kompresi -> harus ada ukuran banyaknya data yg hilang 
                   -> JPEG
                   -> digunakan ketiaka gambar di peruntukan dalan dah yang berhubungan dengan pengiriman data, misal aktivitas treaming, uplaod ke media social.

karena lossless data / informasi tidak ada yang hilang berarti sedikit masalh dengan teknik ini. berbeda dengan lossy, hal ini harus dilakukan pendalam sendiri terhadap teknik lossy. lanjut saja, bagaimana kita melakukan pengukuran terhadap lossy? berapa banyak data yagn hilang? dsb.
pengukuran terhadap hasil kompresi lossy, terdapat w macam:
1. Subjektif -> secara subjektif, kita dapat mengukur dengan cara membandingkan 2 gambar (gambar asli, hasil kompresi) dan kita tanyakan kepada beberapa orang untuk melakukan penilaian, gambar manakah yang lebih baik? seberapa baik gambar hasil kompresi? dll
2. objektif -> sedangkan secara objektif, kita dapat melakukan pengukuran dengan beberapa metode:
    a. RMSE (Root Mean Square Error) -> jika hasil mendekati 0, maka jarak antara 2 gambar kecil.

    b. SNR (Signal to Noise Ratio) -> semakin besar hasil SNR, maka kompresi semakin baik  

|  |  |  |
|  |  |  |
|  |  |  |
contoh perhitungan:
citra asli:
| 1 | 3 | 1 |
| 2 | 1 | 4 |
| 5 | 1 | 2 |

citra hasil kompresi:
| 1 | 2 | 1 |
| 0 | 3 | 4 |
| 1 | 2 | 2 |

~oke kita skip dulu perhitungannya~

------------------------------------------------
lanjut, setelah kita mengetahui banyaknya data yang hilang dari suatu gambar hasil kompresi, lalu bagaimanakan kita mengukur nilai kebaikannya? 

Ukuran kebaikan kompresi:
CR (copretion ratio) = n1/n2
-> n1 = citra ukuran asli
-> n2 = citra ukuran setelah kompresi
RD (redudansi ...) = 1 - (1/CR)    ----> menghitung banyaknya redudansi pada citra asli

# n1 = n2 (CR = 1 & RD = 0)
tidak ada redudansi pada citra asli
 
# n1 >>  n2 (CR=~ & RD=1)
gambar asli sangat redundant

# n1 << n2 (CR=0 & RD = -~)
kasus yang tidak diinginkan 

--------------------------------------------------

kembali lagi ke perhitungan pengukuran secara subjektif. perhitungan secara subjektif dapat dilakukan dengan menggunakan kuesioner dengan melakukan penilaian secara langsung oleh pengamat (baik, sanggat baik, tidak baik, dsb) dengan masing masing pilihan memiliki kriteria masing-masing.
contohnya yaitu psycovisual

----------------------------------------------------

encoding
dalam teknik ini, bagaimana cara kita memetakan setiap katakter ke bit yang sesuai dan sesuai dengan kesepakatan bersama.
contohnya dalam ASCII bit 65 merupakan representaasi dari karakter A, 97 -> a dan lain sebagainya. lalu bagaimanakah dengan gambar?

#skema encoding I
-----------------------
no   bit    frekuensi
-----------------------
1   0000       50        -> 4 bit x 50 = 200
2   0001       40        -> 4 bit x 40 = 160
3   0010        5         -> 4 bit x   5 =   20
4   0011        5         -> 4 bit x   5 =   20    +
-----------------------                      ----------- 
                                                         400 bit

#skema encoding II
 -----------------------
no   bit    frekuensi
-----------------------
1         1       50        -> 1 bit x 50 =   50
2       01       40        -> 2 bit x 40 =   80
3     000        5         -> 3 bit x   5 =   15
4   0011        5         -> 4 bit x   5 =   20    +
-----------------------                      ----------- 
                                                         165 bit

artinya dengan menggunakan skema encoding II kita dapat menghemat penyimpanan lebih baik. namun  masalahnya bagai mana kita dapat memetakan masing2 bit dengan representasi yang sesuai???
jawabannya akan dijelaskan menggunakan metode "Huffman"
misalkan kita memiliki beberapa macam warna (A, B, C, D, E, F, G, H) dengan frekuensi masing masing
 -----------------------
warna    frekuensi(%)
-----------------------
     A             0.50 
     B             0.05
     C             0.05   
     D             0.03   
     E             0.02
     F             0.01
     G             0.13
     H             0.12
-----------------------
                     1.0

lalu buat dendogram, hubungkan warna2 yang memiliki frekuensi dari kecil -> besar
A(0.05)---------------------------------------------------|---1.00
H(0.12)--|--0.22-------------------------------|--0.50---|
F(0.10)---|                                                  |
G(0.13)--------------------------------|--0.28-|
B(0.05)-----------------------|--0.15--|
C(0.05)-------------|---0.1---|
D(0.03) ---|-0.05--|
E(0.02)  ---|

lalu buat kesepakatan bahwa kalau kebawah 1 dan keatas 0, telusuri dari nila1 1
A(0.05)--------------------------(0)----------------------|--
H(0.12)-(0)-|-----------------------(0)---------|--(1)----|
F(0.10)--(1)-|                                                  |
G(0.13)-----------------(0)-------------|--(1)--|
B(0.05)-------------(0)-------|--(1)----|
C(0.05)------(0)----|---(1)---|
D(0.03) -(0)-|-(1)--|
E(0.02)  -(1)-|

 ----------------------------------------------------
warna    frekuensi(%)  code-lama code-baru
-----------------------------------------------------
     A             0.50              000          0
     B             0.05              001         1110
     C             0.05              010         11110 
     D             0.03              011         111110
     E             0.02              100          111111
     F             0.01              101          101
     G             0.13             110          110
     H             0.12             111          100
------------------------------------------------------

jika kita hitung:
1 pixel (code-lama) membutuhkan memori 3 satuan, sedangkan
1 pixel (code-baru) membutuhkan memori 2.24 satuan (hiting sendiri ya)

No comments:

Post a Comment