调整图像保留tensorflow中的纵横比



我是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,但是我不确定如何计算新的wh考虑张量似乎具有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_jpegtf.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

最新更新