Site saati: 07 Eyl Sal, 2010 00:46

  En Popüler Makaleler - En Çok Oy Alan Makaleler - Son Makaleler

Yazar: Seyhan Agaoglu Tarih: 04 Arl Cum, 2009 18:29 Gösterim 1297
Açıklama: Median Cut, Huffman, Görüntü Sıkıştırma, RGB
Kategori: Haberleşme Ana Bilim Dalı Tip: Uygulama
Yazara ait makale sayısı: 4
Yazar tarafından gönderilen tüm makaleleri bul

Median Cut ve Huffman Uygulayarak Görüntü Sıkıştırma

İçerik
1 - Giriş
2 - Median Cut
3 - Uniform Kuantalama
4 - Huffman Kodlama
5 - Sıkıştırma Algoritmasının Gerçeklenmesi
6 - Simülasyon Sonuçları (1)
7 - Simülasyon Sonuçları (2)
8 - Ek (Programların kaynak kodları -1)
9 - Ek (Programların kaynak kodları -2)
10 - Kaynakça
Ek (Programların kaynak kodları -1)
Matlab:
function wuff(gisim,yontem,level,isim);
% Goruntu sikirtirma programi (MedianCut, Huffman)
% gisim, sikistirilacak goruntunun ismi, ör: 'lenna.bmp'
% yontem: 1-> median cut, 2-> uniform, renk seviyesini dusurmek istediginiz
% yontemlerden birini seciniz.
% level, goruntuyu ifade edecegimiz renk sayisi, ör:8 ise goruntunuz 8
% farkli renk ile tanimlanir.Giris degeri [2,2,2] matrisi seklinde olmali.
% isim, sikistirilarak yeniden elde ettigimiz goruntunun ismi,
% or: 'lenna.muff'
 
% tic;
I=imread(gisim);
fid = fopen(isim,'w');
bin_boyut=dec2bin(size(I,3),8);
fwrite(fid,bin2dec(bin_boyut(1,1:8)),'uchar');
 
gsatiro=dec2bin(size(I,1),8);
    gsifir=8-mod(size(gsatiro,2),8);
    gsatir(1,1:16)=char('0');
    gsatir(1,(gsifir+1:16))=gsatiro(1,1:size(gsatiro,2));
 
% fwrite(fid,48+gsifir,'uchar');
nbyte=size(gsatir,2)/8;
for i=1:nbyte
    rsatir = bin2dec(gsatir(((i*8)-7):(i*8)));
    fwrite(fid,rsatir,'uchar');
end
 
gsutuno=dec2bin(size(I,2),8);
    gsifir=8-mod(size(gsutuno,2),8);
    gsutun(1,1:16)=char('0');
    gsutun(1,(gsifir+1:16))=gsutuno(1,1:size(gsutuno,2));
 
% fwrite(fid,48+gsifir,'uchar');
nbyte=size(gsutun,2)/8;
for i=1:nbyte
    rsutun = bin2dec(gsutun(((i*8)-7):(i*8)));
    fwrite(fid,rsutun,'uchar');
end
 
