在Tensorflow中调整图像保留宽高比

时间:2018-02-06 12:39:00

标签: image image-processing tensorflow conv-neural-network

我对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,它似乎没有进行初始缩放。

2 个答案:

答案 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