第十章Tensorflow图像处理
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)#启动线性运行队列,只有调用此函数,才是真正的执行,前面都是声明和等待print(sess.run(image))coord.request_stop()#停止所有的线程coord.join(threads)
线程和进程的关系
进程就相当于360安全中心,线程就相当于里面的-杀毒-清理-优化,也可以比喻成进程是一辆火车,线程相当于多个车厢,一个进程一个线程,相当于一辆火车一节车厢,在限速情况下,速度快,效率慢,浪费资源大,多线程得话速度快,效率快,资源利用率高
10.2图像格式TFRecord
对于大量的图像数据,TFsorFlow采用TFRecord格式,将图像数据和图像的标签以二进制的形式无损压缩方式存储在TFRecord文件中,TFRecord文件中的数据都是通过tf.train.Example Protocol Buffer的格式存储的。
tf.train.Example 中包含了一个从属性名称到取值的字典。其中,属性名称为一个字符串,属性的取值可以为字符串(BytesList)、实数列表(FloatList)或者整数列表(Int64List)
ByyeList存放图像数据,Int64List存放图像的标签对应的整数。
10.3把图像转换为TFRecord文件
把图像转换为TFRecord格式的文件就是把图像数据和图像标签的数据按tf.train.Example数据结构存储成二进制文件的过程。
import tensorflow as tf
import os
from PIL import Image #处理图像的包
import numpy as np
folder='C:\\Users\\qzm\\Pictures\\image'
#存储原始图片数据的路径,包含猫和狗
label={'cat','dog'}
writer=tf.python_io.TFRecordWriter(folder+'cat_dog.tfrecords')
#要生成的TFRecordWriter文件,放在哪个路径下
#记录图片个数
count=0
for index,name in enumerate(label): #此时同时遍历所有的图片,以及图片的标签folder_path=folder+'\\'+name+'\\' #返回的是一个路径,这个路径下有两个文件夹,分别是猫,狗for img_name in os.listdir(folder_path):#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表#我的理解是开始遍历两个文件夹内的所有图片img_path=folder_path+img_name #每一个图片的完整访问路径img=Image.open(img_path)#open用于打开文件img=img.resize((128,128))#调整大小img_raw=img.tobytes()#将图片转化为二进制格式example=tf.train.Example(features=tf.train.Features(feature={"label":tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),'img_raw':tf.train.Feature(bytes_list=tf.train.BytesList(value=[img_raw]))}))#example对象对label和image数据进行封装#我的理解是,此时的example是声明了一个封装格式,声明了标签和原始图片的存储格式writer.write(example.SerializeToString())#序列化为字符串,此时才是真正的开始转化为TFRecord格式文件count=count+1
writer.close()
10.4读取TFRecord文件
读取TFRecord文件首先采用输入生成(tf.train.string_input_producer)将其加载到一个队列,然后读出(tf.TFRecordReader)并将(tf.parse_single_example)Example对象拆解为图像数据和标签数据,最后对图像数据解码并保持成JPG文件。
#定义数据流队列
filename_queue=tf.train.string_input_producer([folder+'cat_dog.tfrecords'])
reader=tf.TFRecordReader()#创建阅读器
_,serialized_example=reader.read(filename_queue)#开始读取数据,返回文件名和文件
features=tf.parse_single_example(serialized_example,
features={'label':tf.FixedLenFeature([],tf.int64),
'img_raw':tf.FixedLenFeature([],tf.string),})
#声明一个feature对象,包含image和label
image=tf.decode_raw(features['img_raw'],tf.uint8)
image=tf.reshape(image,[128,128,3])
label=tf.cast(features['label'],tf.int32)
with tf.Session() as sess:#开始一个会话init_op=tf.initialize_all_variables()sess.run(init_op)coord=tf.train.Coordinator()#线程协调器threads=tf.train.start_queue_runners(coord=coord)#以多线程的方式启动对队列的处理for i in range(count):example,l = sess.run([image,label])#在会话中取出image和labelimg=Image.fromarray(example,'RGB')#是from PIL import Image的引用img.save(folder+str(i)+'_Label_'+str(l)+'.jpg')#存下图片print(example,l)coord.request_stop()#请求停止线程coord.join(threads)#等待所有进程结束
10.5图像处理实例
本节我们通过一个实例进一步说明如何处理图像数据,本节图像处理主要利用tf.image API,该API包含了很多图像处理的函数。包括调整大小,剪裁和填充,色彩调整等等。
代码基于一个600×600大小的猫的图像
调整图像大小
#调整图像大小
import matplotlib
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import osos.getcwd()#返回当前目录的位置image_raw_data=tf.gfile.FastGFile('C:/Users\qzm\Pictures\image\cat.jpeg','rb').read()
#tf.gfile.FastGFile是tensorflow中用于读取图片的函数
img_data=tf.image.decode_jpeg(image_raw_data)
#此函数用于图像解码with tf.Session() as sess:resized=tf.image.resize_images(img_data,[300,300],method=0)#将图片重新定义大小cat=np.asarray(resized.eval(),dtype='uint8')#我的个人理解,.eval和np.asarray函数都是用来转换数据的类型plt.imshow(cat)plt.show()#plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能显示。其后跟着plt.show()才能显示出来。#但是在jupyter notebook里面,只用plt.imshow()也可以
裁剪和填充图像
#裁剪和填充图像
with tf.Session() as sess:croped=tf.image.resize_image_with_crop_or_pad(img_data,300,300)padded=tf.image.resize_image_with_crop_or_pad(img_data,3000,3000)#裁剪和填充的函数一样,只不过调整后面的长宽,长宽小为放大,长宽大为缩小plt.imshow(croped.eval())plt.show()plt.imshow(padded.eval())plt.show()
对角线翻转图像
#对角线翻转图像
with tf.Session() as sess:transposed=tf.image.transpose_image(img_data)#对角线翻转图像函数plt.imshow(transposed.eval())#每次显示图像之前都要用一下.eval函数改变格式plt.show()
图像色彩调整
#图像色彩调整
with tf.Session() as sess:#在[-max_delta,max_delta]的范围随机调整图片的亮度adjusted=tf.image.random_brightness(img_data,max_delta=0.5)#此函数用于调整图片亮度,max_delta的参数不能是负,每运行一次,亮度都会随机变化一下plt.imshow(adjusted.eval())plt.show()
调整色彩饱和度
#调整色彩饱和度
with tf.Session() as sess:adjusted=tf.image.adjust_hue(img_data,0.9)#这个函数的作用有点像调滤镜plt.imshow(adjusted.eval())plt.show()
第十章Tensorflow图像处理相关推荐
- Tensorflow图像处理以及数据读取
本文完整代码在 https://github.com/jiemojiemo/Tensorflow_Demo/blob/master/image_loader.ipynb Tensorflow图像处理以 ...
- tensorflow: 图像处理模块 tf.image
tf.image.decode_jpeg tensorflow里面给出了一个函数用来读取图像,不过得到的结果是最原始的图像,是没有经过解码的图像,这个函数为tf.gfile.FastGFile('pa ...
- Tensorflow图像处理相关操作
#对图像的处理import matplotlib.pyplot as plt import tensorflow as tf#读取图像的原始数据 image_raw_data=tf.gfile.Fas ...
- 如何用TensorFlow图像处理函数裁剪图像?
当给定大量不同质量的训练数据时,CNN往往能够很好地工作. –图像能够通过可视化的方式,传达复杂场景所蕴含的某种目标主题. –在Stanford Dogs数据集中,重要的是图像能够以可视化的方式,突出 ...
- 数字图像处理第十章——图像分割
数字图像处理第十章 数字图像处理---图像分割 (一)点.线和边缘检测 1.1 点检测 1.2 线检测 1.3 使用函数edge的边缘检测 (二)使用霍夫变换的线检测 2.1 函数hough 2.2 ...
- (转)Tensorflow 实战Google深度学习框架 读书笔记
本文大致脉络: 读书笔记的自我说明 对读书笔记的摘要 具体章节的摘要: 第一章 深度学习简介 第二章 TensorFlow环境搭建 第三章 TensorFlow入门 第四章 深层神经网络 第五章 MN ...
- python的窗口处理模块_python的图像处理模块
除了opencv专门用来进行图像处理,可以进行像素级.特征级.语义级.应用级的图像处理外,python中还有其他库用来进行简单的图像处理,比如图像的读入和保存.滤波.直方图均衡等简单的操作,下面对这些 ...
- TensorFlow:实战Google深度学习框架(六)图像数据处理
第七章 图像数据处理 7.1 TFRecord输入数据格式 TensorFlow提供了一种统一的格式来存储数据--TFRecord格式 7.1.1 TFRecord格式介绍 7.1.2 TFRecor ...
- 基于python的tensorflow_Python深度学习:基于TensorFlow
前言 第一部分 Python及应用数学基础 第1章 NumPy常用操作 2 1.1 生成ndarray的几种方式 3 1.2 存取元素 5 1.3 矩阵操作 6 1.4 数据合并与展平 7 1.5 通 ...
最新文章
- [转载]Windows SDK笔记
- linux 双mysql_MySQL双主互备+Keepalived高可用架构实现案例
- 下列哪个不是java的数据类型_下面哪个不是Java基本数据类型?()
- Linux内核访问外设I/O--动态映射(ioremap)和静态映射(map_desc) (转载)
- The Past Mistake is the Future Wisdom: Error-driven ContrastiveProbability Optimization for Chinese
- Git 与 Github 基础(二)—— Git for Windows
- UIScrollView总结
- 韦东山freeRTOS系列教程之【第五章】队列(queue)
- bandgap带隙基准电路设计,cadence,
- phpnow php升级,phpnow如何升级php版本
- Centos7 压缩文件
- 二叉树应用_二叉搜索树与双向链表
- iOS 苹果官方Demo合集
- 微信朋友圈图片显示缩放
- python数据可视化是什么_Python数据可视化的四种简易方法
- 数据结构与算法一:稀疏数组 队列 链表
- Neat Reader初体验
- P4408 [NOI2003] 逃学的小孩(树的直径)
- 视频弹幕技术 php,HTML5实现视频弹幕功能
- css预处理器-stylus 很少人用