首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何推广JPEG压缩中的量化矩阵?

如何推广JPEG压缩中的量化矩阵?
EN

Stack Overflow用户
提问于 2015-03-23 16:54:22
回答 1查看 12.7K关注 0票数 9

我正在研究JPEG图像压缩,我研究了量化矩阵的使用,这通常是在文献中给出的,但我想编写程序,这样当我改变矩阵时,每个像素所代表的比特数也应该变化,这样我就可以绘制每个像素的比特数相对于PSNR。

我看到的基本量化矩阵定义如下:

代码语言:javascript
复制
qm = [16 11 10 16 24 40 51 61; 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]; 

如何概括生成量化矩阵?

EN

回答 1

Stack Overflow用户

发布于 2015-03-23 17:29:43

据我所见,没有计算量化矩阵的“一般”方法。量化矩阵是以这样一种方式创建的,经过多次实验,这些数字是最好的,提供一个良好的信噪比和提供良好的感知质量利用一个缩小的文件大小。取决于你和谁交谈,或者你使用的是什么产品,有些人使用自己的量化矩阵。例如,Adobe在Photoshop等产品中使用自己的量化矩阵,而生成算法是一个商业秘密--我们不知道它们是如何导出量化矩阵的。

然而,目前有一个标准已经存在了一段时间.可能是自从JPEG被提出以后..。据我所知,这有一个计算量化矩阵的算法。这取决于所谓的Q因子或质量因素。这个标准来自于独立JPEG组或IJG。

基本算法如下。您首先提供一个质量因子Q,从1到100。1是“最贫穷”的质量,而100是“最高”的质量。50是默认设置。接下来,您需要定义量化矩阵。我们称之为Tb的基本IJG量化矩阵如下:

代码语言:javascript
复制
Tb =

    16    11    10    16    24    40    51    61
    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

您可能已经注意到,这是与您在问题中定义的相同的矩阵。这是因为你引用的矩阵来自IJG。有了这个矩阵之后,可以通过以下步骤找到输出的量化矩阵:

  1. 定义S,使如果是(Q < 50),则是S = 5000/Q,否则是S = 200 – 2*Q
  2. 在行i和列j的每个位置的输出量化矩阵j是这样的Ts[i,j] = floor((S * Tb[i,j] + 50) / 100)

注意输出是四舍五入的,矩阵中的所有系数都是整数。另外,如果您指定了Q = 50的质量因子,您应该得到相同的基量化矩阵(即不变),并且是默认的矩阵。

因此,一个非常简单的MATLAB程序可以这样做:

代码语言:javascript
复制
Q = 80; %// Define Q factor

%// Define base quantization matrix
Tb = [16 11 10 16 24 40 51 61; 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];

%// Determine S
if (Q < 50)
    S = 5000/Q;
else
    S = 200 - 2*Q;
end

Ts = floor((S*Tb + 50) / 100);
Ts(Ts == 0) = 1; % // Prevent divide by 0 error

代码的最后一行非常重要。您可能会遇到这样一种情况,即指定质量因数将导致0元素。这意味着当你使用量化矩阵时,问题会因为除以零误差而浮出水面。因此,最后的检查将是将这0元素设置为1,这样效果就是忽略了输出结果中的这些位置。

现在,作为一个例子,如果我们设置Q = 80,我们可以得到:

代码语言:javascript
复制
Ts =

     6     4     4     6    10    16    20    24
     5     5     6     8    10    23    24    22
     6     5     6    10    16    23    28    22
     6     7     9    12    20    35    32    25
     7     9    15    22    27    44    41    31
    10    14    22    26    32    42    45    37
    20    26    31    35    41    48    48    40
    29    37    38    39    45    40    41    40

因此,设置相应的质量因数,使用它压缩您的图像,然后您可以检查看看什么是PSNR或信噪比是从压缩的结果。您应该看到,质量越低,PSNR或信噪比应该越低。

关于更多信息,下面是我参考的一组很好的幻灯片,它们更详细地讨论了JPEG量化矩阵/表:

pres.pdf

祝好运!

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29215879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档