jpegencode.m
上传用户:hwtw888
上传日期:2016-03-15
资源大小:177k
文件大小:2k
源码类别:

压缩解压

开发平台:

Matlab

  1. function y = jpegencode(x, quality)
  2. %jpegencode函数用来压缩图像,x为输入图像
  3. %quality决定了截去的系数和压缩比
  4. error(nargchk(1, 2, nargin));   %检查输入参数
  5. if nargin < 2
  6.     quality = 1;   %默认时 quality为1
  7. end
  8. x = double(x) - 128;   %像素层次移动-128
  9. [xm, xn] = size(x);    %得到像素尺寸
  10. t = dctmtx(8);         %得到8*8DCT矩阵
  11. %将图像分割成8*8子图像,进行DCT,然后进行量化
  12. y = blkproc(x, [8,8], 'P1*x*P2', t, t');
  13. m = [16 11 10 16 24 40 51 61     %JPEG量化步长矩阵
  14.      12 12 14 19 26 58 60 55
  15.      14 13 16 24 40 57 69 56
  16.      14 17 22 29 51 87 80 62
  17.      18 22 37 56 68 109 103 77
  18.      24 35 55 64 81 104 113 92
  19.      49 64 78 87 103 121 120 101
  20.      72 92 95 98 112 110 103 99]*quality;
  21.  %用量化步长矩阵m对变换矩阵进行量化
  22.  yy = blkproc(y, [8, 8], 'round(x./P1)', m);
  23.  y = im2col(yy, [8, 8], 'distinct');   %将图像块排列成向量
  24.  xb = size(y, 2);                      %得到列数,也就是子图像个数
  25.  order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ...        %变换系数排列次序
  26.        41 34 27 20 13 6 7 14 21 28 35 42 49 57 50 ...
  27.        43 36 29 22 15 8 16 23 30 37 44 51 58 59 52 ...
  28.        45 38 31 24 32 39 46 53 60 61 54 47 40 48 55 62 63 56 64];
  29.  %用Z形扫描方式对变换系数重新排列
  30.  y = y(order, :);
  31.  eob = max(x(:)) + 1;            %创建一个块结束符号
  32.  num = numel(y) + size(y, 2);
  33.  r = zeros(num, 1);
  34.  count = 0;
  35.  %将非零元素重新排列放入r中,-26-3  eob  -25  1   eob
  36.  for j = 1: xb                   %每次对一列(即一块)进行操作
  37.      i = max(find(y(:, j)));     %找最后一个非零元素
  38.      if isempty(i)               %没有非零元素
  39.          i = 0;
  40.      end
  41.      p = count + 1;
  42.      q = p + i;
  43.      r(p: q) = [y(1: i, j); eob];   %截去零并加上结束符号
  44.      count = count + i + 1;
  45.  end
  46.  r((count + 1): end) = [];          %删除r的没有用的部分
  47.  r = r + 128;
  48.  %保存编码信息
  49.  y.size = uint16([xm, xn]);
  50.  y.numblocks = uint16(xb);
  51.  y.quality = uint16(quality*100);
  52.  %对r进行Huffman编码
  53.  [y.huffman, y.info] = huffencode(uint8(r));
  54.  
  55.