MATLAB pcolor / surf双线性插值(阴影插值)

时间:2017-11-18 15:32:55

标签: matlab matlab-figure surface shading bilinear-interpolation

考虑以下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的帮助中的这句话:

  

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

然而,绘制的图像如下:

CodeOutput

注意,图像在90度旋转下不是不变的(例如考虑四个角)。现在,除非我可怕地误解双线性插值,否则这一定是错的。 MATLAB似乎是在三角形上进行插值,这与双线性插值不同。

有没有办法解决这个MATLAB错误,并获得正确的双线性插值? (除了我自己手动插入额外的点,如果放大到足够远,仍然无法解决问题。)

1 个答案:

答案 0 :(得分:0)

我记得在过去的官方Matlab论坛上已经阅读了一些有关这种奇怪行为的主题。不幸的是,我现在没有找到快速搜索。无论如何......你不是第一个用来指出与shading interp结合使用的pcolor,表现得很奇怪,创造出不能反映底层的形状数据

主要问题是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