使用 JPEG 压缩但没有质量下降 (MATLAB)

Compressing using JPEG but no quality degradation (MATLAB)

美好的一天,

我试图证明将图像压缩很多次 (极多,如500次),会出现质量下降。从 据我了解,当图像保存多次时会发生这种情况 在 JPEG 中。我尝试编写 MATLAB 代码来执行此操作:

    clc;close all;clear;

for i = 1:500
    if i==1
        a = imread('e:\ismoka_small.jpg');
        currFileName = 'e:\multipleJpegs[=10=]1.jpg';
    else
        a = imread(currFileName);
        if i <= 10
            zeross = '00';
        elseif i <= 100
            zeross = '0';
        elseif i <= 1000
            zeross = '';
        end
        currFileName = ['e:\multipleJpegs\' zeross num2str(i-1) '.jpg'];
    end

    imwrite(a, currFileName, 'jpeg');
end

然而,最终结果显示没有发生退化,并且所有 500 张图像的文件大小都相同。我想知道是否有人可以帮助我并解释为什么会这样? 还是我对 JPEG 算法有误?提前致谢:)

您只是按原样读取和保存文件。你没有以任何方式重新处理它。我不知道你如何在 matlab 中做到这一点,但你必须打开它,转换为图像,然后将该图像另存为 JPEG。这就是退化将发生的地方。是的,您会看到质量下降,因为 JPEG 是一种有损压缩算法。但是,质量损失不能用文件大小来衡量。

您会看到尖锐边缘的退化程度最大:例如,白色背景上黑色图形的边框。当您选择较高的压缩率或较低的质量设置时,降级会更大。

注意:多亏了 denver 的评论,让我们清楚地知道也有无损 JPEG 格式:JPEG-LS 和 JPEG2000,但它们确实很不寻常。如果你使用这种无损格式之一,无论你压缩和解压缩多少次和图像,它都会保持原来的样子

不确定。质量应该默认为 75,这会造成一点点退化。您可以尝试以下测试。

1) 保存不同画质的原图,看看能不能分辨出来。

imwrite(a, "75.jpg", 'jpeg', 'Mode', 'lossy', 'Quality', 75);
imwrite(a, "50.jpg", 'jpeg', 'Mode', 'lossy', 'Quality', 50);

2) 在循环中将质量设置调低,看看它是否会使效果更明显。

3) 您可以通过加载上一次迭代的图像并进行减法来确认每次迭代的质量都在下降。如果结果为零,则表示您没有更改图像。

JPEG压缩造成的损失是由于量化,本质上是舍入或截断。如果您始终使用相同的质量设置进行保存,则量化过程很可能每次都会产生相同的结果,尤其是如果您多次这样做 - 像素会退化,直到它们达到它们在往返过程中幸存下来的程度,然后他们就不会再改变了。

如果您在重新保存之前对图像进行任何更改,这些更改将导致进行更改的 8x8 或 16x16 区域质量下降。

如果您每次都以不同的质量设置保存,每次都会获得不同的量化,图像肯定会降级,即使有时您使用更高的设置也是如此。

这里我用自己的图片重复了测试,使用Python的PIL打开和保存图片100次。我还打开并保存了一次,看看是否有任何额外的退化 - 没有区别。我已将 JPEG 重新保存为 PNG,以防止 Whosebug 的图像引擎造成任何进一步的损失。

尽管第一次和第 100 次保存之间存在可测量的差异,但与原始保存和第一次保存之间的差异相比,它们是微不足道的。

原文:

第一次保存:

第 100 次保存: