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