MATLAB中pcolor/surf的双线性插值(shading interp)

8
考虑以下 MATLAB 代码:
C = [ 0 0 0 0 0
      0 1 2 1 0
      0 2 4 2 0
      0 1 2 1 0
      0 0 0 0 0 ];
pcolor( C );
shading interp;
axis square

请注意,C在90度旋转下不变。还要注意来自pcolor帮助文档的以下句子:

使用shading interp,每个单元格通过其四个顶点处颜色的双线性插值进行着色,使用C的所有元素。

然而,绘制的图像如下:

CodeOutput

请注意,图像在90度旋转下不是不变的(例如考虑四个角)。除非我严重误解双线性插值,否则这一点一定是错误的。MATLAB似乎在三角形上进行插值,这与双线性插值不同。
有没有办法解决MATLAB的这个问题,并获得正确的双线性插值?(除了手动插入额外的点,如果放大到足够远仍无法解决问题。)

有趣的是,这会给出与 surf(C); shading('interp'); view(2); 完全相同的着色。 - jodag
是的。它明显形成了一个三角网格。一些MATLAB程序员不理解双线性插值是什么。 - cfp
我理解的对吗:您不仅仅是想将生成的图形用于说明目的(因此您可以自己进行插值并使用合理大小的300dpi png),而是要对其进行进一步分析?如果是这样,我建议您尝试使用latex/tikz。您考虑过这个吗? - Robert Seifert
我需要一张出版质量的图片。因此,我宁愿保存为矢量格式,并确保它可以任意缩放。这实际上并不是针对LaTeX的,尽管MATLAB的EPS/PDF输出比其EMF/SVG输出更麻烦。无论如何,无论图形以何种方式导出(即使使用matlab2tikz),它都将保留不正确的插值。 - cfp
1个回答

1
我记得过去在官方Matlab论坛上看到了几个关于这种奇怪行为的帖子。不幸的是,我现在快速搜索时找不到任何一个。无论如何...你不是第一个指出shading interppcolor结合使用时表现出奇怪行为的人,会创建不反映基础数据的形状。
主要问题在于shading interp在插值数据点时并不关心网格平滑的敏感性。如果您想要一个看起来不锯齿的结果,就必须提供以更高分辨率采样的数据:
C = [
    0 0 0 0 0
    0 1 2 1 0
    0 2 4 2 0
    0 1 2 1 0
    0 0 0 0 0
];
C = interp2(C,5,'cubic');

pcolor(C);
shading interp;
axis square;

这将产生惊人的结果,并且输出不会显示任何伪影或不对称性:

Output


除了手动插入额外的点之外,如果放大到足够远,这仍然无法解决问题。 - jodag
这是我独立想出的解决方案。但它远非理想。首先,将其保存为SVG/EMF会产生非常糟糕的结果,生成巨大的文件,并且有许多伪像(例如白线)。 - cfp
运行以下代码并查看生成的两个文件。对我来说,EMF 文件在中间有一条垂直的白线(如果使用 interp2(C,5),则会有许多这样的线)。SVG 显示清晰的三角形。 C = [ 0 0 0 0 0; 0 1 2 1 0; 0 2 4 2 0; 0 1 2 1 0; 0 0 0 0 0 ]; C = interp2(C,3); pcolor(C); shading interp; axis square; colormap( parula( 2 ^ 16 ) ); drawnow; saveas( gcf, 'out.emf' ); saveas( gcf, 'out.svg' ); - cfp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接