方法介绍:
简单尝试了一下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:一个dtype
为int32
拥有两个元素的1-D张量,格式为[new_height, new_width]
method:resize使用的方法,有四种方式,分别为:
方法 | 介绍 |
---|---|
ResizeMethod.BILINEAR | 双线性内插,其核心思想是在两个方向分别进行一次线性插值。 |
ResizeMethod.NEAREST_NEIGHBOR | 最近邻插值法,将变换后的图像中的原像素点最邻近像素的灰度值赋给原像素点的方法,返回图像张量dtype与所传入的相同。 |
ResizeMethod.BICUBIC | 双三次插值,双三次插值是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。 |
ResizeMethod.AREA | 基于区域的图像插值算法,首先将原始低分辨率图像分割成不同区域,然后将插值点映射到低分辨率图像, 判断其所属区域, 最后根据插值点的邻域像素设计不同的插值公式, 计算插值点的值。 |
align_corners:精确对准输入输出图像的四个角,默认为false
不精确对准。
return:dtype
为float
的3-D
或4-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
是操作的名称,可有可无。
实验部分
首先我们拿红发香克斯的图像作为测试:
测试代码如下:
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的参考。
最终效果如下:
比较奇怪的是bi-cubic
插值的方法中出现了许多artifacts