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