tf.image.resize_bilinear 对比 cv2.resize
tf.image.resize_bilinear vs cv2.resize
tf.image.resize_bilinear
的结果与 cv2.resize
的结果完全不同。
我觉得这有点麻烦。设置align_corners=True
并不总是合理的,因为四个角并不总是应该固定在角上。那么有没有办法让它多一点"symmetry"?
重现代码:
import tensorflow as tf
import numpy as np
import cv2
np.set_printoptions(precision=3)
resize_shape = (10, 10)
a = np.ones((1, 2, 2, 1), dtype=np.float32)
a[0, 0, 0, 0] = 5.0
a[0, 1, 1, 0] = 5.0
b = tf.constant(a, dtype=tf.float32)
c = tf.image.resize_bilinear(b, resize_shape)
with tf.Session() as sess:
np_c = sess.run(c)
print np_c[0, :, :, 0]
print cv2.resize(a[0], resize_shape, interpolation=cv2.INTER_LINEAR)
获得的结果:
# tf.image.resize_bilinear
[[ 5. 4.2 3.4 2.6 1.8 1. 1. 1. 1. 1. ]
[ 4.2 3.72 3.24 2.76 2.28 1.8 1.8 1.8 1.8 1.8 ]
[ 3.4 3.24 3.08 2.92 2.76 2.6 2.6 2.6 2.6 2.6 ]
[ 2.6 2.76 2.92 3.08 3.24 3.4 3.4 3.4 3.4 3.4 ]
[ 1.8 2.28 2.76 3.24 3.72 4.2 4.2 4.2 4.2 4.2 ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]]
# cv2.resize
[[ 5. 5. 5. 4.2 3.4 2.6 1.8 1. 1. 1. ]
[ 5. 5. 5. 4.2 3.4 2.6 1.8 1. 1. 1. ]
[ 5. 5. 5. 4.2 3.4 2.6 1.8 1. 1. 1. ]
[ 4.2 4.2 4.2 3.72 3.24 2.76 2.28 1.8 1.8 1.8 ]
[ 3.4 3.4 3.4 3.24 3.08 2.92 2.76 2.6 2.6 2.6 ]
[ 2.6 2.6 2.6 2.76 2.92 3.08 3.24 3.4 3.4 3.4 ]
[ 1.8 1.8 1.8 2.28 2.76 3.24 3.72 4.2 4.2 4.2 ]
[ 1. 1. 1. 1.8 2.6 3.4 4.2 5. 5. 5. ]
[ 1. 1. 1. 1.8 2.6 3.4 4.2 5. 5. 5. ]
[ 1. 1. 1. 1.8 2.6 3.4 4.2 5. 5. 5. ]]
已编辑
设置align_corners=True
时,图像和调整大小后的图像的4个角对齐但只有4个像素。
考虑调整图像大小,图像中的 4 个角应该在调整后的图像的 4 个角中呈现 区域 (就像 cv2.resize
那样),而不是 4 个点在拐角处。
# tf.image.resize_bilinear(b, resize_shape, align_corners=True)
[[ 5. 4.56 4.11 3.67 3.22 2.78 2.33 1.89 1.44 1. ]
[ 4.56 4.21 3.86 3.52 3.17 2.83 2.48 2.14 1.79 1.44]
[ 4.11 3.86 3.62 3.37 3.12 2.88 2.63 2.38 2.14 1.89]
[ 3.67 3.52 3.37 3.22 3.07 2.93 2.78 2.63 2.48 2.33]
[ 3.22 3.17 3.12 3.07 3.02 2.98 2.93 2.88 2.83 2.78]
[ 2.78 2.83 2.88 2.93 2.98 3.02 3.07 3.12 3.17 3.22]
[ 2.33 2.48 2.63 2.78 2.93 3.07 3.22 3.37 3.52 3.67]
[ 1.89 2.14 2.38 2.63 2.88 3.12 3.37 3.62 3.86 4.11]
[ 1.44 1.79 2.14 2.48 2.83 3.17 3.52 3.86 4.21 4.56]
[ 1. 1.44 1.89 2.33 2.78 3.22 3.67 4.11 4.56 5. ]]
tf.image.resize_bilinear
的结果与 cv2.resize
的结果完全不同。
我觉得这有点麻烦。设置align_corners=True
并不总是合理的,因为四个角并不总是应该固定在角上。那么有没有办法让它多一点"symmetry"?
重现代码:
import tensorflow as tf
import numpy as np
import cv2
np.set_printoptions(precision=3)
resize_shape = (10, 10)
a = np.ones((1, 2, 2, 1), dtype=np.float32)
a[0, 0, 0, 0] = 5.0
a[0, 1, 1, 0] = 5.0
b = tf.constant(a, dtype=tf.float32)
c = tf.image.resize_bilinear(b, resize_shape)
with tf.Session() as sess:
np_c = sess.run(c)
print np_c[0, :, :, 0]
print cv2.resize(a[0], resize_shape, interpolation=cv2.INTER_LINEAR)
获得的结果:
# tf.image.resize_bilinear
[[ 5. 4.2 3.4 2.6 1.8 1. 1. 1. 1. 1. ]
[ 4.2 3.72 3.24 2.76 2.28 1.8 1.8 1.8 1.8 1.8 ]
[ 3.4 3.24 3.08 2.92 2.76 2.6 2.6 2.6 2.6 2.6 ]
[ 2.6 2.76 2.92 3.08 3.24 3.4 3.4 3.4 3.4 3.4 ]
[ 1.8 2.28 2.76 3.24 3.72 4.2 4.2 4.2 4.2 4.2 ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]
[ 1. 1.8 2.6 3.4 4.2 5. 5. 5. 5. 5. ]]
# cv2.resize
[[ 5. 5. 5. 4.2 3.4 2.6 1.8 1. 1. 1. ]
[ 5. 5. 5. 4.2 3.4 2.6 1.8 1. 1. 1. ]
[ 5. 5. 5. 4.2 3.4 2.6 1.8 1. 1. 1. ]
[ 4.2 4.2 4.2 3.72 3.24 2.76 2.28 1.8 1.8 1.8 ]
[ 3.4 3.4 3.4 3.24 3.08 2.92 2.76 2.6 2.6 2.6 ]
[ 2.6 2.6 2.6 2.76 2.92 3.08 3.24 3.4 3.4 3.4 ]
[ 1.8 1.8 1.8 2.28 2.76 3.24 3.72 4.2 4.2 4.2 ]
[ 1. 1. 1. 1.8 2.6 3.4 4.2 5. 5. 5. ]
[ 1. 1. 1. 1.8 2.6 3.4 4.2 5. 5. 5. ]
[ 1. 1. 1. 1.8 2.6 3.4 4.2 5. 5. 5. ]]
已编辑
设置align_corners=True
时,图像和调整大小后的图像的4个角对齐但只有4个像素。
考虑调整图像大小,图像中的 4 个角应该在调整后的图像的 4 个角中呈现 区域 (就像 cv2.resize
那样),而不是 4 个点在拐角处。
# tf.image.resize_bilinear(b, resize_shape, align_corners=True)
[[ 5. 4.56 4.11 3.67 3.22 2.78 2.33 1.89 1.44 1. ]
[ 4.56 4.21 3.86 3.52 3.17 2.83 2.48 2.14 1.79 1.44]
[ 4.11 3.86 3.62 3.37 3.12 2.88 2.63 2.38 2.14 1.89]
[ 3.67 3.52 3.37 3.22 3.07 2.93 2.78 2.63 2.48 2.33]
[ 3.22 3.17 3.12 3.07 3.02 2.98 2.93 2.88 2.83 2.78]
[ 2.78 2.83 2.88 2.93 2.98 3.02 3.07 3.12 3.17 3.22]
[ 2.33 2.48 2.63 2.78 2.93 3.07 3.22 3.37 3.52 3.67]
[ 1.89 2.14 2.38 2.63 2.88 3.12 3.37 3.62 3.86 4.11]
[ 1.44 1.79 2.14 2.48 2.83 3.17 3.52 3.86 4.21 4.56]
[ 1. 1.44 1.89 2.33 2.78 3.22 3.67 4.11 4.56 5. ]]