?? jpeg.asv
字號:
%jpeg壓縮編碼
function [dc_cof,ac_cof] = jpeg(f)
% 灰度變換 -128
f=f-128;
%獲取圖象大小以及分塊數(shù)目
[mf,nf]=size(f); mb=mf/8; nb=nf/8;
% size of f, # of blocks of f
% 第一步,進行8*8塊的二維DCT變換
disp('DCT ...')
DCT_f = blkproc(f,[8 8],'dct_2D');
%進行DCT系數(shù)量化
disp('dpcm ...')
DCT_q = round( blkproc(DCT_f,[8 8],'quantization') );
disp('dpcm ...')
% 用DPCM進行DC系數(shù)編碼
if mb*nb > 1, %超過1塊
f_dc=reshape(DCT_q(1:8:mf,1:8:nf)',mb*nb,1);
f_dpcm=dpcm(f_dc,1);
else
f_dpcm=DCT_q(1,1); %只有1塊
end
%對DPCM編碼后的系數(shù)進行HUFFMAN編碼
disp('dcencode ...')
dc_cof=[];
for i=1:mb*nb,
dc_cof=[dc_cof dcencode(f_dpcm(i))];
end
disp('ZigZag ...')
% Zig-Zag順序的AC系數(shù)獲取
z=[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];
ac_cof = [];
acseq = [];
for i=1:mb
for j=1:nb
tmp(z)=DCT_q(8*(i-1)+1:8*i,8*(j-1)+1:8*j);
% tmp 是1*64 向量
%每塊系數(shù)中最后一個不為0的位置作為該塊結(jié)束
eobi=max(find(tmp~=0));
% 每一塊用999作為結(jié)束標志
acseq=[acseq tmp(2:eobi) 999];
end
end
%AC系數(shù)的HUFFMAN編碼
disp('acencode ...')
ac_cof = acencode(acseq);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -