反转实值索引网格

26

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) 表示使用双线性插值来解决使用浮点坐标 xy 的图像A的像素值。

我的问题是:给定索引网格 XY,如何生成“反向网格” X^-1Y^-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是完美可逆的,则该方法应在某些机器精度小的范围内找到完美的反向映射。

11个回答

-1
据我所了解,您有一张原始图像和一张变换后的图像,并且希望在不知道变换方式的情况下恢复已应用的变换的本质,但假设它是合理的,比如旋转或鱼眼扭曲。
我会尝试将图像阈值化以将其转换为二进制,在索引图像和普通图像中都要这样做。然后尝试识别对象。大多数映射至少会保留连通性和欧拉数,大多数情况下索引中最大的对象仍将是普通图像中最大的对象。
然后对于匹配的图像/索引对取得矩,并尝试消除平移、旋转和缩放。这给您提供了几个反向映射,然后您可以尝试将它们拼接在一起。(如果变换不简单,则很难,但是重新构建任何变换的一般问题无法解决)。

给定一个地图 M = {X, Y},我想计算一个反向地图 M_inv,使得 remap(remap(image_a, M), M_inv) 返回 image_a,模一些由于 M 推出帧外的点而被遮挡、由于局部拉伸而导致的分辨率损失以及由于局部压缩而导致的混叠。 - SuperElectric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接