📄 jpeg.asv
字号:
%jpeg压缩编码
function [dc_cof,ac_cof] = jpeg(f)
% 灰度变换 -128
f=f-128;
%获取图象大小以及分块数目
[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系数量化
disp('dpcm ...')
DCT_q = round( blkproc(DCT_f,[8 8],'quantization') );
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=dpcm(f_dc,1);
else
f_dpcm=DCT_q(1,1); %只有1块
end
%对DPCM编码后的系数进行HUFFMAN编码
disp('dcencode ...')
dc_cof=[];
for i=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 = [];
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 向量
%每块系数中最后一个不为0的位置作为该块结束
eobi=max(find(tmp~=0));
% 每一块用999作为结束标志
acseq=[acseq tmp(2:eobi) 999];
end
end
%AC系数的HUFFMAN编码
disp('acencode ...')
ac_cof = acencode(acseq);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -