使用双立方插值填充矩阵的边界

时间:2016-03-31 08:03:28

标签: opencv image-processing bicubic

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

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

image

1 个答案:

答案 0 :(得分:1)

<强>序言

你需要推断未知区域。您需要决定要推断数据的信息。例如,您希望使用unknonw区域附近的点或使用分散在整个已知区域的点。这两种方法都是有效的,但具有不同的结果以满足不同的需求。

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

  1. 1D线性外推

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

    droplevel

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

    t=0
  2. 1D立方外推

    类似于#1 ,但您不是使用参数多项式形式的4控制点三次曲线。构造大多数三次曲线,以便如果参数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; 进行下一个点位置。所以:

    shape

    a0,a1,a2,a3

    现在如何获得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])); 系数? Yo可以使用任何插值多项式。我最喜欢的是这个(子弹#3 ):

    • 1D linear extrapolation

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

    Path movefrom = FileSystems.getDefault().getPath(selectedFile.getPath());
                Path target = FileSystems.getDefault().getPath("userfiles/"+UNAME+"/"+ANAME+"/"+selectedFile.getName());
                Path targetDir = FileSystems.getDefault().getPath("userfiles/"+UNAME+"/"+ANAME);
                try{
                    Files.move(movefrom,target,StandardCopyOption.ATOMIC_MOVE);
                }catch (IOException e){}
    
  3. 2D双立方外推

    这只是将问题分成一组 1D 立方外推法。如果您从上面的#2 查看图表,您会看到bi-cubic this:

    1D cubic extrapolation

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