【发布时间】:2011-09-30 15:34:24
【问题描述】:
我在 Matlab 中使用 eps 格式导出图像,但它会使图像变得平滑。 Matlab 不会使用 png 等其他格式对图像进行模糊处理。我想知道如何以 eps 格式导出非模糊图像。这是使用 png 生成的图像:
这是使用 eps 生成的图像:
【问题讨论】:
标签: matlab matlab-figure
我在 Matlab 中使用 eps 格式导出图像,但它会使图像变得平滑。 Matlab 不会使用 png 等其他格式对图像进行模糊处理。我想知道如何以 eps 格式导出非模糊图像。这是使用 png 生成的图像:
这是使用 eps 生成的图像:
【问题讨论】:
标签: matlab matlab-figure
问题在 Mac 上可重现,问题出在 eps 渲染器而不是 MATLAB。例如,保存 imagesc(rand(20)) 并使用 Preview 和 GSview 查看会导致以下结果:
显然,信息并没有丢失。它只是没有被一些 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')
也许这是您的 EPS 查看器的问题...
【讨论】:
explicitly set it to use GS/GSview 换成LaTeX 吗?我尝试谷歌搜索,但没有找到这样做的方法。谢谢!
Distiller 中找到了Ghostscript 选项。这是正确的地方吗?如果是对的地方,那就很奇怪了,因为我已经勾选了Ghostscript 并取消了Apple Distiller,但是.eps仍然是模糊的。
不确定它为什么会起作用,但您可以尝试执行以下操作:
eps2eps oldfile newfile
对我有用(在 mac os 上)
【讨论】:
起初我以为你做错了什么,但后来我想起这是一个问题,大约一年前困扰我。我想不出一种方法来“修复”这种行为,根据我的研究,这很可能是一个错误,其他几个人也遇到了这个问题,并且没有已知的解决方案。当然,我对最后一部分的看法可能是错误的,并且自从我寻找它们以来可能已经出现了一些解决方案。
无论如何,我的解决方法是使用pcolor 和shading flat 而不是imagesc。当您将其导出为 eps 格式时,它会正确保留图像。示例:
pcolor(rand(20));
shading flat
print('-depsc','figure.eps')
注意:您可能看到沿每个小方块的对角线出现的细而微弱的白线(取决于操作系统和查看器)。这些是用于渲染图像的图形基元的边缘。但是,这不是 MATLAB 导出中的缺陷,而是在您的 EPS/PDF 查看器中呈现的错误。例如,在我的 Mac 上使用 Preview 中的默认设置时,这些行会显示出来,而在 Adobe Reader 9.4 中使用默认设置时,它们不会出现。
【讨论】:
epstopdf 转换时不会出现微弱的白线。非常感谢!
如果有人仍然对解决方法感兴趣:使用文本编辑器打开 .eps 文件并搜索“interpolate”。您可能会发现“/Interpolate true def”两到三遍。把“真”换成“假”,开心就好:)
【讨论】:
/Interpolate true 是 PDF 而不是 EPS。
关于 Yoda 回答的说明:在 Mac OS X 中的 Preview 中,您可以通过取消选中“Anti-alias text and screen art”使每个正方形上的细白色对角线消失。当然,缺点是任何文本(例如图形轴等)都没有抗锯齿。不幸的是,如果您使用的是 imagesc,则取消选中它对模糊度没有影响。
另一个注意事项是,如果您使用预览从 eps 制作 pdf,当您在 Acrobat 中打开它时,生成的 pdf 仍会正确显示(不模糊)。
【讨论】:
我也一直在努力解决这个问题。到目前为止,GSView 是我发现的唯一能正确显示 Matlab (R2015b) 生成的 eps 数据的查看器。 eps2eps 对我不起作用(psutils 1.23)。 以下最终对我有用:
【讨论】:
saveas。在 Matlab 2016a 中它非常有问题。命令export_fig 更加健壮mathworks.com/matlabcentral/fileexchange/23629-export-fig
我刚刚为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');
【讨论】:
应用 opengl 渲染器到图
figure(gcf);
set(gcf,'renderer','opengl');
【讨论】:
opengl,它会将其保存为光栅 EPS,而不是真正的矢量图形。
模糊实际上取决于您的查看器应用程序或打印机使用的渲染软件。为了始终获得良好的效果,请将图像中的每个像素设置为 8x8 相同颜色的像素块,即像这样调整图像大小:
im2 = imresize(im1, 8, 'nearest');
然后,模糊只会影响每个块边缘的像素。 8x8 块是最好的,因为它们使用 DCT 压缩(有时在 eps 文件中使用)进行压缩,没有令人讨厌的伪影。
【讨论】:
这个页面对我帮助很大:http://tech.mof-mof.co.jp/blog/machine-learning-octave.html(用日文写的,请用谷歌翻译)
这也很有帮助: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")
在 octave 窗口中,输入“system gnuplot”后,然后
set pm3d interpolate 2, 2
保存文件后,打开octave-cli.app,输入
imagesc(magic(3)), colorbar
我知道了。
【讨论】: