最近的 MATLAB 和 Octave 具有更强的 JPEG 压缩并显示伪像

Recent MATLAB and Octave have stronger JPEG compression and show artifacts

我想知道为什么最近的 MATLAB 和 Octave 版本中的 jpeg 压缩如此强烈以至于导致明显的压缩伪影:

  1. Octave 3 jpeg 图像,大小为 41 KB,无伪影:

  2. MATLAB 9 jpeg 图像,大小为 26 KB,有瑕疵:

  3. Octave 5 jpeg 图像,大小为 23 KB,有瑕疵:

这里是绘图代码:

description = strcat('version-', num2str(version));% find out MATLAB/Octave version

x=1:2; % simple var

figure; % plot
plot(x, x);
title(description);

print(strcat("test_jpeg_size_", description ,'.jpg'), '-djpeg'); % write file

您是否知道可以让 MATLAB 和 Octave 进行较弱的 jpeg 压缩。我在 https://de.mathworks.com/help/matlab/ref/print.html.

上找不到类似的内容

我知道我可以绘制 png 文件并使用 imagemagick 将其转换为具有给定质量的 jpeg,但这将是使用其他工具的解决方法。或者我可以首先使用 png 文件,但真实图像对 png 没有压缩优势(就像这里的简单图像一样),我将不得不更改很多其他东西。

你可以去

f = getframe(gcf);
imwrite(f.cdata, 'Fig1.jpg')

其中 imwrite 采用以下选项

  • Compression(压缩方案)
  • Quality(JPEG 压缩文件的质量从 0 到 100)

参见 imwritedoc

这个曾经被记录*,我很惊讶没有在文档页面中找到它。我使用最新版本的 MATLAB (R2019b) 对其进行了测试,它仍然有效:

-djpeg 选项可以采用 0 到 100 之间的质量值,包括 0 和 100。设备选项变为 -djpeg100-djpeg80,或您要使用的任何值。

print(strcat("test_jpeg_size_", description ,'.jpg'), '-djpeg100');

* 或者至少我 记得 它被记录了...在线文档可以追溯到 R13 (MATLAB 6.5),但在那里面没有描述文档版本和当前版本之间的一些随机版本。


但是,我强烈建议您使用 PNG 来绘制线条图。 JPEG 不适用于线条图,并且会把它们弄得一团糟(即使是在最高质量设置下)。 PNG 将以更小的文件大小产生更好的质量。

这里我用-djpeg100-dpng打印了一张图,然后剪下两个文件的一小部分并排显示。 JPEG,即使是 100 质量,也会使线条混乱:

请注意,尽管没有任何数据丢失,但 PNG 文件比 JPEG100 文件小约 10 倍。