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

标签 image compression jpeg

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

enter image description here

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

enter image description here

enter image description here

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

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

谢谢!

最佳答案

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

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

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

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

关于image - 为什么 JPEG 编码 8x8 方格图像会产生伪影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41369338/

相关文章:

javascript - 根据窗口大小和纵横比缩放图像

c# - 在 C# 中序列化、压缩和加密

使用 LZW 压缩来压缩 ZIP 文件会创建尺寸过大的压缩文件

c# - 7zip 压缩网络流

image - 如何将二进制文件编码为 JPG 格式?

ffmpeg - RTP/MJPEG 流的默认量化表是什么?

python - 将解码后的 jpeg 绘制到开罗表面

python - 在pygame中制作图像 "fit to screen"?

java - 如何向 GridView 单元格添加标题

html - 将图像的不同部分链接到不同的 url