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

📄 im2jpeg.m

📁 包含完整的程序代码
💻 M
字号:
function y = im2jpeg(x, quality) 
error(nargchk(1, 2, nargin));             % 检查输入参数
if ndims(x) ~= 2 | ~isreal(x) | ~isnumeric(x) | ~isa(x, 'uint8')
   error('The input must be a UINT8 image.');  
end
if nargin ==2 && quality <= 0
   error('Input parameter QUALITY must be greater than zero.');
end
if nargin < 2    
   quality = 1;   
end       

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 100 103 99] * quality;

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];

[xm, xn] = size(x);                % 输入大小
x = double(x) - 128;              
t = dctmtx(8);                     % 计算8 x 8 DCT 矩阵

% 计算 DCT的 8x8 块和相关系数
y = blkproc(x, [8 8], 'P1 * x * P2', t, t');
y = blkproc(y, [8 8], 'round(x ./ P1)', m);

y = im2col(y, [8 8], 'distinct');  % 把8x8变成列 
xb = size(y, 2);                   % 计算块的数目
y = y(order, :);                   % 排序

eob = max(y(:)) + 1;               
r = zeros(numel(y) + size(y, 2), 1);
count = 0;
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) = [];          
   
y           = struct;
y.size      = uint16([xm xn]);
y.numblocks = uint16(xb);
y.quality   = uint16(quality * 100);
y.huffman   = mat2huff(r);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -