我对TF很新。我正在尝试调整图像张量的大小,以使图像的最小尺寸为常数值LO_DIM。 在非tf环境中,我只是做这样的事情:
if img.size[0] < img.size[1]:
h = int(float(LO_DIM * img.size[1]) / img.size[0])
img = resize(img, [LO_DIM, h])
else:
w = int(float(LO_DIM * img.size[0]) / img.size[1])
img = resize(img, [w, LO_DIM])
我知道,要调整大小我应该使用tf.image.resize_images
,但我不知道如何计算新的w
和h
,因为张量似乎有shape=<unknown>
}。
注意:我传递的每个图像可能有不同的大小,这就是我需要动态计算的原因。我正在使用LO_DIM来保持宽高比而不会扭曲图像。
有关如何实现这一目标的任何建议吗?
如果有帮助,处理目标是从缩放图像中获取随机NxN补丁,但我找到的只是resize_image_with_crop_or_pad
,它似乎没有进行初始缩放。
答案 0 :(得分:3)
这是issue回答的。
这是一个调整张量图像大小保持aspext比率的示例代码段:
def resize_image_keep_aspect(image, lo_dim=LO_DIM):
# Take width/height
initial_width = tf.shape(image)[0]
initial_height = tf.shape(image)[1]
# Take the greater value, and use it for the ratio
min_ = tf.minimum(initial_width, initial_height)
ratio = tf.to_float(min_) / tf.constant(lo_dim, dtype=tf.float32)
new_width = tf.to_int32(tf.to_float(initial_width) / ratio)
new_height = tf.to_int32(tf.to_float(initial_height) / ratio)
return tf.image.resize_images(image, [new_width, new_height])
通过使用shape=<unknown>
或tf.image.decode_jpeg
类型的特定解码器来解决张量为tf.image.decode_png
的问题,而不是tf.image.decode_image
答案 1 :(得分:0)
Tensorflow 2.x 有一个内置方法来实现相同的结果。
默认方法用法:
import tensorflow as tf
tf.image.resize(
images, size, method=ResizeMethod.BILINEAR, preserve_aspect_ratio=False,
antialias=False, name=None
)
示例用法:
>>> max_10_20 = tf.image.resize(image, [10,20], preserve_aspect_ratio=True)
>>> max_10_20.shape.as_list()
[1, 10, 10, 1]
preserve_aspect_ratio
标志执行以下操作:
来源:https://www.tensorflow.org/api_docs/python/tf/image/resize