OpenCV remap()使用实值索引网格使用双线性插值从图像中采样值网格,并将样本网格作为新图像返回.
确切地说,让:
A = an image
X = a grid of real-valued X coords into the image.
Y = a grid of real-valued Y coords into the image.
B = remap(A, X, Y)
Run Code Online (Sandbox Code Playgroud)
那么对于所有像素坐标i,j,
B[i, j] = A(X[i, j], Y[i, j])
Run Code Online (Sandbox Code Playgroud)
其中圆括号A(x, y)表示使用双线性插值来求解使用浮点数x和和的图像A的像素值y.
我的问题是:给定索引网格X,Y我如何生成"逆网格" X^-1,Y^-1这样:
X(X^-1[i, j], Y^-1[i, j]) = i
Y(X^-1[i, j], Y^-1[i, j]) = j
Run Code Online (Sandbox Code Playgroud)
和
X^-1(X[i, j], Y[i, j]) = i
Y^-1(X[i, …Run Code Online (Sandbox Code Playgroud) 我有一组非网格对齐的输入值与网格对齐的输出值相关联.给定一个新的输入值,我想找到输出:

(这些是X,Y坐标,将不精确的非方形眼动跟踪输入设备校准到屏幕上的确切位置.)
这看起来像Bilinear Interpolation,但我的输入值不是网格对齐的.给定输入,我如何计算出合理的输出值?
答:在这种情况下,我有输入和输出点集,实际需要的是执行逆双线性插值以找到四边形内输入点的U,V坐标,然后执行正常的双线性插值(如Nico在下面的答案)使用那些U,V坐标在输出四边形上.
更新:我下面的术语是错误的。我在“ Lerp2D”中描述的“正向”算法(需要逆运算)需要四个任意角。它沿着每个边都是线性的,但是所有4个边都可以独立拉伸。它不是双线性的。
我已经在标题中保留了双线性-如果您来这里是寻找“双线性的逆”,例如in x和中的独立拉伸y,请参见Spektre的答案。
如果您需要更一般的情况(由任意四边形定义拉伸),请参见已接受的答案。
在此问题的评论中,另请参阅人们给出的链接。
原始问题:
双线性插值的计算很简单。但是我需要一种执行逆运算的算法。(算法对我来说可以是伪代码或任何广泛使用的计算机语言)
例如,这是双线性插值的Visual Basic实现。
' xyWgt ranges (0..1) in x and y. (0,0) will return X0Y0,
(0,1) will return X0Y1, etc.
' For example, if xyWgt is relative location within an image,
' and the XnYn values are GPS coords at the 4 corners of the image,
' The result is GPS coord corresponding to xyWgt.
' E.g. given (0.5, 0.5), the …Run Code Online (Sandbox Code Playgroud)