关于Tensorflow中的几个image_resize对比

方法介绍:

简单尝试了一下Tensorflow中的几调整图像大小的方法:
首先从知乎上搬砖下来相关中文介绍:

## Resizing
*   @{tf.image.resize_images}
*   @{tf.image.resize_area}
*   @{tf.image.resize_bicubic}
*   @{tf.image.resize_bilinear}
*   @{tf.image.resize_nearest_neighbor}

resize_images是总的接口,该接口的参数如下:

resize_images(images, size, method=ResizeMethod.BILINEAR, align_corners=False)

形参:

images:shape 为[batch, height, width, channels]的4-D图像张量或者shape为 [height, width, channels]的3-D图像张量,如果传入图像张量不兼容所制定规则会报错

size:一个dtypeint32拥有两个元素的1-D张量,格式为[new_height, new_width]

method:resize使用的方法,有四种方式,分别为:

方法 介绍
ResizeMethod.BILINEAR 双线性内插,其核心思想是在两个方向分别进行一次线性插值。
ResizeMethod.NEAREST_NEIGHBOR 最近邻插值法,将变换后的图像中的原像素点最邻近像素的灰度值赋给原像素点的方法,返回图像张量dtype与所传入的相同。
ResizeMethod.BICUBIC 双三次插值,双三次插值是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。
ResizeMethod.AREA 基于区域的图像插值算法,首先将原始低分辨率图像分割成不同区域,然后将插值点映射到低分辨率图像, 判断其所属区域, 最后根据插值点的邻域像素设计不同的插值公式, 计算插值点的值。

align_corners:精确对准输入输出图像的四个角,默认为false不精确对准。

return:dtypefloat3-D4-D图像张量,其shape分别为[batch, new_height, new_width, channels][new_height, new_width, channels]

而其余四个接口则是具体的不同实现图像缩放处理的方法,他们的参数都形如:

(images, size, align_corners=False, name=None)

第一个参数要求其shape一定是形如[batch, height, width, channels]的4-D格式,中间两个参数如resize_image所解释,后一个name是操作的名称,可有可无。

实验部分

首先我们拿红发香克斯的图像作为测试:


shanks_small.jpg

测试代码如下:

import tensorflow as tf
import cv2
import numpy as np

img_raw = cv2.imread('data/shanks_small.jpg')
img_in = img_raw / 255.
h, w, _ = img_in.shape

tf_img_in = tf.placeholder(dtype=tf.float32, shape=(None, None, 3))

scale = 3
tf_img_op1 = tf.image.resize_images(tf_img_in, [h * scale, w * scale], method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
tf_img_op2 = tf.image.resize_images(tf_img_in, [h * scale, w * scale], method=tf.image.ResizeMethod.BILINEAR)
tf_img_op3 = tf.image.resize_images(tf_img_in, [h * scale, w * scale], method=tf.image.ResizeMethod.BICUBIC)
tf_img_op4 = tf.image.resize_images(tf_img_in, [h * scale, w * scale], method=tf.image.ResizeMethod.AREA)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

img_op1, img_op2, img_op3, img_op4 = sess.run([tf_img_op1, tf_img_op2, tf_img_op3, tf_img_op4],
                                              feed_dict={tf_img_in: img_in})

img_op1[img_op1 < 0] = 0
img_op1[img_op1 > 1] = 1
img_op2[img_op1 < 0] = 0
img_op2[img_op1 > 1] = 1
img_op3[img_op1 < 0] = 0
img_op3[img_op1 > 1] = 1
img_op4[img_op1 < 0] = 0
img_op4[img_op1 > 1] = 1

img_op1 = np.asarray(img_op1 * 255, np.uint8)
img_op2 = np.asarray(img_op2 * 255, np.uint8)
img_op3 = np.asarray(img_op3 * 255, np.uint8)
img_op4 = np.asarray(img_op4 * 255, np.uint8)

cv2.imshow('image in', img_raw)
cv2.imshow('nearest neighbor', img_op1)
cv2.imshow('bi-linear', img_op2)
cv2.imshow('bi-cubic', img_op3)
cv2.imshow('area', img_op4)

# cv2.imwrite('data/nearest_neighbor.jpg', img_op1)
# cv2.imwrite('data/bi-linear.jpg', img_op2)
# cv2.imwrite('data/bi-cubic.jpg', img_op3)
# cv2.imwrite('data/area.jpg', img_op4)

cv2.waitKey()

其中关于python下配置tensorflow以及opencv的网上方法比较多,可以自行google之,或者我这有一个懒人版的配置tensorflow-gpu的参考。
最终效果如下:

area.jpg

bi-cubic.jpg
bi-linear.jpg
nearest_neighbor.jpg

比较奇怪的是bi-cubic插值的方法中出现了许多artifacts

你可能感兴趣的:(关于Tensorflow中的几个image_resize对比)