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

时间:2015-04-28 08:55:09

标签: matlab image-processing jpeg image-compression

美好的一天,

我试图表明压缩图像很多次 (非常多,如500次),将显示质量下降。来自 据我所知,当图像被保存很多次时会发生这种情况 在JPEG中。我尝试编写MATLAB代码来执行此操作:

    clc;close all;clear;

for i = 1:500
    if i==1
        a = imread('e:\ismoka_small.jpg');
        currFileName = 'e:\multipleJpegs\001.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算法有误吗?在此先感谢:)

3 个答案:

答案 0 :(得分:4)

JPEG压缩造成的损失是由量化引起的,量化基本上是舍入或截断。如果你总是以相同的质量设置进行保存,那么量化过程很可能每次产生相同的结果,特别是如果你多次这样做 - 像素会降低,直到它们达到它们在往返中存活的程度,那么他们就不会再改变了。

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

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

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

虽然第一次和第100次保存之间存在可测量的差异,但与原始保存和第一次保存之间的差异相比,它们无关紧要。

原件:
Original

首先保存:
First save

第100次保存:
100th save

答案 1 :(得分:2)

您只是按原样阅读并保存文件。你不是以任何方式再处理它。我不知道你是如何在matlab中那样做的,但你必须打开它,转换为图像,然后将该图像保存为JPEG。这就是恶化会发生的。是的,你会看到降级,因为JPEG是一种有损压缩算法。但是,质量损失无法通过文件大小来衡量。

你会看到锋利边缘的油脂质量下降:例如白色背景上黑色图案的边框。选择较高的压缩率或较低的质量设置时,降级会更大。

注意:感谢丹佛的评论,让我们清楚地知道还有无损JPEG格式:JPEG-LS和JPEG2000,但它们真的很不寻常。如果你使用这种无损格式之一,无论你压缩和解压缩和成像多少次,它都将保持原来的状态

答案 2 :(得分:0)

不确定。质量应默认为75,导致稍微降低。您可以尝试以下测试。

1)保存不同质量的原始图像,看看能否分辨出来。

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

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

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