如何导出非模糊eps图像?

时间:2011-07-07 16:53:20

标签: matlab matlab-figure

我正在使用eps格式在Matlab中导出图像,但它会使图像平滑。 Matlab不会使用其他格式(如png)模糊图像。我想知道如何使用eps格式导出​​非模糊图像。这是使用png生成的图像: enter image description here

这是使用eps生成的图像: enter image description here

10 个答案:

答案 0 :(得分:11)

更新

问题在Mac上是可重现的,问题在于eps渲染器而不是MATLAB。例如,保存imagesc(rand(20))并使用预览和GSview查看结果如下:

预览屏幕截图

enter image description here

GSview截图

enter image description here

显然,信息不会丢失。某些EPS查看器无法正确解释/读取。解决方案很简单:使用GSview查看您的eps图像。您可以从here

下载

特别是在Mac上,如果你的最终应用程序是latex / pdflatex,你必须明确地将它设置为使用GS / GSview,否则,它将默认为Quartz引擎,它被引入操作系统。


以前的答案:

我无法重现您描述的行为。这是我使用的代码,在WinXP 32位上使用R2010b进行测试:

M = fspecial('gaussian',[20 20],5);
imagesc(M)
print('-dpng','a.png')
print('-depsc2','b.eps')

a.png

a.png

b.eps

b.eps

也许这是您的EPS浏览器的问题......

答案 1 :(得分:5)

不确定为什么会有效,但您可以尝试执行以下操作:

eps2eps oldfile newfile

为我做了伎俩(在mac os上)

答案 2 :(得分:4)

起初我以为你做错了什么,但后来我记得这是一个困扰我一年多前的问题。我无法想出一种“修复”这种行为的方法,而且从我研究的内容来看,这很可能是一个错误,其他几个也有这个问题,并且没有已知的解决方案。当然,我对最后一部分可能是错的,可能会有解决方案,因为我找到了它们。

任何方式,我解决此问题的方法是使用pcolor而不是shading flat代替imagesc。将其导出为eps格式时,它会正确保留图像。例如:

pcolor(rand(20));
shading flat
print('-depsc','figure.eps')

enter image description here

注意:可能看到每个小方块的反对角线上出现细而微弱的白线(取决于操作系统和观察者)。这些是用于渲染图像的图形基元的边缘。然而,这是 MATLAB导出中的缺陷,而是EPS / PDF查看器中渲染的错误。例如,使用我的Mac上的预览中的默认设置,这些行显示,而使用Adobe Reader 9.4中的默认设置,它们不会出现。

答案 3 :(得分:2)

如果有人仍然对解决方法感兴趣:使用文本编辑器打开.eps文件并搜索“interpolate”。您可能会发现“/插值真正的def”两到三次。将“true”替换为“false”并快乐:)

答案 4 :(得分:1)

有关Yoda答案的说明:在Mac OS X中的预览中,您可以通过取消选中“消除别名文本和屏幕艺术”来消除每个方块上的细白色对角线。当然,缺点是任何文本(例如数字轴等)都没有消除锯齿。不幸的是,如果您正在使用imagesc,则取消选中对模糊性没有影响。

另一个注意事项是,如果您使用预览从您的eps制作pdf,则在Acrobat中打开时,生成的pdf仍会正确显示(非模糊)。

答案 5 :(得分:1)

我也一直在努力解决这个问题。到目前为止,GSView是我发现的唯一一个能够正确显示Matlab(R2015b)生成的eps数字的浏览器。 eps2eps对我不起作用(psutils 1.23)。 以下最终对我有用:

  1. 按照here
  2. 说明将图形导出为pdf
  3. pdf2ps file.pdf file.eps

答案 6 :(得分:0)

模糊实际上取决于您的查看器应用程序或打印机使用的渲染软件。为了始终获得良好的效果,请将图像中的每个像素设置为相同颜色的8x8像素块,即调整图像大小如下:

im2 = imresize(im1, 8, 'nearest');

模糊然后仅影响每个块边缘的像素。 8x8块是最好的,因为它们使用DCT压缩(有时在eps文件中使用)压缩而没有令人讨厌的伪像。

答案 7 :(得分:0)

opengl 渲染器应用于图

figure(gcf);
set(gcf,'renderer','opengl');

答案 8 :(得分:0)

我刚刚为imagesc写了这个简单的替代品。它不支持除最基本功能之外的所有功能,但我仍然希望它有所帮助。

function h = imagesc4pdf(C)

[ny nx] = size(C);

px = bsxfun(@plus, [-0.5; 0.5; 0.5; -0.5], reshape(1:nx, [1 1 nx]));
py = bsxfun(@plus, [-0.5; -0.5; 0.5; 0.5], 1:ny);

n = numel(C);
px = reshape(repmat(px, [1 ny 1]), 4, n);
py = reshape(repmat(py, [1 1 nx]), 4, n);

h = patch(px, py, reshape(C,1,n), 'linestyle', 'none');

xlim([.5 nx+.5]);
ylim([.5 ny+.5]);
set(gca, 'ydir', 'reverse');

答案 9 :(得分:0)

这页帮助了我很多:http://tech.mof-mof.co.jp/blog/machine-learning-octave.html(用日语写的,请用google翻译)

这也很有用:Octave-Gnuplot-AquaTerm error: set terminal aqua enhanced title "Figure 1"...unknown terminal type"

我也在https://www.coursera.org/learn/machine-learning/discussions/weeks/2/threads/Dh-aRfqSEeaHSQ6l4xnh6g回答。

我重新安装了这样的gnuplot:

$ brew cask install xquartz
$ brew cask install aquaterm
$ brew uninstall gnuplot
$ brew install gnuplot --with-aquaterm --with-x11 --with-qt  # you can show other options by `$ brew options gnuplot`

您可以像这样编辑〜/ .octaverc:

setenv("GNUTERM", "qt")

并在八度窗口中输入“system gnuplot”后,

set pm3d interpolate 2, 2

保存文件后,打开octave-cli.app,然后输入

imagesc(magic(3)), colorbar

我明白了。

enter image description here