首先,感谢export_fig的作者Yair Altman为相关方面做了很多介绍,本文主要结合新版本matlab,对作者的内容进行搬运和翻译。
export_fig下载地址和介绍如下:
github地址:https://github.com/altmany/export_fig
mathworks地址:https://ww2.mathworks.cn/matlabcentral/fileexchange/23629-export_fig
或者 http://www.mathworks.com/matlabcentral/fileexchange/23629
技术性说明可以参见:
http://undocumentedmatlab.com/blog/export_fig
使用时,直接将export_fig的文件夹所在位置,添加到当前路径即可。
export_fig库不仅有丰富的图片导出功能,还支持许多不同格式的图片导出,比如png, bmp, pdf, eps。
下图是利用matlab自带的函数saveas(gcf,‘test.png’)与export_fig的对比图。matlab版本为R2017a
左边是屏幕截图,中间是saveas输出的图像,右边是export_fig输出图像,可以看到export_fig图像较好的还原了原图的线条粗细和背景颜色,更加接近截图效果。
代码如下:
plot(cos(linspace(0, 7, 1000)));
set(gcf, 'Position', [100 100 150 150]);
saveas(gcf, 'test.png');
export_fig test2.png
下图是matlab在密集点阵上的对比表现,左图为屏幕截图,中间为saveas输出,右图为export_fig输出。可以看到在颜色上,右图export_fig输出更接近截图效果;而saveas输出颜色失真,不能看出点的效果。
代码:
[X,Y,Z] = peaks(300);
xx=X(1:end);yy=Y(1:end);cc=Z(1:end);
scatter(xx,yy,1,cc,'filled')
colormap(jet)
set(gcf, 'Position', [100 100 500 500]);
saveas(gcf, 'test.png');
export_fig test2.png
利用export_fig函数可以自由控制输出图像的分辨率,格式为
export_fig test.png -m2
后面-m加数字代表缩放比例。缩放效果如下:
上图展示了缩放为1倍、2倍、3倍的函数图像,下面的数字代表每个点输出图片的像素值(由于图像修改上传后尺寸有些偏差)。可以看到,即使放大之后的曲线依然没有锯齿,可以认为该输出放大接近矢量图的效果。
plot(cos(linspace(0, 7, 1000)));
set(gcf, 'Position', [100 100 150 150]);
export_fig test1.png
export_fig test2.png -m2
export_fig test3.png -m3
此外对于导入的图片,export_fig函数还支持原分辨率显示,效果如下:
左图为截图,右图为按照图片像素,原分辨率输出。
代码如下:
imshow(imread('cameraman.tif'))
hold on
plot(0:255, sin(linspace(0, 10, 256))*127+128);
set(gcf, 'Position', [100 100 150 150]);
export_fig test.png -native
matlab导出图像中很难设置半透明,即使是png格式。但是export_fig函数很好的解决了这一问题。如下图所示
左图为saveas函数输出的半透明logo图标,右图为export_fig函数输出的半透明图标。可以看到saveas函数只是在figure内部将图片半透明,但是导出后透明区域用白色框代替。export_fig函数输出的图片则是真正透明的,背景的图片可以透过去。
这时export_fig函数的引用方式为:
export_fig test.png -transparent
代码如下:
logo;
alpha(0.5);
set(gca, 'Color', 'none'); % Sets axes background
saveas(gcf, 'test.png');
export_fig test2.png -transparent
格式为
fh = figure('color','w');
......
im = export_fig('-nocrop',fh);
这里就可以将figure中的图像直接以数据的形式保存在im3维矩阵中。不需要matlab之前先保存再读取的操作。
此函数将图形或单个轴保存为一个或多个矢量和/或位图文件格式,和/或将光栅化版本输出到工作区,具有以下属性:
该函数特别适合于输出或者展示,因为它输出图片的高质量和可移植性。
请注意,输出文件中会再现背景颜色和图形尺寸(后者近似,并忽略裁剪和放大)。 对于透明背景(和半透明贴片对象),请使用-transparent选项或将“Color”属性设置为“none”。 要使轴透明,请将轴的“颜色”属性设置为“无”。 PDF,EPS,TIF和PNG是支持透明背景的唯一格式; 只有TIF和PNG格式支持补丁对象的透明度。
渲染器(opengl,zbuffer或painters)的选择对输出质量有很大影响。 默认值(位图的opengl,矢量格式的painters)通常会产生良好的结果,但如果您不满意,请尝试另一个渲染器。 注意:1)对于矢量格式(EPS,PDF),只有painters生成矢量图形。 2)对于位图,只有opengl才能正确渲染透明的补丁对象。 3)对于位图,只有painters在放大或消除锯齿时才能正确缩放线条划线和点长度。 4)使用painters时,字体可以用Courier替代。
使用painters渲染器导出为矢量格式(PDF和EPS)和位图格式时,此功能要求在系统上安装ghostscript。 您可以从以下网址下载:http://www.ghostscript.com。当导出到eps时,它还需要来自Xpdf函数套件的pdftops。 您可以从以下网址下载:http://xpdfreader.com
SVG输出使用fig2svg(https://github.com/kupiqu/fig2svg) 或 plot2svg(https://github.com/jschwizer99/plot2svg) 实用程序,或者如果这些实用程序都不可用,则使用Matlab的内置SVG导出 Matlab的路径。 注意:export_fig的SVG输出不支持裁剪/填充。
输入项:
输出项:
这个函数在一定程度上弥补了matlab自带图像输出函数的不足。
但是随着matlab版本的更新,原先图形中很多bug都有所修复,比如之前版本matlab图像的曲线像素风严重,输出图片颜色失真严重(比如官网中给出的下图示例),虚线和散点图在输出时异常等问题。
而且现在电脑上的截图软件也很多,截图比较方便,在除了批量化处理图像的场合这种仿截图的输出效果不是太实用。导出图像的MxNxC的uint8图像数组这个功能,也可以用输出临时文件再读取图片的方式实现,或者利用print函数实现。
cdata = print('-RGBImage');