for dongu=1:size(I,3)
    % if yontem==1
    %    Y=mediancut(I(:,:,dongu),level);
    %elseif yontem==2
    %    Y = glevel(I(:,:,dongu),level);
    %end
    if yontem==1
        Y=mediancut(I(:,:,dongu),level(dongu));
    elseif yontem==2
        Y = glevel(I(:,:,dongu),level(dongu));
    end
 
    [p_deg p_ola]=olabul(Y);
    [h,l,lo]=huffman(p_ola);
 
    mbits=lo*size(Y,1)*size(Y,2);
    rmbits=round(mbits);
    if abs(mbits-rmbits)<0.01
        mbits=rmbits;
        elseif (mbits-rmbits)>0
            mbits=rmbits+1;
    else
            mbits=rmbits;
    end
 
    if mod(mbits,8)~=0
        gbits=8-mod(mbits,8)+mbits;
    else
        gbits=mbits;
    end
    abits=gbits-mbits;
    gbyte=gbits/8;
 
    kod=char('@');
    for i=1:size(Y,1)
        for j=1:size(Y,2)
            sira=find(Y(i,j)==p_deg);
            bits=l(sira);
            for sindis=(size(h,2)-bits+1):size(h,2)
                kod=[kod h(sira,sindis)];
            end
        end
    end
 
    for i=1:abits
        kod=[kod '0'];
    end
    hkod(1:(size(kod,2)-1))=kod(2:size(kod,2));
 
 
    bin_deg=dec2bin(size(p_deg,2),16);
    fwrite(fid,bin2dec(bin_deg(1,1:8)),'uchar');
    fwrite(fid,bin2dec(bin_deg(1,9:16)),'uchar');
    for i=1:size(p_deg,2)
        wp_deg = bin2dec(dec2bin(p_deg(i),8));
        fwrite(fid,wp_deg,'uchar');
    end
 
    for i=1:size(l,2)
        wl = bin2dec(dec2bin(l(i),8));
        fwrite(fid,wl,'uchar');   
    end
 
    kl=char('l');
    for i=1:size(h,1)
        for j=(size(h,2)-l(i)+1):size(h,2)
            kl=[kl h(i,j)];
        end
    end
    kodl(1:(size(kl,2)-1))=kl(2:size(kl,2));
    for bitsl=1:(8-mod(size(kodl,2),8))
        kodl=[kodl '0'];
    end
    nbyte=size(kodl,2)/8;
    fwrite(fid,bin2dec(dec2bin(bitsl,8)),'uchar');
    % fwrite(fid,bin2dec(dec2bin(nbyte,8)),'uchar');
    bin_nbyte=dec2bin(nbyte,16);
    fwrite(fid,bin2dec(bin_nbyte(1,1:8)),'uchar');
    fwrite(fid,bin2dec(bin_nbyte(1,9:16)),'uchar');
    for i=1:nbyte
        wkodl = bin2dec(kodl(((i*8)-7):(i*8)));
        fwrite(fid,wkodl,'uchar');
    end
 
    babits = bin2dec(dec2bin(abits,8));
    fwrite(fid,babits,'uchar');
 
    bin_gbyte=dec2bin(gbyte,24);
    fwrite(fid,bin2dec(bin_gbyte(1,1:8)),'uchar');
    fwrite(fid,bin2dec(bin_gbyte(1,9:16)),'uchar');
    fwrite(fid,bin2dec(bin_gbyte(1,17:24)),'uchar');
    for i=1:gbyte
        wkod = bin2dec(hkod(((i*8)-7):(i*8)));
        fwrite(fid,wkod,'uchar');   
    end
end
fclose(fid);
 
% time=toc;
% end of function

Matlab:
function ruff(isim);
% Sikistirilmis goruntuyu acan program
% isim, Decompres edilecek goruntunun ismi, ornek: 'yeni.muff'
 
fid = fopen(isim,'r');
hG=fread(fid,'uchar');
rboyut=bin2dec(dec2bin(hG(1,1),8));
 
satir1=dec2bin(hG(2,1),8);
satir2=dec2bin(hG(3,1),8);
satir=bin2dec([satir1 satir2]);
 
sutun1=dec2bin(hG(4,1),8);
sutun2=dec2bin(hG(5,1),8);
sutun=bin2dec([sutun1 sutun2]);
indis=6;
 
