使用双三次插值填充矩阵的边界

Posted

技术标签:

【中文标题】使用双三次插值填充矩阵的边界【英文标题】:Fill the boundaries of a matrix using Bicubic interpolation 【发布时间】:2016-03-31 08:03:28 【问题描述】:

我有一个大小为28x22 的矩阵。第一行、最后两行、第一列和最后两列(以红色和绿色标记)为空。这些列和行应该由双三次插值填充。

我在 SO 和互联网上阅读了几篇关于双三次插值的帖子,但不幸的是,我无法理解。此外,我读到双三次插值需要知道需要插值的像素周围的 4x4 网格。但是,由于行和列处于边界,所以我没有在它们周围设置4 x 4 网格。

【问题讨论】:

你需要寻找外推而不是插值(顺便说一句漂​​亮的莉娜图标头像) 【参考方案1】:

序幕

您需要推断未知区域。您需要根据要推断数据的信息来决定。例如,您想使用未知区域附近的点或使用沿整个已知区域分散的点。两种方法都有效,但结果不同,满足不同的需求。

我将使用靠近未知区域的点。让我从更简单的案例开始:

    一维线性外推

    线性外推法使用由 2 个已知点形成的线。所以例如假设这个向量:

    x 轴是向量/数组索引,y 轴是单元格的值。所以我取了 2 个最后已知的点(蓝色)并从中形成一条线(绿色)。它与下一个数组位置相交的地方是您的外推值(红色)。所以在 C++ 中它看起来像这样:

    float a[8]= 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 ; // your vector (last two numbers are unknown)
    a[6]=a[4]+((a[5]-a[4])*2.0); // =4.0
    a[7]=a[4]+((a[5]-a[4])*3.0); // =1.0
    

    一维三次外推

    它类似于 #1,但不是直线,而是使用参数多项式形式的 4 个控制点三次曲线。大多数三次曲线都是这样构造的,如果参数t=0,您将获得第二个控制点,如果t=1,您将获得第三个控制点。如果您使用t=<0,1>,那么您将在它们之间顺利迭代。我们需要在最后一个控制点之后扩大范围,所以t>=3 与步骤1 为下一个点位置。所以:

    float a[8]= 1.0,2.0,4.0,8.0,10.0,7.0,0.0,0.0 ; // your vector (last two numbers are unknown)
    float a0,a1,a2,a3; // your cubic curve polynomial coefficients (computed from 4 control points a[2],a[3],a[4],a[5])
    float t; // curve parameter
    // here compute the a0,a1,a2,a3
    t=3.0; a[6]=a0+a1*t+a2*t*t+a3*t*t*t*t;
    t=4.0; a[7]=a0+a1*t+a2*t*t+a3*t*t*t*t;
    

    现在如何获得a0,a1,a2,a3 系数?哟可以使用任何插值多项式。我最喜欢的是这个(bullet #3):

    Proper implementation of cubic spline interpolation

    就是这样(希望我在用 a[2+i] 替换 pi 时没有出现一些愚蠢的索引错误):

    float  d1,d2;
    d1=0.5*(a[4]-a[2]);
    d2=0.5*(a[5]-a[3]);
    a0=a[3];
    a1=d1;
    a2=(3.0*(a[4]-a[3]))-(2.0*d1)-d2;
    a3=d1+d2+(2.0*(-a[4]+a[3]));
    

    二维双三次外推

    这只是将问题分解为一组 1D 三次外推。如果您从上方查看 #2 中的图表,您会看到双三次:

    因此,首先您计算未知列(您可以),然后从中计算丢失的行(反之亦然)。

【讨论】:

以上是关于使用双三次插值填充矩阵的边界的主要内容,如果未能解决你的问题,请参考以下文章

使用双三次插值的彩色 matplotlib 地图

双三次插值

java 缩放算法 双线性插值,双三次插值

数字图像缩放之双三次插值

您如何对重新采样的音频数据进行双三次(或其他非线性)插值?

OpenCV图像缩放插值之BiCubic双三次插值