【问题标题】:save high resolution figures with parfor in matlab在matlab中使用parfor保存高分辨率数字
【发布时间】:2014-09-08 07:34:21
【问题描述】:

我正在使用parfor 循环来生成和保存相当多的数字。由于图中将显示的数据量很大,因此数字的分辨率需要很高,大约 920 dpi。使用普通的for,该功能可以正常工作。但是当我们切换到parfor时,生成和保存的图片的分辨率就变得很低了。

这是图形句柄创建部分:

mainFig=figure('visible','off');
set(mainFig, 'Renderer', 'OpenGL');

这里是保存部分代码:

print(mainFig,'-djpeg','-r920',strcat(MyDir,measure,sec_suffix,'.jpeg'))

有什么想法吗?

谢谢

【问题讨论】:

  • 不要使用strcat 作为路径和文件名!请改用fullfile
  • 愚蠢的问题:您只使用一个驱动器来保存图像,不是吗?如果您每次可以/应该只写一张图片,您对parfor 的期望速度是多少?当然可以,但是使用 parfor 应该比使用普通循环更慢。
  • 好的,谢谢。好主意 :)。但问题依然存在
  • 您可能想尝试切换默认打印设置。 mathworks.nl/help/matlab/creating_plots/…
  • 如果您在服务器上工作,可能不仅有 64 个内核,而且在 raid 中还有多个硬盘驱动器。因此,您可能可以访问多个写入头。这意味着您实际上可以并行编写多个图像,parfor 使之成为可能。因此,为了获得最大性能,我假设您需要找出可以并行编写的文件数量,这应该是您在 Matlab 中使用的并行工作人员的数量。

标签: matlab graphics printing figure parfor


【解决方案1】:

这是printing 中的documented limitation 在无头模式下:

不带显示器的打印和导出

在 UNIX 平台(包括 Macintosh)上,您可以从 MATLABnodisplay模式(matlab -nodisplay),可以使用打印 您可以将大多数驱动程序与显示器一起使用并导出到大多数 相同的文件格式。所有 PostScript 和 Ghostscript 设备 在 UNIX 平台上以 nodisplay 模式运行。图形设备 -djpeg-dpng-dtiff(压缩 TIFF 位图)和 -tiff (带有 TIFF 预览的 EPS)也可以,但 nodisplay 下他们使用 Ghostscript 生成输出,而不是使用内置的驱动程序 MATLAB。但是,Ghostscript 在生成时会忽略 -r 选项 -djpeg-dpng-dtiff-tiff 图像文件。这意味着 运行时不能改变图像文件的分辨率 nodisplay 模式.

-noFigureWindows 启动选项也是如此 压制所有平台上的数字。在 Windows 平台上 -dwin, -dwinc-dsetup 选项在以下情况下照常运行 -noFigureWindows。但是,printpreview GUI 不起作用 在这种模式下。自然,Windows 只输出-dwin-dwinc 格式不能在 UNIX 或 Mac 平台上使用,无论是否有 显示。

分辨率注意事项

使用-rnumber 指定生成输出的分辨率。在 一般来说,使用更高的值会产生更高质量的输出,但在 较大输出文件的成本。影响分辨率和输出 所有 MATLAB 内置栅格格式的大小(在 Graphics Format Files 中表格的第四列)。

注意: 内置图形格式直接从 MATLAB 生成,无需通过 Ghostscript 库进行转换。此外,在无头 (nodisplay) 模式,写入某些图像格式不是由 内置驱动程序,就像使用显示器时一样。这些格式 是-djpeg-dtiff-dpng。此外,-dhdf-dbmp 格式不能在无头模式下生成(但你可以 用-dbmp16m 替换-dbmp)。请参阅“打印和导出 不使用显示器时打印的详细信息。

与内置的 MATLAB 格式不同,图形输出通过 Ghostscript 不直接服从-r 选项设置。然而 由 MATLAB 生成的中间 PostScript 文件作为 Ghostscript 处理器受-r 设置的影响,因此可以 间接影响最终生成的 Ghostscript 的质量 输出。

