线性插值:基于2D表计算校正

时间:2014-04-15 07:24:20

标签: c math 2d interpolation linear-interpolation

我尝试做的事情应该只是一个二维的线性插值,但目前我找不到正确的方法。为了简单地描述问题:有一个大小为3000x3000像素的绘图区域,我必须在一条水平线。为此,我从每个像素位置到下一个像素位置绘制点或短线,然后形成一条线。

现在必须对整个事物进行校正,其中校正信息可以在(对于该示例简化)4×4阵列中找到,其中每个元素包含描述校正后的值的一对坐标。所以中性数组(没有校正)看起来像这样:

0,0      1000,0      2000,0      3000,0
0,1000   1000,1000   2000,1000   3000,1000
0,2000   1000,2000   2000,2000   3000,2000
0,3000   1000,3000   2000,3000   3000,3000

真正的修正表将包含描述要进行的修正的其他坐标:

enter image description here

因此,输入数据I在没有校正的情况下具有点的坐标,没有校正的字段值和校正数据。但是,如何计算现在应用校正值的线点,以便绘制如图像右侧所示的扭曲线?我目前使用X和Y两个独立线性插值的方法不起作用,Y位置在单元格边界上跳跃,但在单元格内不会平滑变化。

那么......有什么想法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

首先必须就插值方法达成一致。我建议使用双线性或重心插值。在one of my previous posts中,我想象了两种方法之间的差异。

我将专注于双线性插值。我们希望将单元格内的任何点转换为其校正点。因此,所有点都可以单独转换。

我们需要点u的插值参数v(x, y)。因为我们有一个轴对齐的网格,这很简单:

u = (x - leftCellEdge) / (rightCellEdge - leftCellEdge)
v = (y - bottomCellEdge) / (topCellEdge - bottomCellEdge)

我们可以通过双线性插值重建点:

p2       p4
   x----x
   |  o |
   x----x
p1       p3

o = (1 - u) * ((1 - v) * p1 + v * p2) + u * ((1 - v) * p3 + v * p4)

现在,相同的公式可用于更正的点。如果您使用原始点p1p4,您将获得未经修正的线点。如果您使用p1p4的更正单元格点,则会获得更正后的线点。