Kompresi citra dengan metode DCT-Kuantisasi-Huffman

Citra merupakan informasi multimedia dengan jumlah data yang sangat besar di mana kualitasnya sering dikaitkan dengan resolusi citra. Resolusi citra berarti ukuran panjang dan lebar dari sebuah citra dalam satuan pikel. Kedalaman intensitas warna berarti banyaknya bit yang digunakan untuk tiap kode warna yang dinyatakan dalam satuan bit/piksel. Semakin tinggi resolusi citra, semakin banyak jumlah piksel dan kedalaman intensitas warna sehingga mengakibatkan semakin baik kualitas citranya. Tingginya resolusi citra dan kedalaman intensitas warna berarti jumlah bit yang ada semakin banyak sehingga mentransmisikan citra dengan resolusi yang tinggi membutuhkan penyimpanan data citra untuk jumlah bit yang ditransmisikan. Oleh karena itu, untuk meminimalkan jumlah bit yang ditransmisikan, digunakan suatu algoritma kompresi citra.

Kompresi citra dapat dilakukan dalam domain spasial maupun domain frekuensi. Pada kompresi citra dalam domain spasial, redundansi data yang relatif tinggi dalam citra dikodekan dengan menggunakan bit yang lebih kecil. Redundansi berarti banyaknya piksel dari citra memiliki kesamaan secara visual atau kesamaan nilai. Sementara pada kompresi citra dalam domain frekuensi, perlu dilakukan proses transformasi dari domain spasial ke domain frekuensi. Merode transformasi yang digunakan pada penelitian ini yaitu Discrete Cosine Transform (DCT) yang digunakan dalam kompresi JPEG 2000.

Kompresi citra terbagi menjadi dua teknik, yaitu lossy dan loseless. Teknik kompresi citra loseless bekerja dengan membuat kapasitas file dari citra sekecil mungkin yaitu dengan mengoptimalkan teknik pengkodean data redundan yang terdapat pada citra asli. Dalam hal tersebut, kompresi loseless terjadi tanpa ada perubahan data. Salah satu metode yang menerapkan teknik kompresi loseless yaitu metode Huffman. Teknik kompresi citra lossy bekerja dengan mengurangi jumlah bit pada informasi detil citra seperti luminance dan chrominance (warna). Salah satu metode yang menerapkan teknik kompresi lossy yaitu DCT.

Discrete Cosine Transform (DCT)

Metode Discrete Cosine Transform (DCT) mengubah data citra masukan ke dalam format yang dapat mengurangi redundansi piksel. Untuk memetakan nilai piksel ke dalam satu set koefisien, teknik perubahan pengkodean menggunakan reversibel dan linier matematika transformasi. Proses selanjutnya dibutuhkan proses kuantisasi dan pengkodean. Transformasi 2D-DCT dinyatakan dalam persamaan berikut:

Kuantisasi

Pada tahap kuantisasi, koefisien DCT yang tidak penting dihilangkan guna merekontruksi citra yang baru. Proses kuantisasi menggunakan teknik lossy dengan menyeleksi frekuensi yang tinggi untuk dihilangkan.

Pengkodean Huffman

Prinsip pengkodean Huffman yaitu mengkodekan koefisien hasil proses DCT dengan mengeliminasi nilai-nilai matriks bernilai nol sehingga kelebihan dari keluaran kuantisasi hilang secara zigzag sehingga dihasilkan citra yang sudah terkompresi atau dilakukan kompresi citra.

Program matlab kompresi DCT  – Quantization – Huffman

clear all
close all
clc

I=imread('football.jpg');

qy50 = [16 11 10 16 24 40 51 61;
    12 12 14 19 26 58 60 55;
    14 13 16 24 40 57 69 56;
    14 17 22 29 51 87 80 62;
    18 22 37 56 68 109 103 77;
    24 35 55 64 81 104 113 92;
    49 64 78 87 103 121 120 101;
    72 92 95 98 112 100 103 99];

qc50 = [ 17 18 24 47 99 99 99 99;
    18 21 26 66  99 99 99 99;
    24 26 56 99 99 99 99 99;
    47 66 99 99 99 99 99 99;
    99 99 99 99 99 99 99 99;
    99 99 99 99 99 99 99 99;
    99 99 99 99 99 99 99 99;
    99 99 99 99 99 99 99 99;];

zz =[1 2 6 7 15 16 28 29;
    3 5 8 14 17 27 30 43;
    4 9 13 18 26 31 42 44;
    10 12 19 25 32 41 45 54;
    11 20 24 33 40 46 53 55;
    21 23 34 39 47 52 56 61;
    22 35 38 48 51 57 60 62;
    36 37 49 50 58 59 63 64;];


