在Tensorflow中使用cv2.remap或scipy.interpolate.map_coordinates等效/实现?

时间:2017-06-20 22:00:12

标签: python opencv image-processing tensorflow scipy

编辑:Tensorflow 1.3现在包含此操作的tf.contrib.resampler。从v0.2开始,PyTorch还支持使用affine_grid函数的此操作。

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

This question类似,但答案不是我要找的,因为tf.contrib.image.transform函数执行投影映射,而cv2.remapscipy...map_coordinates执行按像素映射。

2 个答案:

答案 0 :(得分:0)

我刚刚浏览了GitHub存储库并且似乎没有实现,tf.contrib.image.transform不使用任何子例程并且纯粹返回插值。然而,像素位置本身的变换只是简单的矩阵乘法,你可以自己做。如果您不熟悉,请参阅我的回答here。您需要自己进行插值。基本上你只需将你的坐标放入一个新的(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进行处理并将其重新置于张量中,但是这样做没有真正的好处。

答案 1 :(得分:0)

迟来的答案

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