可以提高 Matlab export_fig 中点的分辨率吗?

Posted

技术标签:

【中文标题】可以提高 Matlab export_fig 中点的分辨率吗?【英文标题】:Possible to increase resolution of points in Matlab export_fig? 【发布时间】:2019-12-11 18:34:29 【问题描述】:

假设我有一张背景图片和一些额外的点。我在下面提供了一个示例,为了简单起见,背景图像只是一张纯白色的图像:

testim=ones(1024,1024);

imshow(testim); hold on

for j=1:20
    plot(20+.33,20.27+j*10, '.r','MarkerSize',4);
end
for j=1:20
    plot(300+.33,20.27+j*10, '.r','MarkerSize',4);
end
for j=1:15
    plot(j*20+.33,220.27, '.r','MarkerSize',4);
end
for j=1:15
    plot(j*20+.33,20.27, '.r','MarkerSize',4);
end

当我放大 Matlab 图时,它看起来像:

然后我缩小到原来的图形大小,然后用export_fig保存:

export_fig exportFig-q100-painters-testim.png -q100 -painters
export_fig exportFig-q102-painters-testim.png -q102 -painters

当我打开这些 png 文件并放大时,图像看起来像:

这不是我想要的,因为我希望原始图中的每个点在放大的 png 文件中都变成一个像素大小,但是对于每个中心像素,应该有大约 6 个红色晕染像素模糊。有什么办法可以消除 export_fig 中的这种模糊?

编辑:

当我使用print(gcf,'foo.png','-dpng','-r300')将图形保存为图像时,即使将dpi调整为1、100、300、900等值,点仍然非常模糊

编辑2:

在尝试下面的绘图时,更容易看出export_fig out.png -q100 -painters -a1 没有帮助:

testim=rand(1024,1024);

imshow(testim); hold on

for j=1:100
    plot(20+.33,20.27+j*2, '.r','MarkerSize',4);
end
for j=1:100
    plot(300+.33,20.27+j*2, '.r','MarkerSize',4);
end
for j=1:60
    plot(j*5+.33,220.27, '.r','MarkerSize',4);
end
for j=1:60
    plot(j*5+.33,20.27, '.r','MarkerSize',4);
end

EDIT3

当我使用saveas 在背景图像为 1024x1024 的情况下使用以下代码另存为 pdf 时:

testim=rand(1024,1024);
f2=figure(2); imshow(testim); hold on
plot(217.47, 227.3, '.r','MarkerSize',1);
plot(218.74, 226.8, '.r','MarkerSize',1);
plot(219.2, 227.1, '.r','MarkerSize',1);
plot(219.1, 228.5, '.r','MarkerSize',1);
saveas(f2, 'saveas-pdf-testim-1024-marker1.pdf');

结果是:

但是当背景图片为 4096x4096 时看起来很糟糕:

testim=rand(4096,4096);
f2=figure(2); imshow(testim); hold on
plot(217.47, 227.3, '.r','MarkerSize',1);
plot(218.74, 226.8, '.r','MarkerSize',1);
plot(219.2, 227.1, '.r','MarkerSize',1);
plot(219.1, 228.5, '.r','MarkerSize',1);
saveas(f2, 'saveas-pdf-testim-4096-marker1.pdf');

【问题讨论】:

不,这并没有带来任何改善 请注意,-q100 选项仅适用于 JPEG、PDF 和 EPS 输出(PDF 和 EPS 将对位图数据使用 JPEG 编码)。 PNG 文件不使用此选项。 【参考方案1】:

您在输出中看到的是抗锯齿。它使线条在位图中看起来更漂亮。

应用了两个级别的抗锯齿:

    如今,MATLAB 本身具有抗锯齿功能。您可以使用

    关闭此功能
    set(gcf,'GraphicsSmoothing','off')
    

    export_fig 有一个选项可以控制位图文件格式的抗锯齿:

    -a1, -a2, -a3, -a4 - option indicating the amount of anti-aliasing to
                     use for bitmap outputs. '-a1' means no anti-aliasing;
                     '-a4' is the maximum amount (default).
    

    默认为-a4,即最大抗锯齿量。它使图形以 4 倍的分辨率渲染,然后缩放生成的图像。将-a1 添加到export_fig 命令会禁用抗锯齿。

    export_fig out.png -a1
    

两者的结合让你的身材更加清晰。但是,虚线的渲染在 IMO 中看起来仍然很差。尝试添加-m4 或类似的值,以将导出的位图的分辨率提高一个与屏幕渲染相比的整数倍。

【讨论】:

当我尝试并保存为 jpeg 时,我没有看到太大的改进 保存为 PNG 时我也没有看到太大的改进 我在 EDIT2 中提供了示例代码,以查看 export_fig-a1 没有显示出改进 @SecretAgentMan:它在export_fig 中已经存在很多很多年了,也许是从第一个版本开始。不应再使用它,因为抗锯齿是 HG2 的一部分。现在 IMO 的默认值是错误的。 github.com/altmany/export_fig/issues/292 @user5739619:我在回答“有什么办法可以消除 export_fig 中的这种模糊吗?”。第三次编辑导出为矢量图,而不是位图。它还显示点标记,而不是虚线,这是完全不同的。 MATLAB 的虚线一直很烂。看来您正在寻找与您所询问的不同的东西。如果您想要在图像的大像素上添加小圆点,那么您需要询问如何做到这一点。

以上是关于可以提高 Matlab export_fig 中点的分辨率吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Matlab warp 的表面图输出传递给 export_fig?

所见即所得的 Matlab export_fig

matlab提取矩阵中点的坐标

Matlab,用奇怪的输出保存.EMF图片

如何提高MATLAB的运算速度

如何提高MATLAB的运算速度