-r 选项对输出质量的影响可能很微妙 使用 OpenGL 或 ZBuffer 渲染器和 写入 MATLAB 内置光栅格式之一,或者当 生成包含嵌入式光栅图像的矢量输出(对于 例如,PostScript 或 PDF)。指定更高的效果 以更高的分辨率查看输出时,分辨率更明显 放大或打印时,因为较大的-r 设置提供 缩放图像时要使用的更多数据。

当生成完全矢量化的输出时(如使用 Painters 时) 渲染器以输出矢量格式,例如 PostScript 或 PDF), 分辨率设置影响输出的细节程度;环境 更高的分辨率产生更清晰的输出(但在 分辨率可能没有明显的影响)。例如,间隙宽度 不使用实线 ('-') 线条样式的线条可能会受到影响。


parfor 生成无头 MATLAB 实例(Windows 和 Unix),因此根据上述情况,工作进程将回退到忽略 -r 选项的 Ghostscript 打印驱动程序。

当您将图形导出为光栅图形格式(PNG、JPEG、TIFF 等)时,有两种情况:

  • 如果您在正常会话中打印,MATLAB 将使用其内置驱动程序直接生成图形文件,并且应遵循您指定的分辨率

  • 另一方面,如果您在无头模式下打印,MATLAB 将在内部以 Postscript 矢量格式导出图形,然后使用 Ghostscript 使用以下 Ghostscript 选项将其转换为请求的光栅格式:

    -dNOPAUSE -q 
    -I"C:\Program Files\MATLAB\R2014a\sys\extern\win64\ghostscript\ps_files"
    -I"C:\Program Files\MATLAB\R2014a\sys\extern\win64\ghostscript\fonts"
    -sDEVICE=jpeg
    -g576x432
    -sOutputFile="file.jpeg"
    

    如您所见,由于某种原因,MATLAB 在将 PS 文件转换为其他格式时,在无头模式下使用固定的目标大小 576x432。


这是一些用于快速实验的代码。我已经在本地并行池上对其进行了测试;所有光栅格式(PNG、JPEG、TIFF、PPM)的固定大小为 576x432(如前所述,-r 选项被忽略)。 PDF 也是通过将 PS 文件转换为 PDF 生成的(使用-sDEVICE=pdfwrite Ghostscript 输出设备)。

fmt = {'ppm', 'tiff', 'png', 'jpeg', 'epsc2', 'pdf'};
outfolder = 'C:\Users\Amro\Desktop\print_test';

parpool(4)
parfor i=1:4
    fig = figure(i);

    % a random plot
    ax = axes('Parent',fig);
    plot(ax, cumsum(rand(1000,1)-0.5))

    % save in each specified format (-r option is mostly ignored)
    for f=1:numel(fmt)
        print(fig, ['-d' fmt{f}], '-r920', ...
            fullfile(outfolder,sprintf('plot%d.%s',i,fmt{f})));
        drawnow
    end

    % also save FIG-file
    hgsave(fig, sprintf('plot%d.fig',i))

    close(fig);
end
delete(gcp)

在我看来,您应该导出为 EPS 文件,然后手动将其转换为您需要的任何格式。这样您就可以在调用的 Ghostscript 命令中指定目标图像大小(我不会为print -r 分辨率选项而烦恼,因为它对矢量格式几乎没有影响)

另一种方法是在parfor 中导出FIG 文件。然后,您可以在带有显示器的普通 MATLAB 会话中加载它们,并以所需的分辨率和格式连续打印:

for i=1:4
    fig = hgload('plotXX.fig');
    movegui(fig, 'center')
    print(fig, '-djpeg', '-r920', 'outXX.jpeg')
    close(fig)
end

【讨论】:

  • 谢谢你这么好的解释,所以,似乎没有办法:\
  • 或者你的意思不是 -djpeg、-dpng、-dtiff 和 -tiff 可能有效?
  • (未经测试)您可以尝试在parfor 循环中将图形另存为FIG-files,然后串行将图形和print 加载为JPEG 文件一个普通的 MATLAB 会话
  • 顺便说一句,你能简单解释一下为什么 .fig 不关心分辨率吗?因为它不包含渲染过程?
  • @Mojtaba:您也可以使用EPS 或PDF 之类的矢量格式吗? print(..., '-depsc2','file.eps')
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多