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: |
|