我试图了解bilinear interpolation和tensorflow中实施的OpenCV。我的理解让我相信插值点的网格在两个库中的位置不同。这可以通过在样品基质上获得的不同结果来证明:
import tensorflow as tf, numpy as np, cv2
a = np.arange(9, dtype=np.float32).reshape(3, 3)
cv2.resize(a, (2, 2))
输出
array([[1. , 2.5],
[5.5, 7. ]], dtype=float32)
,而
tf.InteractiveSession()
tf.image.resize_images(a[None, :, :, None], (2, 2)).eval()[0, :, :, 0]
输出
array([[0. , 1.5],
[4.5, 6. ]], dtype=float32)
这种诊断是否正确?如果是这样,在张量流和OpenCV中放置插值点的方案是什么?
答案 0 :(得分:1)
通常(在OpenCV,Matlab,scipy等中),假设像素覆盖单位区域,并且对齐的是左上角和右下角像素的角。采样间隔更改为old_size / new_size
。
在Tensorflow中,有两个全新的方案,两者都不符合上述方案。
对于align_corners=True
,角点像素 center 与中间(old_size - 1) / (new_size - 1)
的新采样间隔对齐。
对于align_corners=False
,只有左上角的像素中心对齐,其余的以间隔old_size / new_size
进行采样。