TensorFlow图像数据处理函数——图像大小调整(最全面的可运行的代码)
2019-04-22 16:06
211 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/TeFuirnever/article/details/89452795
一、图像编码处理
在之前的章节中提到一张RGBRGBRGB色彩模式的图像可以看成一个三维矩阵,矩阵中的每一个数表示了图像上不同位置,不同颜色的亮度。然而图像在存储时并不是直接记录这些矩阵中的数字,而是记录经过压缩编码之后的结果。所以要将一张图像还原成一个三维矩阵,需要解码的过程。TensorFIowTensorFIowTensorFIow提供了对jpegjpegjpeg和pngpngpng格式图像的编码/解码函数。以下代码示范了如何使用TensorFlowTensorFlowTensorFlow中对jpegjpegjpeg格式图像的编码/解码函数。
import tensorflow as tf import matplotlib.pyplot as plt # 读取图像的原始数据 image_raw_data = tf.gfile.FastGFile("./picture/2.jpeg", 'rb').read() with tf.Session() as sess: # 将图像使用jpeg的格式解码从而得到图相对应的三维矩阵。 # TensorFlow还提供了tf.image.decode_png函数对png格式的图像进行解码。 # 解码之后的结果为一个张量,在使用它的取值之前需要明确调用运行的过程。 img_data = tf.image.decode_jpeg(image_raw_data) # 使用pyplot工具可视化得到的图像。 plt.imshow(img_data.eval()) plt.show() # 将数据的类型转换成实数。 img_data = tf.image.convert_image_dtype(img_data, dtype=tf.float32) # 将表示一张图像的三维矩阵重新按照jpeg格式编码并存入文件中。 # 打开这张图像,可以得到和原始图像一样的图像。 encode_image = tf.image.encode_jpeg(img_data) with tf.gfile.GFile("/path/to/output", "wb") as f: f.write(encode_image.eval())
二、图像大小调整
一般来说,网络上获取的图像大小是不固定的,但神经网络输入节点的个数是固定的。所以在将图像的像素作为输入提供给神经网络之前,需要先将图像的大小统一。这就是图像大小调整需要完成的任务。图像大小调整有两种方式,第一种是通过算法使得新的图像尽量保存原始图像上的所有信息。TensorFlowTensorFlowTensorFlow提供了匹种不同的方法,并且将它们封装到
了
tf.image.resize_images函数。以下代码示范了如何使用这个函数。
import tensorflow as tf import matplotlib.pyplot as plt # 读取图像的原始数据 image_raw_data = tf.gfile.FastGFile("./picture/2.jpeg", 'rb').read() with tf.Session() as sess: # 将图像使用jpeg的格式解码从而得到图相对应的三维矩阵。 # TensorFlow还提供了tf.image.decode_png函数对png格式的图像进行解码。 # 解码之后的结果为一个张量,在使用它的取值之前需要明确调用运行的过程。 img_data = tf.image.decode_jpeg(image_raw_data) # 将数据的类型转换成实数。 img_data = tf.image.convert_image_dtype(img_data, dtype=tf.float32) # 通过tf.image.resize_images函数调整图像的大小。这个函数第一个参数为原始图像, # 第二个为调整后图像的大小,method参数给出了调整图像大小的算法。 resized = tf.image.resize_images(img_data, [400, 400], method=0) # 输出调整后的图像的大小,此处的结果为(?,?,?)。表示图像的的大小是400x400, # 但图像的深度在没有明确设置之前会是问号。 print(img_data.get_shape()) # 使用pyplot工具可视化得到的图像。 plt.imshow(resized.eval()) plt.show()
> (?, ?, ?)
这里
tf.image.resize_images函数中的
method参数取值与相对应的图像大小调整算法。
method取值 | 图像大小调整算法 |
---|---|
0 | 双线性插值法(Bilinearinterpolation) |
1 | 最近邻居法(Nearestneighborinterpolation) |
2 | 双三次插值法(Bicubicinterpolation) |
3 | 面积插值法(Areainterpolation) |
双线性插值法:
最近邻居法:
双三次插值法:
运行该方法时会报错,需要调整代码。
报的错误:
ValueError: Floating point image RGB values must be in the 0..1 range.
更改后的代码:
with tf.Session() as sess: 。。。 。。。 # 输出调整后的图像的大小,此处的结果为(?,?,?)。表示图像的的大小是300x300, # 但图像的深度在没有明确设置之前会是问号。 print(img_data.get_shape()) after_img = tf.clip_by_value(resized, 0.0, 1.0) # 使用pyplot工具可视化得到的图像。 plt.imshow(after_img.eval()) # plt.imshow(resized.eval()) plt.show()
面积差值法:
从上面的图中可以看出,不同算法去调整出来的结果会有细微差别,但不会相差太远。除了将整张图像信息完整保存,TensorFlowTensorFlowTensorFlow还提供了APIAPIAPI对图像进行裁剪或者填充。以下代码展示了通过
tf.image.resize-mage-with-crop-or_pad函数来调整图像大小的功能。
import tensorflow as tf import matplotlib.pyplot as plt # 读取图像的原始数据 image_raw_data = tf.gfile.FastGFile("./picture/2.jpeg", 'rb').read() with tf.Session() as sess: # 将图像使用jpeg的格式解码从而得到图相对应的三维矩阵。 # TensorFlow还提供了tf.image.decode_png函数对png格式的图像进行解码。 # 解码之后的结果为一个张量,在使用它的取值之前需要明确调用运行的过程。 img_data = tf.image.decode_jpeg(image_raw_data) # 将数据的类型转换成实数。 img_data = tf.image.convert_image_dtype(img_data, dtype=tf.float32) # 使用pyplot工具可视化得到的图像。 plt.imshow(img_data.eval()) plt.show() # 通过tf.image.resize_image_with_crop_or_pad函数调整图像的大小。 # 这个函数的第一个参数为原始图像,后面两个参数是调整后的目标图像大小。 # 如果原始图像的尺寸大于目标图像,那么这个函数会自动截取原始图像中居中的部分。 # 如果目标图像大于原始图像,这个函数会自动在原始图像的四周填充全0背景。 croped = tf.image.resize_image_with_crop_or_pad(img_data, 500, 500) padded = tf.image.resize_image_with_crop_or_pad(img_data, 2000, 2000) # 使用pyplot工具可视化得到的图像。 plt.imshow(croped.eval()) plt.show() plt.imshow(padded.eval()) plt.show()
原始图像:
croped——500x500图像:
padded——2000x2000图像:
相关文章推荐
- TensorFlow 图像处理和解码操作函数概述
- matlab中图像数据类型及处理函数
- Tensorflow图像预处理,Numpy读取数据踩坑
- TensorFlow小程序(六):图像数据处理(1)TFRecord
- TensorFlow图像预处理-函数
- 图像处理之其他杂项(四)之cvSnakeImage()函数代码升级,从C接口到C++接口:snakeImage()
- Tensorflow中图像处理函数(图像大小调整)
- TensorFlow 图像处理和解码操作函数
- 如何用TensorFlow图像处理函数裁剪图像?
- TensorFlow图像处理函数学习总结
- 很全面的MySQL处理重复数据代码
- php对图像的各种处理函数代码小结
- TensorFlow图像数据处理
- tensorflow处理自己的图像数据(不使用队列)
- 全面的MySQL处理重复数据代码
- Tensorflow--图像数据处理
- Zedboardwebcam设计问题篇(五)opencv处理帧数据,函数代码实现
- C++图像处理 -- 数据类型及公用函数
- 深度学习框架Tensorflow学习与应用 图像数据处理之一
- tensorflow图像数据处理