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)
表示使用双线性插值法通过浮点值坐标求解图像 A 的像素值x
and 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
And
X^-1(X[i, j], Y[i, j]) = i
Y^-1(X[i, j], Y[i, j]) = j
对于所有整数像素坐标i, j
?
FWIW,图像和索引图 X 和 Y 的形状相同。然而,索引图 X 和 Y 没有先验结构。例如,它们不一定是仿射或刚性变换。它们甚至可能是不可逆的,例如如果X, Y
将多个像素映射到A
到 B 中相同的精确像素坐标。我正在寻找一种方法的想法,该方法可以找到合理的逆映射(如果存在)。
该解决方案不需要基于 OpenCV,因为我没有使用 OpenCV,而是另一个具有remap()
执行。虽然欢迎提出任何建议,但我特别热衷于“数学上正确”的东西,即如果我的映射 M 是完全可逆的,则该方法应该在机器精度的一些小范围内找到完美的逆。