我与插值萍水相逢续(3): 三线性插值(Trilinear Interpolation)原理及使用

来源:互联网 发布:淘宝网图书专营店 编辑:程序博客网 时间:2024/05/10 07:48

    三线性插值就是针对三维离散数据进行插值而言的。所以我们到这里可以发现,前几篇博文的“线性插值”、“双线性插值”和本博文的“三”线性插值“是针对数据的维度而言的,而不是插值方法而言的。到这里的插值方法都是基于线性插值的,即连接已知数据点之间的线是线性的,也就是次数是一次。对于线性插值这种方法的,还有二次多项式插值和三次多项式插值等,是属于多项式插值的。那么常见的”双三次插值“是什么意思?就是数据的维度是2,插值方法是三次插值(三次插值有三次多项式插值和三次样条插值等,没有明确说明咱也不知道是哪个)。至于样条插值、最近邻插值、一些高阶的插值方法等我不准备给大家一一介绍了,大家需要就去看相关资料。好了我们来看三线性插值。(网上我看基本都叫三线性插值,我感觉叫三维线性插值会更好理解)

1. 关于三线性插值

    https://zh.wikipedia.org/wiki/%E4%B8%89%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC维基百科介绍了三线性插值的原理,我就直接贴图出来看。

    首先有一个关于多项式插值的小知识,就是计算一个插值点数值需要的周围已知数据点个数的问题。需要的数据个数=(多项式次数+1)^数据的维度。比如线性插值需要(1+1)^1=2个,双线性插值需要(1+1)^2=4个,三线性插值需要(1+1)^3=8个,二次插值需要(1+2)^1=3个,双二次插值需要(1+2)^2=9个,三二次插值需要27个,三次插值需要4个,双三次插值需要16个,三三次插值需要64个。可见数据的维度越高,多项式的次数越高,用于计算的数据个数越多,计算越复杂。

    好了,贴图:


    看完以后,前面没什么问题,从沿着z轴插值开始,至少我是看不懂这公式的。我去查了一下伪代码,我们回忆一下线性插值和双线性插值的过程,我再来把这个过程用画图画出来,

    这个三线性插值的原理就是这样了。看过前面的博文的话根本很简单有木有。

2. 三线性插值案例

    案例1:假设有个实验室做了一个立方体5*5*2的玻璃缸,里面放了一些气体,要监测里面的某种气体的浓度分布。我们现在假设已知的数据点有八个(1,1,1),(5,1,1),(1,5,1),(5,5,1),(1,1,5),(5,1,5),(1,5,5),(5,5,5),也就是立方体中八个顶点的浓度值,分别是[5,4,5,2,1,1,2,1]。那么我要求其中(2,2,2)处的浓度值是多少。

    和前面的博客一样,一个是用matlab内部的interp3()插值函数实现,另一个就是自己写,自己写和前面的思路是一样的,也可以调用自己前面写过的函数,这里我就不写了,如确实有需要或者遇到困难了就给我博客留言,我再来把它写出来了更新一下博客。这里就给出如何用interp3()做三线性插值。

    运行代码如下:

-----------------------------------------------------------------------------

% 注意:网络矢量要严格单调增加
% x = [1 5 1 5 1 5 1 5];y = [1 1 5 5 1 1 5 5];z = [1 1 1 1 5 5 5 5];
x = [1 5]; y = [1 5]; z = [1 5];
[X,Y,Z] = meshgrid(x,y,z);    % 生成用于三维运算的索引号
V = zeros(2,2,2);    % 使得每个点的值对应上坐标号
V(:,:,1) = [5 4; 5 2];
V(:,:,2) = [1 1; 2 1];
xi = 2;
yi = 2;
zi = 2;
VI = interp3(x,y,z,V,xi,yi,zi,'linear')

------------------------------------------------------------------------------

    运行结果是3.7656。

    案例2:这里自然就是三维矩阵的放大缩小了。matlab的内部函数我找了一圈,没找着,大家找到了分享一下啊。那么只有自己写了,原理和前面的是一样的,大家看了前面的应该是可以自己写出来的,如有需要可以留言我会回过来专门写一下。不过三维矩阵的缩放一般用到的还是比较少的,即使是真彩图像的缩放第三个维度也是不用缩放的。

    另外,有一个n维数据的插值,那么必然是有n线性插值的。matlab是提供这样的函数的,interpn()。怎么实现的?从线性插值到双线性插值再到三线性插值,其实是有规律的,matlab的开发人员应用了这里面的规律,开发出来了interpn()。不过呢,这要是十几维,函数后面的参数都得几十个,很麻烦吧,所以我感觉现在这个时代,一般到三维就差不多了。

    PS: 此博文任何人可以转载。