for boyut=1:rboyut
 
    sembol1=dec2bin(hG(indis,1),8);
    sembol2=dec2bin(hG(indis+1,1),8);
    sembol=bin2dec([sembol1 sembol2]);
    indis=indis+1;
    for i=1:sembol
        rp_deg(i)=hG(i+indis,1);
    end
 
    indis=indis+sembol;
    for i=1:sembol
        rl(i)=hG(i+indis,1);
    end
 
    indis=indis+sembol+1;
   
    rbitsl=hG(indis,1);
    indis=indis+1;
    kodbyte1=dec2bin(hG(indis,1),8);
    kodbyte2=dec2bin(hG(indis+1,1),8);
    kodbyte=bin2dec([kodbyte1 kodbyte2]);
    indis=indis+1;
 
    rkodl=char('l');
    for i=1:kodbyte
        rrkodl = dec2bin(hG(i+indis,1),8);
        rkodl=[rkodl rrkodl];
    end
    kodlr(1:(size(rkodl,2)-1))=rkodl(2:size(rkodl,2));
 
    rh=32.*ones(sembol,max(rl));
    artis=0;
    for i=1:sembol
        for j=1:rl(i)
            rh(i,j)=kodlr(1,j+artis);
        end
        artis=artis+rl(i);
    end
    ch=char(rh);
 
    indis=indis+kodbyte+1;
    rabit=hG(indis,1);
    indis=indis+1;
 
    rgbyte1=dec2bin(hG(indis,1),8);
    rgbyte2=dec2bin(hG(indis+1,1),8);
    rgbyte3=dec2bin(hG(indis+2,1),8);
    rgbyte=bin2dec([rgbyte1 rgbyte2 rgbyte3]);
 
    indis=indis+3;
 
    rkod=dec2bin(hG(indis,1),8);
    for i=1:rgbyte-1
        gkod=dec2bin(hG(i+indis,1),8);
        rkod=[rkod gkod];
    end
 
   
    maksi=max(rl);
    k=1;
    indisx=1;
    indisy=1;
    while k<((rgbyte*8)-rabit)
        f_old=[1:sembol];
        s=1;
        for i=1:maksi
            f=find(ch(:,s)==rkod(k+i-1));
            bul=intersect(f,f_old);
            if (size(bul,1)==1) && (size(bul,2)==1)
                Ydizi(indisx,indisy,boyut)=rp_deg(bul);
                break;
            end
            f_old=bul;
            s=s+1;
        end
        k=k+i;
        indisy=indisy+1;
        if indisy==sutun+1
            indisx=indisx+1;
            indisy=1;
        end
    end
   
    indis=indis+rgbyte;
end
 
fclose(fid);
figure,imshow(uint8(Ydizi));
 
% end of function

Matlab:
function [h,l,lo]=huffman(p);
% HUFFMAN  Huffman kod kelimesi ureteci
% [h,l]=huffman(p)
% p=[0.4 0.2 0.2 0.1 0.1] gibi olasilik dizisi
% h, bu olasiliklara karsi gelen kod kelimeleri
% l, kod uzunluklari
% lo, ortalama kod uzunlugu
 
if length(find(p<0))~=0,
  error('Bu bir olasilik vektoru degi, negatif degerler iceriyor')
end
if abs(sum(p)-1)>10e-10,
  error('Bu bir olasilik vektoru degil, toplam olasılık 1 degil')
end
n=length(p);
q=p;
m=zeros(n-1,n);
for i=1:n-1
  [q,l]=sort(q);
  m(i,:)=[l(1:n-i+1),zeros(1,i-1)];
  q=[q(1)+q(2),q(3:n),1];
end
for i=1:n-1
  c(i,:)=blanks(n*n);
end
c(n-1,n)='0';
c(n-1,2*n)='1';
for i=2:n-1
  c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))...
  -(n-2):n*(find(m(n-i+1,:)==1)));
  c(n-i,n)='0';
  c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
  c(n-i,2*n)='1';
  for j=1:i-1
    c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,...
    n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));
  end
end
for i=1:n
  h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);
  l(i)=length(find(abs(h(i,:))~=32));
end
lo=sum(p.*l);
% end of function

Matlab:
function [p_deg p_ola]=olabul(Y);
% Y goruntusunde gecen farkli piksel degerlerini ve
% olasilik degerlerini hesaplar
Y=double(Y);
his=zeros(1,256);
for i=1:size(Y,1)
    for j=1:size(Y,2)
        k=Y(i,j);
        his(k+1)=his(k+1)+1;
    end
end
 
y=1;
for c=1:256
   
    if his(c)==0
        continue
    end
    p_deg(y)=c-1;
    p_ola(y)=his(c)/(size(Y,1)*size(Y,2));
    y=y+1;
   
end
 
% end of function
Sayfa: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

 Kullanıcı Yorumları 
Seyhan Agaoglu Tarih: 04 Arl Cum, 2009 18:29    Mesaj konusu [MAKALE] Median Cut ve Huffman Uygulayarak Görüntü Sıkıştırm

Makaleyi Güncelleyen Seyhan Agaoglu
1. sayfa (Toplam 0 sayfa) Sayfa:  
Makale Gezinti Çubuğu 

Bu kategoriye yeni makale gönderemezsiniz
Bu kategorideki makalelerinizi düzenleyemezsiniz
Bu kategorideki makalelerinizi silemezsiniz
Bu makaleye yorum yapamazsınız
Bu kategorideki makaleleri oylayamazsınız
Bu kategorideki makalelerin onaylanması gerekmektedir
Bu kategorideki düzenlenmiş makalelerin onaylanması gerekmektedir