Tensorflow和OpenCV中的双线性插值实现

Ale*_*lex 5 interpolation opencv numpy tensorflow

我试图在tensorflowOpenCV中实现对双线性插值的处理.我的理解让我相信插值点的网格在两个库中的位置不同.这可以通过样本矩阵获得的不同结果得到证明:

import tensorflow as tf, numpy as np, cv2
a = np.arange(9, dtype=np.float32).reshape(3, 3)
cv2.resize(a, (2, 2))
Run Code Online (Sandbox Code Playgroud)

输出

array([[1. , 2.5],
       [5.5, 7. ]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

tf.InteractiveSession()
tf.image.resize_images(a[None, :, :, None], (2, 2)).eval()[0, :, :, 0]
Run Code Online (Sandbox Code Playgroud)

输出

array([[0. , 1.5],
       [4.5, 6. ]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

这个诊断是否正确?如果是这样,在张量流和OpenCV中放置插值点的方案是什么?

小智 1

通常(在 OpenCV、Matlab、scipy 等中),假设像素覆盖单位区域,并且对齐的是左上角和右下角像素的最角落。采样间隔更改为old_size / new_size

在Tensorflow中,有两种全新的方案,两者都不符合上面的方案。

对于align_corners=True,角点像素中心(old_size - 1) / (new_size - 1)与中间的新采样间隔对齐。对于align_corners=False,仅对齐左上角的像素中心,其余像素以间隔 进行采样old_size / new_size