?? jpegencode.m
字號:
function y = jpegencode(x, quality)
%jpegencode函數(shù)用來壓縮圖像,x為輸入圖像
%quality決定了截去的系數(shù)和壓縮比
error(nargchk(1, 2, nargin)); %檢查輸入?yún)?shù)
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); %得到列數(shù),也就是子圖像個數(shù)
order = [1 9 2 3 10 17 25 18 11 4 5 12 19 26 33 ... %變換系數(shù)排列次序
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形掃描方式對變換系數(shù)重新排列
y = y(order, :);
eob = max(x(:)) + 1; %創(chuàng)建一個塊結(jié)束符號
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]; %截去零并加上結(jié)束符號
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));
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -