10.1加载图像
Tensorflow对图像文件的加载和对二进制文件的加载相同,只是图像的内容需要解码,加载方式比较多。
有两种方式,第一种,把图片看看成一个完整的图片直接读取,获取图片的原始数据,再进行解码。
如使用tf.gfile.FastGFile()读取图像文件,然后利用tf.image.decode_jpeg()或tf.image.decode_pgn()进行解码
#加载包
import matplotlib.pyplot as plt #用于可视化
import tensorflow as tf
%matplotlib inline
#当用jupyter notebook编码时候才用,用于显示可视化的图像
image_raw_data_jpq=tf.gfile.FastGFile('C:/Users\qzm\Pictures\Camera Roll\0410.jpg','rb').read()
#函数功能:实现对图片的读取。
#函数参数:(1)path:图片所在路径 (2)decodestyle:图片的解码方式。(‘r’:UTF-8编码; ‘rb’:非UTF-8编码)
Tensorflow中会话的目的
Tensorflow的设计就是把计算定义和运算的结果分开
Session,就是用来让我们的Tensorflow去执行我们一开始声明的计算
图像解码知识
一张RGB图像可以看成一个三维的矩阵,矩阵中的每一个数表示了图像上不同位置,不同颜色的亮度。然而图像在存储时并不是直接记录这些矩阵中的数字,而是记录经过压缩编码之后的结果。所以要将一张图象还原成一个三维矩阵。需要解码的过程。
with tf.Session() as sess:
img_data=tf.image.decode_jpeg(image_raw_data_jpg)
#图像解码函数
plt.figure(1)#图像显示
print(sess.run(img_data))#显示图像矩阵,三维,R,G,B数字矩阵
plt.show(img_data.eval())#显示图像,显示你所输入的图像
这一种方式不太适合批量读取数据,第二种方法比较适合批量读取数据,这种方法把图像看成一个文件,用队列的方式读取。在Tensorflow中,队列不仅是一种数据结构,更提供了多线程机制。首先,使用tf.train.string_input_producer找到所需文件,并将其加载到一个队列中,然后,使用tf.WholeFileReader()把完整的文件加载到内存中,用read从队列中读取图像文件,最后,用tf.image.decode_jpeg()或tf.image.decode_pgn()进行解码
import tensorflow as tf
path='C:/Users\qzm\Pictures\image'
#图片路径
file_queue=tf.train.string_input_producer([path])#创建输入队列
image_reader=tf.WholeFileReader() #创建阅读器
_,image=image_reader.read(file_queue)#用阅读器去读队列
image=tf.image.decode_jpeg(image)#开始解码
with tf.Session() as sess:
coord=tf.train.Coordinator()#协同启动线程
"""
tf.train.Coordinator是tensorflow的一个多线程管理器,Coordinator类用来管理在Session中的多个线程,可以用来同时停止多个工作线程并且向那个在等待所有工作线程终止的程序报告异常,该线程捕获到这个异常之后就会终止所有线程。
"""
threads=tf.train.start_queue_runners(sess=sess,coord=coord)#启动线性运行队列,只有调用此函数,才是真正的执行,前面都是声明和等待