⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpeg.m

📁 用离散余弦变换实现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 + -