在Tensorflow中是否有cv2.remap或scipy.interpolate.map_coordinates的等效/实现?

7
编辑:Tensorflow 1.3现在包含了tf.contrib.resampler来执行此操作。PyTorch从版本0.2开始也支持此操作,使用affine_grid函数。
我想知道是否有官方或自定义实现的函数与cv2.remap(或基本相同的scipy.ndimage.interpolate.map_coordinates)在Tensorflow中等效。
这个问题类似于这个问题,但答案不是我所寻找的,因为tf.contrib.image.transform函数执行投影映射,而cv2.remapscipy...map_coordinates执行像素级映射。
2个回答

2
我刚刚浏览了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 进行处理,然后再将其放回到张量中,但这样做并没有任何实际好处。


我认为将张量从TensorFlow中分离出来并转换为NumPy数组,然后再放回去不是一个好主意。这样双线性插值就不会包含在梯度流中,因此也不会被反向传播! - palimboa
@palimboa 确实!好评论,你应该使用TF函数来完成这个任务(除非只是用于预处理,在这种情况下并不重要...但没有特别需要分解成numpy)。 - alkasm

1
一个晚回答
在TF 1.13中,有一个新的函数tf.contrib.image.dense_image_warp,它或多或少地执行remap但没有插值。

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