% Konversi Warna Image RGB ke YCbCr
Iycbcr=rgb2ycbcr(I);
[MI,NI,~]=size(Iycbcr);
mb=mod(MI,8);
nb=mod(NI,8);
if nb>0
    Iycbcr(:,NI+1:NI+(8-nb),:)=0;
end
if mb>0
    Iycbcr(MI+1:MI+(8-mb),:,:)=0;
end
[m,n,o] = size(Iycbcr);

% Blok Citra
Imycbcr=Iycbcr;

ImDouble = double(Imycbcr);

% DCT
ImDCT = dct(ImDouble);

% Kuantisasi
yDCT = ImDCT(:,:,1);
cbDCT = ImDCT(:,:,2);
crDCT = ImDCT(:,:,3);

y_kuantisasiBlock  = @(block_struct) round(block_struct.data ./ qy50) ;
c_kuantisasiBlock  = @(block_struct) round(block_struct.data ./ qc50) ;
y_kuantisasi =  blockproc(yDCT ,[8 8] , y_kuantisasiBlock) ;
cb_kuantisasi =  blockproc(cbDCT ,[8 8] , c_kuantisasiBlock) ;
cr_kuantisasi =  blockproc(crDCT ,[8 8] , c_kuantisasiBlock) ;

% Zig-Zag encoding
y_ZigZag = zeros(m*n,1);
cb_ZigZag = zeros(m*n,1);
cr_ZigZag = zeros(m*n,1);
idx = 0;
for i=1:8:m
    for j=1:8:n
        y_ZigZag(zz+idx) = y_kuantisasi(i:i+7, j:j+7);
        cb_ZigZag(zz+idx) = cb_kuantisasi(i:i+7, j:j+7);
        cr_ZigZag(zz+idx) = cr_kuantisasi(i:i+7, j:j+7);
        idx = idx + (8*8);
    end
end

zigZagCoding = [y_ZigZag; cb_ZigZag; cr_ZigZag];

% Huffman encoding
minDinput=min(zigZagCoding);
if minDinput<=0
    faktor=minDinput*-1+1;
else
    faktor=0;
end
zigZagCoding=zigZagCoding+faktor;
Hist=zeros(1,max(zigZagCoding));
L=length(zigZagCoding);
DinputNum=zeros(1,L);

for i=1:L
    DinputNum(i)=zigZagCoding(i);
    Hist(DinputNum(i))=Hist(DinputNum(i))+1;
end
PHist=Hist/L;
[PHist, symbols]=sort(PHist,'descend');
eobi=max(find(PHist~=0));
PHist=PHist(1:eobi);
symbols=symbols(1:eobi);

% Proses Coding
dict=huffmandict(symbols,PHist);
ImHuffmanEncoder=huffmanenco(zigZagCoding,dict);

imKirim = ImHuffmanEncoder;

%% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

imTerima = imKirim;

%Huffman decoding
ImHuffmanDecoder=huffmandeco(imTerima,dict) - faktor;

ImDecoder = reshape(ImHuffmanDecoder, m, n, o);

y = ImDecoder(:,:,1);
cb = ImDecoder(:,:,2);
cr = ImDecoder(:,:,3);

% Zig-Zag decoding
y_DeZigZag = zeros(m,n);
cb_DeZigZag = zeros(m,n);
cr_DeZigZag = zeros(m,n);
idx = 0;
for i=1:8:m
    for j=1:8:n
        y_DeZigZag(i:i+7, j:j+7) = y(zz+idx);
        cb_DeZigZag(i:i+7, j:j+7) = cb(zz+idx);
        cr_DeZigZag(i:i+7, j:j+7) = cr(zz+idx);
        idx = idx + (8*8);
    end
end


% De Kuantisasi
y_DekuantisasiBlock  = @(block_struct) round(block_struct.data .* qy50) ;
c_DekuantisasiBlock  = @(block_struct) round(block_struct.data .* qc50) ;
y_Dekuantisasi =  blockproc(y_DeZigZag ,[8 8] , y_DekuantisasiBlock) ;
cb_Dekuantisasi =  blockproc(cb_DeZigZag ,[8 8] , c_DekuantisasiBlock) ;
cr_Dekuantisasi =  blockproc(cr_DeZigZag ,[8 8] , c_DekuantisasiBlock) ;

ImDeKuantisasi = cat(3, y_Dekuantisasi, cb_Dekuantisasi, cr_Dekuantisasi);

% De DCT
ImDeDCT = idct(ImDeKuantisasi);
ImDeDouble = uint8(ImDeDCT);
IDeycbcr = ycbcr2rgb(ImDeDouble);

figure('name',['SNR=',num2str(1)]);
subplot(1,2,1);
imshow(I);
title('citra yang dikirim')

subplot(1,2,2);
imshow(IDeycbcr);
title('citra yang diterima')

hasil kompres-dekompres dengan metode DCT Kuantisasi Zigzag Huffman :

 

Leave a Reply

Your email address will not be published. Required fields are marked *