精华内容
下载资源
问答
  • 我正在处理大型 3D 数据并且... 首先,三线性需要单调间隔的输入网格,例如由 meshgrid 生成。 三线性也使用零作为外推值(可以更改为输入参数)。 这是我的第一个 mex 代码,可以改进,例如此代码可以等效于 interp3。
  • 三线性插值

    2014-06-25 10:40:17
    计算机图形学,烟雾模拟,利用三线性插值来解决平流项!
  • 快速三线性插值

    千次阅读 2019-05-21 20:13:01
    这个本来用三线性插值很容易就实现了,但是体素的尺寸很小,长宽高大概20x15x10的大小,图像的尺寸非常大,差不多是4000x3000,等我实现完普通的三线性插值后,发现算法速度实在太慢,单是这...

    转载自https://lianera.github.io/post/2018/fast-trilinear-interpolation/
    快速三线性插值
    最近需要对一个体素进行插值,并且应用到一张大图像上。这个本来用三线性插值很容易就实现了,但是体素的尺寸很小,长宽高大概20x15x10的大小,图像的尺寸非常大,差不多是4000x3000,等我实现完普通的三线性插值后,发现算法速度实在太慢,单是这一项三线性插值耗费的时间就占了总程序的一半多。其实如果能够用GPU,利用OpenGL里面的3d texture是最方便,也最快的,但是图像从内存传送到GPU需要耗费一定时间,并且很多情况下没法用GPU。所以只能推导一下,在体素上事先就进行预计算,然后再用参数应用到大图像上。

    原理
    借用一张常用的三线性插值示意图
    在这里插入图片描述
    三线性插值实际上可以通过7次线性插值实现。首先假定使用左手坐标系,z轴朝上,在x方向上对四条棱边进行四次插值,得到每条边上的四个点的值c00,c01,c10,c11,然后在y方向上对四个点进行插值,得到两条线段以及中间的两个点的值c0,c1,然后在z方向上插值,得到最终的c点的值。

    我们知道,对于线性插值来说,其公式为:
    在这里插入图片描述
    其中包括四次加减运算,三次乘除运算,因此总的来说,进行一次三线性插值,运算总数为28次加减运算,21次乘除运算,并且往体素中寻找位置并且取值还要花费大量的运算,对于大图像来说,总的运算耗费的时间非常大。

    假定立方体原点为(x0,y0,z0),离原点最远的点为(x1,y1,z1),立方体的每个顶点的值在体素中是知道的。值得注意的是,虽然现在计算的坐标位置实际上是插值时的位置,但是实际上插值只与待求点(x,y,z)与(x0,y0,z0)和(x1,y1,z1)的相对位置比有关,不过为了后续插值的方便,建议首先将点映射到目标坐标上,这样在插值的时候就不需要再进行坐标映射。首先对x方向上插值,得到yz平面上四个点的值分别为f1,f2,f3,f4:
    在这里插入图片描述
    在这里插入图片描述
    注意一下,这里面隐含了x1和x0不能相等,如果两者相等,则f1=f(x0,y0,z0)=f(x1,y0,z0)恒成立,所以直接设置成x1=1,x0=0,再用上述公式即可。注意到,这里面的矩阵是不包含未知数的,这是个常数矩阵。这样一来,我们可以事先在体素上计算好矩阵,最后再应用到图像上就好了。当然我们这还只是一次线性插值,现在继续插值。我们令上面式子f1,f2,f3,f4中右侧矩阵分别为M1,M2,M3,M4,因为是常数矩阵,我们将他们用常数a,b替换。同样利用线性插值方法,现在在y轴方向上插值,计算1,2插值的点5,以及3,4插值的点6
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    实现
    预计算参数的实现直接按照上面的常数参数计算即可,因为预计算是在小的体素上面实现的,所以不用太担心速度。

    c++
    /* precompute trilinear coefficients
    * v: f(x0,y0,z0), f(x1,y0,z0), f(x0,y1,z0), f(x1,y1,z0)
    *    f(x0,y0,z1), f(x1,y0,z1), f(x0,y1,z1), f(x1,y1,z1)
    */
    template <typename T>
    array<T,8> PreComp(float x0, float y0, float z0, 
        float x1, float y1, float z1, const array<T,8>& v)
    {
        const float epsilon = 10e-6f;
        if (x1 - x0 < epsilon) { x1 = 1.f; x0 = 0.f; }
        if (y1 - y0 < epsilon) { y1 = 1.f; y0 = 0.f; }
        if (z1 - z0 < epsilon) { z1 = 1.f; z0 = 0.f; }
    
        float deno = (x1 - x0)*(y1 - y0)*(z1 - z0);
        float nume = 1.f / deno;
    
        T a1 = x1 * v[0] - x0 * v[1];
        T a2 = x1 * v[2] - x0 * v[3];
        T a3 = x1 * v[4] - x0 * v[5];
        T a4 = x1 * v[6] - x0 * v[7];
        T b1 = v[1] - v[0];
        T b2 = v[3] - v[2];
        T b3 = v[5] - v[4];
        T b4 = v[7] - v[6];
        
        T c5 = y1 * a1 - y0 * a2;
        T c6 = y1 * a3 - y0 * a4;
        T d5 = a2 - a1;
        T d6 = a4 - a3;
        T e5 = y1 * b1 - y0 * b2;
        T e6 = y1 * b3 - y0 * b4;
        T f5 = b2 - b1;
        T f6 = b4 - b3;
        
        T h1 = z1 * c5 - z0 * c6;
        T h2 = z1 * d5 - z0 * d6;
        T h3 = z1 * e5 - z0 * e6;
        T h4 = z1 * f5 - z0 * f6;
        T h5 = c6 - c5;
        T h6 = d6 - d5;
        T h7 = e6 - e5;
        T h8 = f6 - f5;
    
        array<T, 8> h = {h1*nume, h2*nume, h3*nume, h4*nume, 
            h5*nume, h6*nume, h7*nume, h8*nume};
        return h;
    }
    

    而插值的时候,速度就是比较重要的了,因为大体素与小体素对应的时候,block是共享参数的,并且即使是变量x,y,z也可以预先计算一部分,不用每个cell都计算。具体来说,插值的时候直接应用f7的计算公式即可:

    T val = zf * (yf*(h[7] * xf + h[5]) + h[6] * xf + h[4])
          + yf * (h[3] * xf + h[1]) + h[2] * xf + h[0];
    

    结果
    对一个20x20x20的小体素进行预计算,然后用上述的三线性插值放大5倍,形成一个100x100x100大小的体素。

    原体素
    在这里插入图片描述
    在这里插入图片描述
    完整代码:https://lianera.github.io/post/2018/fast-trilinear-interpolation/main.cpp

    展开全文
  • 三线性插值:原图像中8个像素点灰度值计算得到新图像中1个像素点灰度值。(三:三个维度进行计算) 双三次插值:原图像中16个像素点灰度值计算得到新图像中1个像素点灰度值。详情请查看此文章 双线性插值 已知Q11...

    双线性插值:原图像中4个像素点灰度值计算得到新图像中1个像素点灰度值。(双:两个维度进行计算)

    三线性插值:原图像中8个像素点灰度值计算得到新图像中1个像素点灰度值。(三:三个维度进行计算)

    双三次插值:原图像中16个像素点灰度值计算得到新图像中1个像素点灰度值。详情请查看此文章

    双线性插值

    已知Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2),求点P(x,y)的灰度值。

    • 第一步:x方向单线性插值,求点R1的灰度值f(R1)

                                                                       f\left ( R1 \right )=\frac{x_{2}-x}{x_{2}-x_{1}}f\left ( Q11 \right )+\frac{x-x_{1}}{x_{2}-x_{1}}f\left ( Q21 \right )

    其中,\frac{x_{2}-x}{x_{2}-x_{1}}\frac{x-x_{1}}{x_{2}-x_{1}}可以看作权重。

    • 第二步:x方向单线性插值,求点R2的灰度值f(R2)。与上述步骤同理。
    • 第三步:根据上述两个步骤得到的f(R1)与f(R2),进行y方向单线性插值,求点P的灰度值f(P)

    三线性插值

    与双线性插值同样的思路,只是我们推到3d空间:

    根据点c000与点c100的灰度值计算得到点a的灰度值,根据点c010与点c110的灰度值计算得到点b的灰度值

    根据点c001与点c101的灰度值计算得到点c的灰度值,根据点c011与点c111的灰度值计算得到点d的灰度值

    得到了这四个点,再把它代入回双线性插值既可:

     

    参考文章:https://zhuanlan.zhihu.com/p/77496615

    展开全文
  • 线性插值&双线性插值&三线性插值

    万次阅读 2018-08-02 15:56:28
    三线性插值 根据若干离散的数据数据,得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合。这个过程叫做拟合。內插是曲线必须通过已知点的拟合。 1.线性插值 已知坐标 (x0, y0) 与 (x1...

    线性插值&双线性插值&三线性插值

    根据若干离散的数据数据,得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合。这个过程叫做拟合。內插是曲线必须通过已知点的拟合。

    1.线性插值

    已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值。

    由于 x 值已知,所以可以从公式得到 y 的值

    已知 y 求 x 的过程与以上过程相同,只是 x 与 y 要进行交换。

    例如,

    原来的数值序列:0,10,20,30,40 
    线性插值一次为:0,5,10,15,20,25,30,35,40 
    即认为其变化(增减)是线形的,可以在坐标图上画出一条直线 。

    线性插值经常用于补充表格中的间隔部分。

    两值之间的线性插值基本运算在计算机图形学中的应用非常普遍,以至于在计算机图形学领域的行话中人们将它称为 lerp。所有当今计算机图形处理器的硬件中都集成了线性插值运算,并且经常用来组成更为复杂的运算:例如,可以通过三步线性插值完成一次双线性插值运算。由于这种运算成本较低,所以对于没有足够数量条目的光滑函数来说,它是实现精确快速查找表的一种非常好的方法。

    在一些要求较高的场合,线性插值经常无法满足要求。在这种场合,可以使用多项式插值或者样条插值来代替。

    线性插值可以扩展到有两个变量的函数的双线性插值。双线性插值经常作为一种粗略的抗混叠滤波器使用,三线性插值用于三个变量的函数的插值。线性插值的其它扩展形势可以用于三角形与四面体等其它类型的网格运算。

    2.双线性插值

    在地球物理中,会经常用到双线性插值(Bilinear interpolation)。比如,模拟生成的地表均匀网格上的速度场或者同震位移场。要与GPS观测点上的观测同震位移场进行比较。就必须将均匀网格点的值插值到GPS太站上。这就需要用到双线性插值。

     

    双线性插值

    In mathematics, bilinear interpolation is an extension of linear interpolation for interpolating functions of two variables(e.g, x andy) on a regular grid. The interpolated function should not use the term of x2 or y2, but xy, which is the bilinear form of x and y.

    其核心思想是在两个方向分别进行一次线性插值

    Thekey idea is to perform linear interpolation first in one direction, and then again in the other direction.Although each step is linear in the sampled values and in the position, the interpolation as a whole is not linear but rather quadratic in the sample location (details below).

    红色的数据点与待插值得到的绿色点

    假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。

    首先在 x 方向进行线性插值,得到

     

    然后在 y 方向进行线性插值,得到

    这样就得到所要的结果 f(x, y),

     

    如果选择一个坐标系统使得 f 的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为

    或者用矩阵运算表示为

    与这种插值方法名称不同的是,这种插值方法并不是线性的,它的形式是

    它是两个线性函数的乘积。看到了吧,双线性插值并不是线性。

    Contrary to what the name suggests, the bilinear interpolant is not linear

     

    另外,插值也可以表示为

    对于单位正方形,

     

    在这两种情况下,常数的数目都对应于给定的 f 的数据点数目。

    线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。

    双线性插值的一个显然的三维空间延伸是三线性插值

    3.三线性插值

      三线性插值是在三维离散采样数据的张量积网格上进行线性插值的方法。这个张量积网格可能在每一维度上都有任意不重叠的网格点,但并不是三角化的有限元分析网格。这种方法通过网格上数据点在局部的矩形棱柱上线性地近似计算点 (x,y,z) 的值。 

    • 三线性插值在一次n=1三维D=3(双线性插值的维数:D=2,线性插值:D=1)的参数空间中进行运算,这样需要(1 + n)D = 8个与所需插值点相邻的数据点。
    • 三线性插值等同于三维张量的一阶B样条插值。
    • 三线性插值运算是三个线性插值运算的张量积。

      实例

      在一个步距为1的周期性立方网格上,取xd,yd,zd 为待计算点,距离小于 x,y,z, 的最大整数的差值,即,

      x_d=x-\left\lfloor x\right\rfloor

      y_d=y-\left\lfloor y\right\rfloor

      z_d=z-\left\lfloor z\right\rfloor

      首先沿着z轴插值,得到:

      i_1=v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right],\times(1-z_d)+v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right]\times z_d

      i_2=v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right],\times(1-z_d)+v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right]\times z_d

      j_1=v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right],\times(1-z_d)+v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right]\times z_d

      j_2=v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right],\times(1-z_d)+v\left[\left\lfloor x\right\rfloor,\left\lfloor y\right\rfloor\left\lfloor z\right\rfloor\right]\times z_d

      然后,沿着y轴插值,得到:

      w1 = i1(1 − yd) + i2yd

      w2 = j1(1 − yd) + j2yd

      最后,沿着x轴插值,得到:

      IV = w1(1 − xd) + w2xd
      这样就得到该点的预测值。

      三线性插值的结果与插值计算的顺序没有关系,也就是说,按照另外一种维数顺序进行插值,例如沿着 x、 y、z 顺序插值将会得到同样的结果。这也与张量积的交换律完全一致。

     

     

    参考链接:线性插值法双线性插值三线性插值

    展开全文
  • 三线性插值(Trilinear Interpolation)详解

    千次阅读 2020-12-08 09:45:16
    x0表示在x下方一个方格点,x1表示在x上方的一个方格点,对于y0、y1、z0、z1是同样的意思。...三线性插值的结果与沿三个轴的插值步骤的顺序无关:任何其他顺序,例如沿x,然后沿y,最后沿z,产生相同的值。 根据以...

    围绕待插值c点的立方体角有八个点
    在这里插入图片描述

    • x0表示在x下方一个方格点,x1表示在x上方的一个方格点,对于y0、y1、z0、z1是同样的意思。
      xd、yd、zd表示x、y、z在较小相关坐标的差值(这是维基百科中的解释,我认为他相当于是一个权值)

    • 首先,我们沿着x轴方向插值
      在这里插入图片描述
      在这里插入图片描述

    • V[x0,y0,z0]表示该函数在( x0,y0,z0)上的值

    • 然后再沿着y轴插值
      在这里插入图片描述

    • 最后再沿着z轴插值
      在这里插入图片描述

    如此我们就得到了一个点的值。三线性插值的结果与沿三个轴的插值步骤的顺序无关:任何其他顺序,例如沿x,然后沿y,最后沿z,产生相同的值。

    • 根据以上推导公式我们可以得到一个完整的公式
      在这里插入图片描述
    展开全文
  • 本文档对线性插值,双线性插值,三线性插值原理进行了讲解
  • 常用线性插值的介绍和应用 线性插值 插值是计算机图形学中非常常用的技术。通常,数据是在常规网格上指定的(值写在2D或3D网格的顶点位置)或在线上(在一维的情况下),但是程序需要在该网格上的随机位置求值。...
  • SIFT 三线性插值 理解篇

    千次阅读 2017-03-16 15:33:07
    但未对三线性插值进行阐述。我也是花了好久的时间才慢慢搞懂。有错之处,请指出。 1. 首先需要的几个已知量包括:  将关键点附近的邻域划分为d*d(Lowe建议d=4)个子区域,每个子区域做为一个种子点,每个种子点有8个...
  • 三线性插值就是针对三维离散数据进行插值而言的。所以我们到这里可以发现,前几篇博文的“线性插值”、“双线性插值”和本博文的“三”线性插值“是针对数据的维度而言的,而不是插值方法而言的。到这里的插值方法都...
  • 三线性插值(三维线性插值)

    万次阅读 2019-01-21 22:12:24
    三线性插值(trilinear interpolation)主要是用于在一个3D的立方体中,通过给定顶点的数值然后计算立方体中其他点的数值的线性插值方法。 具体推导过程见参考资料1,这里直接给出最终公式: 其中,坐标(x,y,z...
  • 三线性插值:https://www.cnblogs.com/yingying0907/archive/2012/11/21/2780092.html 用双线性插值计算圆形LBP特征中非整数位置的灰度值:https://blog.csdn.net/qq_38784454/article/details/79999974 ...
  • Trilinear Interpolation 6.1.1 介绍 6.1.2 三线性插值的的局限性 6.2 (部分)解决三线性插值问题:各向异性过滤(Anisotropic Filtering) 6.2.1 介绍 6.2.2 局限性 6.3 覆盖不规则的形状 —— EWA filtering 7 ...
  • ++模板库,用于根据在整数网格上采样的数据并行计算线性,双线性和三线性插值。 Splinterp还包含MEX扩展文件,这些文件允许从MATLAB / Octave调用其例程。 可以找到有关创建splinterp的博客文章。 线性插值是一种从...
  • HOG特征提取中的三线性插值算法
  • 所谓的三线性插值指的是在(x,y,theta)这三个参数空间中进行插值,即x方向、y方向和梯度的角度空间,如图1所示,图中的象素点(x,y)在利用梯度幅值作为权重进行投票时,要根据该象素点距离其他格子中心的距离进行加权...
  • 【原理】HOG中的三线性插值

    千次阅读 2014-03-11 21:59:47
    【原文:http://hi.baidu.com/susongzhi/item/3a3c758d7ff5cbdc5e0ec172】    图1   所谓的三线性插值指的是在(x,y,theta)这三个参数空间中进行插值,即x方向、y方向和
  • 內插是数学领域数值分析中的通过已知的离散数据求未知数据的过程或方法。 根据若干离散的数据数据,得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合。...1.线性插值 ...
  • 三线性插值计算重采样点数值

    千次阅读 2015-12-07 16:46:55
    三线性插值是一种较为经典的计算重采样点数值的方法,它将距离重采样点最近8个顶点的权重Wi(i=0,1,2…7)分别计算出来,在进行相加后得到重采样点值。如图所示:假设立方体8个顶点上的数值分别为Pi(i=0,1,2…7),...
  • HOG三线性插值

    千次阅读 2016-04-04 18:42:44
    所谓的三线性插值指的是在(x,y,theta)这三个参数空间中进行插值,即x方向、y方向和梯度的角度空间,如图1所示,图中的象素点(x,y)在利用梯度幅值作为权重进行投票时,要根据该象素点距离其他格子中心的距离进行加权...
  • 最近邻插值法&线性插值&双线性插值&三线性插值【转载】 文章来源于博客园作者:霓裳依旧 文章链接:最近邻插值法&线性插值&双线性插值&三线性插值
  • 里面分别用了高斯滤波,三线性插值这两个骚操作,简直666. 讲道理,代码我看了两天,真的是没看懂,这也是因为我没有看原始论文的原因,为了图快,也是看了网上的博客,大家都是讲了大概,文章中的一些细节都没讲...
  •  ... 当你做纹理映射的时候,是否经常会注意到屏幕上显示出的那些明显锯齿,而且你用的纹理像素化得太明显了?...下面我们将介绍几种常用的滤波方法,最后再详细介绍双线性插值滤波的具体实现。 Bi-linear Inte
  • 三线性插值在HOG中的应用

    千次阅读 2016-12-22 22:52:41
    所谓的三线性插值指的是在(x,y,theta)这三个参数空间中进行插值,即x方向、y方向和梯度的角度空间,象素点(x,y)在利用梯度幅值作为权重进行投票时,要根据该象素点距离其他格子中心的距离进行加权,同时该象素点的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,575
精华内容 630
关键字:

三线性插值

友情链接: С++.zip