8x8 4x4 子采样矩阵上的量化矩阵。 JPEG

问题描述 投票:0回答:2

我的 jpeg 算法有问题。

我们从 8x8 像素的块开始。将亮度 Y 与色度 Cb 和 Cr 分开

然后,我们通过对每个 2x2 块进行平均来对 Cb 和 Cr 进行子采样。

因此,Y 是 8x8 像素,Cb 和 Cr 是 4x4 像素。

然后我们应用 DCT

并量化。

这就是我不明白的地方。无论是 Y 还是 Cb、Cr 的量化表都是 8x8 矩阵。 Cb和Cr都是4x4,如何用8x8矩阵来量化

Y_quant = [[0 for i in range(8)] for j in range(8)]
Cb_quant = [[0 for i in range(4)] for j in range(4)]
Cr_quant = [[0 for i in range(4)] for j in range(4)]


quantization_matrix_luminance = [[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]]

quantization_matrix_crominance = [[17,18,24,47,99,99,99,99],
                                [18,21,26,66,99,99,99,99],
                                [24,26,56,99,99,99,99,99],
                                [47,66,99,99,99,99,99,99],
                                [99,99,99,99,99,99,99,99],
                                [99,99,99,99,99,99,99,99],
                                [99,99,99,99,99,99,99,99],
                                [99,99,99,99,99,99,99,99]]


for i in range(8):
    for j in range(8):
        Y_quant[i][j] = round(Y_dct[i][j] / quantization_matrix_luminance[i][j])
for i in range(4):
    for j in range(4):
        Cb_quant[i][j] = round(Cb_dct[i][j] / quantization_matrix_crominance[i][j])
        Cr_quant[i][j] = round(Cr_dct[i][j] / quantization_matrix_crominance[i][j])
python algorithm compression jpeg
2个回答
0
投票

在 JPEG 中,量化过程分别应用于亮度 (Y) 和色度(Cb 和 Cr)的 8x8 块的 DCT 系数。量化表确实是 8x8 矩阵,但它们分别应用于 Y 的 8x8 块以及 Cb 和 Cr 的 4x4 块的 DCT 系数。

原因是 Y 的 8x8 块的 DCT 系数比 Cb 和 Cr 的 4x4 块的 DCT 系数具有更高的空间频率,Cb 和 Cr 是通过平均每个 2x2 块进行子采样的。因此,Y 的量化表中的值比 Cb 和 Cr 的量化表中的值多,后者的值较少,因为它们代表较低的空间频率。

换句话说,量化表的设计考虑了不同颜色分量的不同细节级别。亮度分量比色度分量包含更多细节,因此需要更大的量化表来在压缩过程中保留该细节。


0
投票

4x4 块永远不会在传统 JPEG 编码中进行处理。一切都针对 8x8 DCT 系数块进行了优化,并且图像被零填充为 8(或 16)的倍数。

您的问题假设 JPEG 2x2 色度子采样(默认)。可以以这种方式编码的最小块是 16x16(如果需要则用零填充)。 JPEG 可能根本没有子采样或各种其他选择。一些商业应用程序也会出现这种颜色子采样错误。

到 JPEG 系数的前向变换定义明确,相当于从图像中的 16x16 块开始,对 Cr 和 Cb 的 2x2 块进行平均。

输入始终转换为 8x8 块,以便在 2x2 色度子采样 JPEG 中,每个 Cr 和 Cb 8x8 块有 4 个 8x8 Y 亮度块。每次都会完整使用量化表。编码器始终通过 DCT 将 8x8 图像块编码为 JPEG 系数,使用该表对其进行量化,然后将生成的小数 Huffman 编码存储在输出文件中。解码反转该过程,但在 DCT 空间中存在一些量化误差。

虽然完全指定了正向变换为 JPEG,但如何解码生成的较低分辨率 Cr 和 Cb 数据并将其与亮度 Y 再次组合以生成全彩色图像的定义有些不太明确。剪切到有效范围然后重新着色是标准做法,但有点近似。

正常的快速方式会在一定程度上破坏亮度通道,并使每个 2x2 子块上的 R&B 数据变得模糊。这意味着对彩色图像进行 JPEG 编码和解码周期会导致比严格必要的损失更多的损失。渗色和饱和度损失会慢慢累积。平滑灰色背景上的单个饱和 R 和 B 像素受到的影响相当严重。

一些示例图像对红色和蓝色条纹进行二次采样

John Miano 的“压缩图像文件格式”对该主题进行了不错的介绍,并且足够详细地涵盖了所有各个步骤以使其清晰可见。

© www.soinside.com 2019 - 2024. All rights reserved.