在matlab中使用parfor保存高分辨率数字

时间:2014-07-17 12:19:04

标签: matlab graphics printing figure parfor

我正在使用parfor循环来生成并保存大量的数字。由于将在图中呈现的数据量,数字的分辨率需要高,大约920dpi。使用普通for,该函数正常工作。但是当我们切换到parfor时,生成和保存的图片的分辨率变得非常低。

这是图形句柄创建部分:

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

这是保存部分代码:

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

任何想法?

由于

1 个答案:

答案 0 :(得分:5)

这是无头模式documented limitation printing

  

无显示打印和导出

     

在UNIX平台(包括Macintosh)上,您可以从中开始   MATLAB nodisplay模式(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内置栅格格式的大小(在中标识)   图形格式文件中表格的第四列。

     

注意:内置图形格式直接从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"
    

    如您所见,由于某些原因,在将PS文件转换为其他格式时,MATLAB在无头模式下使用固定目标大小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