cv2.remap 或 Tensorflow 中的scipy.interpolate.map_coordinates等效



edit:Tensorflow 1.3 现在包含此操作的tf.contrib.resampler。从 v0.2 开始,PyTorch 也通过affine_grid函数支持此操作。

我想知道在 Tensorflow 中是否有等效于 cv2.remap(或 scipy.ndimage.interpolate.map_coordinates,基本上是一回事)的函数的官方或自定义实现。

这个问题很相似,但答案不是我想要的,因为tf.contrib.image.transform函数执行射影映射和cv2.remapscipy...map_coordinates执行像素映射。

我刚刚浏览了 GitHub 存储库,它似乎没有实现,tf.contrib.image.transform不使用任何子例程,纯粹返回内插值。但是,像素位置本身的转换只是您可以自己完成的简单矩阵乘法。如果您不熟悉,请在此处查看我的答案。不过,您需要自己进行插值。基本上,您只需将坐标放入一个新的(3, N)矩阵(其中N是点数),如下所示(假设您只有N=4个点以简洁起见):

x0 x0 x0 x0 x1 x1 x1 x1 x2 x2 x2 x2 x3 x3 x3 x3
y0 y1 y2 y3 y0 y1 y2 y3 y0 y1 y2 y3 y0 y1 y2 y3 
1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  

然后乘以(3,3)转换矩阵以获得新位置

s0*x0' s1*x0' s2*x0' ...
s0*y0' s1*y1' s2*y2' ...
s0     s1     s2  

其中s0、...、sN是缩放因子,因此最后除以最后一行以删除缩放,然后仅将前两行作为点。

x0' x0' x0' ...
y0' y1' y2' ...

您需要确保使用的是浮点运算,然后可以根据需要进行插值。

你可以在TensorFlow中完成所有这些操作。如果你只是把它作为一个预处理步骤,你当然可以将张量分解成一个numpy数组,用cv2.remapscipy.ndimage.interpolate.map_coordinates处理,然后把它放回张量中,但这样做没有真正的好处。

一个迟到的答案

在TF 1.13上,有一个tf.contrib.image.dense_image_warp新功能,它或多或少地remap但没有插值。

最新更新