g_n=0;
g_AC=zeros; g_all_bit=0;
for i_r=1:1:37; for i_c=1:1:50; g_ac_cnt=0;
G_8_8=G(i_r*8-7:i_r*8,i_c*8-7:i_c*8); G_DCT=dct2(G_8_8);
G_dct_s=round(G_DCT./S);
Gdcts_c=reshape(G_dct_s',1,64);
Gdcts_c_z=Gdcts_c(zig);
g_dc_diff=Gdcts_c_z(1)-g_dc; %g_dc=Gdcts_c_z(1);
for i=2:1:64;
if Gdcts_c_z(i)==0&&g_n<15&&i~=64 g_n=g_n+1;
elseif Gdcts_c_z(i)==0&&g_n<15&&i==64 g_ac_cnt=g_ac_cnt+1;
g_AC(1,2*g_ac_cnt-1)=g_n;
g_AC(1,2*g_ac_cnt)=Gdcts_c_z(i); g_n=0;
elseif Gdcts_c_z(i)~=0&&r_n<15 g_ac_cnt=g_ac_cnt+1;
g_AC(1,2*g_ac_cnt-1)=g_n;
g_AC(1,2*g_ac_cnt)=Gdcts_c_z(i); g_n=0;
elseif Gdcts_c_z(i)~=0&&g_n==15 g_ac_cnt=g_ac_cnt+1;
g_AC(1,2*g_ac_cnt-1)=g_n;
g_AC(1,2*g_ac_cnt)=Gdcts_c_z(i); g_n=0;
elseif Gdcts_c_z(i)==0&&g_n==15 g_ac_cnt=g_ac_cnt+1;
g_AC(1,2*g_ac_cnt-1)=g_n;
g_AC(1,2*g_ac_cnt)=Gdcts_c_z(i); g_n=0; end end
g_huff=cell(g_ac_cnt+1,3);
g_code_bit=0; for j=0:1:g_ac_cnt; if j==0
[siz,code]=vli(g_dc_diff); %[siz,code]=vli(r_dc);
g_huff(1,1)=cellstr(dec2bin(0)); g_huff(1,2)=cellstr(dec2bin(siz,4)); g_huff(1,3)=cellstr(dec2bin(code,siz)); g_code_bit=g_code_bit+siz; else
if g_AC(2*j)==0
g_huff(j+1,1)=cellstr(dec2bin(g_AC(2*j-1),4)); g_huff(j+1,2)=cellstr(dec2bin(0)); g_huff(j+1,3)=cellstr(dec2bin(0)); else
g_huff(j+1,1)=cellstr(dec2bin(g_AC(2*j-1),4)); [siz,code]=vli(g_AC(2*j));
g_huff(j+1,2)=cellstr(dec2bin(siz,4)); g_huff(j+1,3)=cellstr(dec2bin(code,siz)); g_code_bit=g_code_bit+siz; end end end
g_all_bit=g_all_bit+g_ac_cnt*8+4+g_code_bit; i_n=1;
for k=1:1:g_ac_cnt+1; if k==1
[i_value]=i_vli(g_huff(1,2),g_huff(1,3)) i_Gdcts_c_z(1,i_n)=g_dc+i_value; %i_Rdcts_c_z(1,i_n)=r_huff(1,3); i_n=i_n+1;
g_dc=Gdcts_c_z(1); else
if bin2dec(g_huff(k,1))==15&&bin2dec(g_huff(k,2))==0 i_Gdcts_c_z(1,i_n:i_n+15)=0; i_n=i_n+16;
elseif bin2dec(g_huff(k,1))==0&&bin2dec(g_huff(k,2))==0 i_Gdcts_c_z(1,i_n)=0; i_n=i_n+1; else
i_Gdcts_c_z(1,i_n:i_n+bin2dec(g_huff(k,1))-1)=0; i_n=i_n+bin2dec(g_huff(k,1));
i_value=i_vli(g_huff(k,2),g_huff(k,3));
i_Gdcts_c_z(1,i_n)=i_value; i_n=i_n+1; end end end
i_Gdcts_c=i_Gdcts_c_z(i_zig); i_Gdct_s(1,1:8)=i_Gdcts_c(1:8); i_Gdct_s(2,1:8)=i_Gdcts_c(9:16); i_Gdct_s(3,1:8)=i_Gdcts_c(17:24); i_Gdct_s(4,1:8)=i_Gdcts_c(25:32); i_Gdct_s(5,1:8)=i_Gdcts_c(33:40); i_Gdct_s(6,1:8)=i_Gdcts_c(41:48); i_Gdct_s(7,1:8)=i_Gdcts_c(49:56); i_Gdct_s(8,1:8)=i_Gdcts_c(57:64);
i_Gdct=round(i_Gdct_s.*S); i_G_8_8=round(idct2(i_Gdct));
i_G(i_r*8-7:i_r*8,i_c*8-7:i_c*8)=i_G_8_8; end end
i_GG=i_G+128;
b_dc=0; b_n=0;
b_AC=zeros; b_all_bit=0;
for i_r=1:1:37; for i_c=1:1:50; b_ac_cnt=0;
B_8_8=B(i_r*8-7:i_r*8,i_c*8-7:i_c*8); B_DCT=dct2(B_8_8);
B_dct_s=round(B_DCT./S);
Bdcts_c=reshape(B_dct_s',1,64);
Bdcts_c_z=Bdcts_c(zig);
b_dc_diff=Bdcts_c_z(1)-b_dc; %b_dc=Bdcts_c_z(1);
for i=2:1:64;
if Bdcts_c_z(i)==0&&b_n<15&&i~=64 b_n=b_n+1;
elseif Bdcts_c_z(i)==0&&b_n<15&&i==64 b_ac_cnt=b_ac_cnt+1;
b_AC(1,2*b_ac_cnt-1)=b_n;
b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i); b_n=0;
elseif Bdcts_c_z(i)~=0&&b_n<15 b_ac_cnt=b_ac_cnt+1;
b_AC(1,2*b_ac_cnt-1)=b_n;
b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i); b_n=0;
elseif Bdcts_c_z(i)~=0&&b_n==15 b_ac_cnt=b_ac_cnt+1;
b_AC(1,2*b_ac_cnt-1)=b_n;
b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i); b_n=0;
elseif Bdcts_c_z(i)==0&&b_n==15 b_ac_cnt=b_ac_cnt+1;
b_AC(1,2*b_ac_cnt-1)=b_n;
b_AC(1,2*b_ac_cnt)=Bdcts_c_z(i); b_n=0; end end
b_huff=cell(b_ac_cnt+1,3); b_code_bit=0; for j=0:1:b_ac_cnt; if j==0
[siz,code]=vli(b_dc_diff); %[siz,code]=vli(r_dc);
b_huff(1,1)=cellstr(dec2bin(0)); b_huff(1,2)=cellstr(dec2bin(siz,4)); b_huff(1,3)=cellstr(dec2bin(code,siz)); b_code_bit=b_code_bit+siz; else
if b_AC(2*j)==0
b_huff(j+1,1)=cellstr(dec2bin(b_AC(2*j-1),4)); b_huff(j+1,2)=cellstr(dec2bin(0)); b_huff(j+1,3)=cellstr(dec2bin(0)); else
b_huff(j+1,1)=cellstr(dec2bin(b_AC(2*j-1),4)); [siz,code]=vli(b_AC(2*j));
b_huff(j+1,2)=cellstr(dec2bin(siz,4));
b_huff(j+1,3)=cellstr(dec2bin(code,siz)); b_code_bit=b_code_bit+siz; end end end
b_all_bit=b_all_bit+b_ac_cnt*8+4+b_code_bit; i_n=1;
for k=1:1:b_ac_cnt+1; if k==1
[i_value]=i_vli(b_huff(1,2),b_huff(1,3)) i_Bdcts_c_z(1,i_n)=b_dc+i_value; %i_Rdcts_c_z(1,i_n)=r_huff(1,3); i_n=i_n+1;
b_dc=Bdcts_c_z(1); else
if bin2dec(b_huff(k,1))==15&&bin2dec(b_huff(k,2))==0 i_Rdcts_c_z(1,i_n:i_n+15)=0; i_n=i_n+16;
elseif bin2dec(b_huff(k,1))==0&&bin2dec(b_huff(k,2))==0 i_Bdcts_c_z(1,i_n)=0; i_n=i_n+1; else
i_Bdcts_c_z(1,i_n:i_n+bin2dec(b_huff(k,1))-1)=0; i_n=i_n+bin2dec(b_huff(k,1));
i_value=i_vli(b_huff(k,2),b_huff(k,3)); i_Bdcts_c_z(1,i_n)=i_value; i_n=i_n+1; end end end
i_Bdcts_c=i_Bdcts_c_z(i_zig); i_Bdct_s(1,1:8)=i_Bdcts_c(1:8); i_Bdct_s(2,1:8)=i_Bdcts_c(9:16); i_Bdct_s(3,1:8)=i_Bdcts_c(17:24); i_Bdct_s(4,1:8)=i_Bdcts_c(25:32); i_Bdct_s(5,1:8)=i_Bdcts_c(33:40); i_Bdct_s(6,1:8)=i_Bdcts_c(41:48); i_Bdct_s(7,1:8)=i_Bdcts_c(49:56); i_Bdct_s(8,1:8)=i_Bdcts_c(57:64);
i_Bdct=round(i_Bdct_s.*S); i_B_8_8=round(idct2(i_Bdct));
i_B(i_r*8-7:i_r*8,i_c*8-7:i_c*8)=i_B_8_8; end end
i_BB=i_B+128;
allbit=r_all_bit+g_all_bit+b_all_bit; rate=allbit/(400*296*24); i_A(:,:,1)=i_RR; i_A(:,:,2)=i_GG; i_A(:,:,3)=i_BB; u_i_A=uint8(i_A);
subplot(121);imshow(A);title('压缩前'); subplot(122);imshow(u_i_A);title('压缩后');