为什么 JPEG 编码 8x8 方格图像会产生伪像?

Why does JPEG encoding an 8x8 checkered image produce artifacts?

我有以下 64x64 图像,它由随机着色的 8x8 方块组成。

现在,我通过 PHP 的 imagejpg() 函数推送这张图片,默认情况下质量为 75%,我收到了这个结果,带有可见的伪像:

据我了解 JPEG,DCT 应用于单个 8x8 正方形,它们都是纯色。色度二次采样也有足够的分辨率来提供准确的颜色,所以这也不应该有影响。

我怎么会在 8x8 方块内看到人工制品?是否有可能使用 16x16 DCT? 8x8 的方块是在随机位置选择的,而不是从角落里选择的吗?是否有其他一些可能的原因会导致我的方块与 8x8 DCT 分区不完全一致?

谢谢!

我相信我已经弄明白了。 DCT 不应用于原始图像上的 8x8 块,而是分别应用于每个 Y-Cb-Cr 颜色通道。 Y通道没有被二次采样,但是Cb和Cr被二次采样了一半(4:2:0)。

这意味着一个实心的 8x8 正方形将只有 4 个水平 Cb 样本和 4 个垂直 Cb 样本。这不是 8x8。因此,当 DCT 划分 Cr 和 Cb 通道时,一个 8x8 部分将采用属于相邻方块的 Cb 和 Cr 样本。

我将每个正方形的大小增加到 16x16,伪影消失了。

我仍然看到小的差一值,但我猜这可能是由于算法或类似算法中的舍入误差造成的。