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)
那么对于所有的像素坐标 i, j,
B[i, j] = A(X[i, j], Y[i, j])
圆括号记法 A(x, y)
表示使用双线性插值来解决使用浮点坐标 x
和 y
的图像A的像素值。
我的问题是:给定索引网格 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
还有
X^-1(X[i, j], Y[i, j]) = i
Y^-1(X[i, j], Y[i, j]) = j
对于所有整数像素坐标i,j
?
顺便说一下,图像和索引映射X和Y具有相同的形状。但是,索引映射X和Y没有先验结构。例如,它们不一定是仿射或刚性变换。它们甚至可能无法反转,例如,如果X,Y
将A中的多个像素映射到B中的完全相同的像素坐标,则无法反转。我正在寻找一种方法,如果存在合理的反向映射,则会找到它。
解决方案不必基于OpenCV,因为我没有使用OpenCV,而是另一个具有remap()
实现的库。虽然欢迎任何建议,但我特别希望得到一些“数学上正确”的东西,即如果我的映射M是完美可逆的,则该方法应在某些机器精度小的范围内找到完美的反向映射。