在深度学习的过程中,往往对输入图像的大小需要进行一个调整,特别是对于拥有全连接层的神经网络,因为全连接层的节点数是固定的。因此,为了满足全连接层的一个输入的要求,我们可以利用tensorflow自带的函数来进行图像大小的调整。
总体来说一共有三个函数。原始图像大小为1242*375.
一、tf.image.resize_images(image,shape,method)
一共有三个参数,第一个是原始图像,第二个是重采样目标影像大小,第三个是重采样的方法。双线性插值算法(Bilinear interpolation);Method取值为:0;最近邻居法(Nearest neighbor interpolation);Method取值为:1;双三次插值法(Bicubic interpolation);Method取值为:2;
这个函数是通过插值的方式实现图像的大小变换,包括最近邻插值,双线性插值,双三次插值等。
二、tf.image.resize_image_with_crop_or_pad(image,IMG_W,IMG_H)
一共有三个参数,分别是原始图像,目标图像的宽,目标图像的高。
这个函数不是通过插值改变图像大小,而是直接通过裁剪和填充。这么做的好处就是不会让图像看上去又明显的畸变,但是会使得原始图像不完整。
三、tf.image.central_crop(image,rate)
这个函数一共有两个参数,一个是原始图像,另一个是原始图像调整的比例。注意,这种算法rate只能在0-1之间,否则会出现错误。
raise ValueError('central_fraction must be within (0, 1]')
ValueError: central_fraction must be within (0, 1]
这个函数是对原始图像整体的比例进行调整。实际上,有点类似于第二个函数,在缩小的时候实际上是采用了类似于裁剪的方法,图片中的部分物体是被裁剪掉的。
所有实验的源代码如下:
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt#这个可以用来
"""
Created on Thu Jul 19 15:42:38 2018
@author: Lenovo
"""
IMG_W1 = 208 # resize图像,太大的话训练时间久
IMG_H1 = 208
IMG_W2=2000
IMG_H2=2000
BATCH_SIZE = 2
picdir1 = 'E:/Study/研究生文档/密集匹配程序/train/image_2/000000_10.png'
image_raw=tf.gfile.GFile(picdir1,'rb').read()
image_raw = tf.image.decode_png(image_raw)
with tf.Session() as sess:
plt.imshow(image_raw.eval())
plt.show()
#第一种方法,采用resize函数,采用双线性插值
img_resized1 = tf.image.resize_images(image_raw, [100,800],method=0)
img_resized1 = np.asarray(img_resized1.eval(),dtype='uint8')
plt.imshow(img_resized1)
plt.show()
img_resized1 = tf.image.resize_images(image_raw, [900,2700],method=0)
img_resized1 = np.asarray(img_resized1.eval(),dtype='uint8')
plt.imshow(img_resized1)
plt.show()
croped = tf.image.resize_image_with_crop_or_pad(image_raw,300,300) #目标图像大小<原始图像的大小,则截取原始图像的居中部分,
padded = tf.image.resize_image_with_crop_or_pad(image_raw,1500,1500) #目标图像大小>原始图像的大小,则会在原始图像的四周填充全为0背景
plt.imshow(croped.eval())
plt.show()
plt.imshow(padded.eval())
plt.show()
central_cropped = tf.image.central_crop(image_raw,0.25) #按照比例裁剪图像,第二个参数为调整比例,比例取值[0,1]
plt.imshow(central_cropped.eval())
plt.show()
总结,这次主要试验了三种不同的图像大小调整的方式。有些方式会产生形变,但内容中的物体不会丢失。有些方法虽然不会产生形变,但是内容中的物体会丢失。所以应该根据自己的需要使用。
参考博客:tensorflow改变图像大小