📄 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 + -