我是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
,它似乎没有进行初始缩放。
这是由此问题回答的。
这是一个示例片段,可以调整张量图映像保持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])
通过使用类型tf.image.decode_jpeg
或tf.image.decode_png
(tf.image.decode_image
shape=<unknown>
张量的问题。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