使用tf.image.resize() 和tf.image.resize_with_pad()调整图像大小

本文详细介绍了TensorFlow库中tf.image.resize函数的用途,如何调整图像大小并可能产生的失真问题,以及如何使用tf.image.resize_with_pad来避免失真并保持纵横比。同时,列出了各种插值方法和参数说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tf.image.resize()

作用

     ~~~~     使用指定的方法调整图像大小。
     ~~~~     如果原始纵横比与大小不同,调整大小的图像将失真。 为避免失真,可用tf.image.resize_with_pad()

参数

tf.image.resize(
    images,                         # 形状 [batch, height, width, channels] 的 4-D 张量或形状 [height, width, channels] 的 3-D 张量。
    size,                           # 2 个元素的一维 int32 张量:new_height,new_width。 图像的新尺寸。
    method=ResizeMethod.BILINEAR,   # 一个 image.ResizeMethod,或等效的字符串。 默认为双线性。
    preserve_aspect_ratio=False,    # 是否保留纵横比。
                                    # true,图像将被调整为适合大小的大小,同时保留原始图像的纵横比。 
                                    # 若尺寸大于图像的当前尺寸,则放大图像。 默认为false。
    antialias=False,                # 对图像进行下采样时是否使用anti-aliasing filter。
    name=None                       # 此操作的名称(可选)。
)

     ~~~~     其中,Image.ResizeMethod()的选项有:
     ~~~~     bilinear: 双线性插值。若antialisa为true,则在下采样时成为半径为1的hat/tent filter。
     ~~~~     lanczos3: Lanczos kernel with radius 3。高质量的实用过滤器,但可能有一些ringing,尤其是在合成图像上。
     ~~~~     lanzos5:Lanczos kernel with radius 5。非常高质量的滤波器,但可能有更强的ringing。
     ~~~~     bicubic:三次插值。相当于Catmull-Rom kernel,与lanczos3kernel相比较,质量相当好,速度更快,尤其是在上采样时。
     ~~~~     gaussian:Gaussian kernel with radius 3, sigma = 1.5 / 3.0.
     ~~~~     nearest:最近邻插值。 与最近邻插值一起使用时,antialias无效。
     ~~~~     area:使用区域插值进行抗锯齿重采样。 与区域插值一起使用时,antialias没有效果。
     ~~~~     mitchellcubic:Mitchell-Netravali Cubic non-interpolating filter. 对于合成图像(尤其是那些缺乏适当预过滤的图像),ringing比Cubic interpolant of Keys少,不那么锐利。

返回值

     ~~~~     If images was 4-D, a 4-D float Tensor of shape [batch, new_height, new_width, channels].
     ~~~~     If images was 3-D, a 3-D float Tensor of shape [new_height, new_width, channels].

例子

import tensorflow as tf                               # 导入tensorflow
img_path ='C:\\Users\\xxx\\.keras\\datasets\\flower_photos\\roses\\6158504080_b844a9ae05.jpg'    # 输入图片路径
img_raw = tf.io.read_file(img_path)                   # 读取图片内容,返回值时string的tensor
img_tensor = tf.image.decode_image(img_raw)           # 对输入的string的tensor进行解码
print(img_tensor.shape)                               # 输入解码后的图像形状
print(img_tensor.dtype)                               # 输入解码后的图像表示类型
img_final = tf.image.resize(img_tensor, [192, 192])   # 调整图像大小
print(img_final.shape)                                # 输入调整后的图像大小
(333, 500, 3)
<dtype: 'uint8'>
(192, 192, 3)

tf.image.resize_with_pad()

作用

     ~~~~     调整图像大小并将图像填充到目标宽度和高度。
     ~~~~     通过保持纵横比不变而不失真,将图像大小调整为目标宽度和高度。 如果目标尺寸与图像尺寸不匹配,则会调整图像大小,然后用零填充以匹配请求的尺寸。

参数

tf.image.resize_with_pad(
    image,                              # 形状 [batch, height, width, channels] 的 4-D 张量或形状 [height, width, channels] 的 3-D 张量。
    target_height,                      # 目标高度
    target_width,                       # 目标宽度
    method=ResizeMethod.BILINEAR,       # 用于调整图像大小的方法。 见 image.resize()
    antialias=False                     # 调整大小时是否使用抗锯齿。 参见“image.resize()”。
)

返回值

     ~~~~     Resized and padded image.
     ~~~~     If images was 4-D, a 4-D float Tensor of shape [batch, new_height, new_width, channels].
     ~~~~     If images was 3-D, a 3-D float Tensor of shape [new_height, new_width, channels].

主要参考:
tf.image.resize | TensorFlow Core v2.9.1 (google.cn)
tf.image.resize_with_pad | TensorFlow Core v2.9.1 (google.cn)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值