声明,文章中参考别人的内容,都已标明原文链接。
Tensorflow图像的读取、解码、显示、处理、编码、保存
1. Tensorflow读取图像文件后为什么要解码?
我们常见的图像格式有 .bmp,.gif,.jpg,.png等,而.bmp格式的图像是没有经过压缩的,其他3种都是经过编码压缩格式。所以在读取之后要进行解码还原。
2. 图像解码与编码
一张RGB三通道的彩色图像可以看成一个三维矩阵,矩阵中不同位置上的数字代表图像的像素值。然后图像在存储时并不是直接记录这些矩阵中的数字,而是经过了压缩编码。所以将一张图像还原成一个三维矩阵的过程就是解码的过程,反之就是编码了。其实如果大家熟悉opencv的话,imread和imwrite就是一个解码和编码的过程。
https://blog.csdn.net/chaipp0607/article/details/73029923
3. 代码例子解释(为了进一步理解解码的意义)
http://yueshi.me/?p=270
"""读取图片文件"""
File1 = tf.read_file('image.jpg')
"""解码图片,png格式用tf.image.decode_png,
channels=3表示RGB,1表示灰度"""
image = tf.image.decode_jpeg(file1, channels=3)
"""调整图片大小,size=[new_height, new_width]"""
image = tf.image.resize_images(image, size=[32,32])
"""转化图片转化为float32类型,并缩放到[0,1]之间,
也可使用 tf.cast(image, tf.float32)/255(一般图片类型最大值为255)"""
image = tf.image.convert_image_dtype(image, tf.float32)
下面逐句解释一下代码
file1 = tf.read_file('image.jpg')
功能:读取和输出文件中的全部内容
输入:一个0维的字符串类型的张量(即字符串)
输出:图像文件中的所有内容(字符串)
image = tf.image.decode_jpeg(file1, channels=3)
功能:将编码的图像解码为uint8或uint16类型的张量(二维或三维矩阵)
输入:读取的图像文件,0维的字符串类型的张量(即字符串)
输出:uint8或uint16类型的张量
channels=3表示RGB图像
channels=1表示灰度图像
channels=0表示jpeg编码的图像的通道数
image = tf.image.resize_images(image, size=[32,32])
功能:使用指定的方法将图像调整为指定大小(这个方法会扭曲图像)
输入:images:
4维张量,[ batch, height, width, channels ]
3维张量,[ height, width, channels ]
size:一个包含2个元素的一维int32张量,[ new_height, new_width ]
输出:新size的图像(张量)
image = tf.image.convert_image_dtype(image, tf.float32)
功能:转换数据类型,在强制转换之前适当地缩放值。使用浮点值表示的图像的值应在范围[0,1]内。存储在整数数据类型中的图像数据的值应在范围[0,max],其中max是该数据类型最大的可表示正数。
4、Tensorflow中读取图像的方法
(1)通过tf.gfile.FastGFile()读取图像文件(得到bytes类型数据)
image_raw = tf.gfile.FastGFile(‘test.jpg’,‘rb’).read() # 读入二进制文件
img = tf.image.decode_jpeg(image_raw) # 解码为tf中的图像格式tensor
tf.gfile模块提供了tensorflow中通用的文件I/O操作。
tf.gfile.FastGFile(filename, mode)函数用于获取文件操作句柄,类似于python中的文本操作open()函数。第一个参数filename是文件路径,第二个参数mode是文件编码方式(‘r’:UTF-8编码;‘rb’:非UTF-8编码)。
(2)通过tf.read_file()读入图像文件(得到string类型的tensor)
image_value = tf.read_file(‘test.jpg’)
img = tf.image.decode_jpeg(image_value, channels=3)
(3)通过scipy.misc.imread()函数读入图像文件(得到ndarray)
img = scipy.misc.imread(‘image/13.png’, mode=‘RGB’)
(4)通过tf.train.string_input_producer()+tf.WholeFileReader().read()读入图像文件(这个方法适用于读取的图片数据过多,如果一次性读入内存吃不消)参考https://www.cnblogs.com/polly333/p/7481685.html
(5)图像读取方法当然还有其它方法,但是这几种在tensorflow中是比较常用的
5、Tensorflow中图像显示的方法
5.0 tensor和array
tensor转array:a.eval()
array转tensor:tf.convert_to_tensor(b)
注意,显示图像时,不能是tensor,可以是array
5.1 在tensorflow中用Matplotlib显示图像
Matplotlib(绘图+可视化)。Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。简单说,可以画各种图:散点图、曲线图、直方图、饼图等,将数据可视化;可以对图像进行显示和处理。
plt.figure(fig.1)
plt.imshow(image)
plt.show()
下面逐句解释一下代码
plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
功能:新建画布
plt.imshow(image,cmap=None)
image:要绘制的图像或数组,如果是张tensor要转化为array。
cmap:颜色图谱(colormap), 默认绘制为RGB(A)颜色空间。
注意注意注意
plt绘制灰度图格式必须是(height,width),而不能是(height,width,1);绘制彩色图像格式是(height,width,channels)。tensorflow读取图像数据时,会得到(height,width,channels)的格式,即彩色图是(height,width,3),灰度图是(height,width,1),所以这种情况下直接用plt绘制灰度图会报错(TypeError: Invalid dimensions for image data),为了让plt绘制出来灰度图我们需要把它reshape成(height,width)格式。
5.2 在tensorflow中用OpenCV显示图像
cv2.namedWindow('image', cv2.WINDOW_KEEPRATIO)
cv2.imshow('image', img_)
cv2.waitKey(0)
cv2.namedWindow(winname,flags=None)
功能:创建一个窗口,用于显示图像,可以通过其winname参数引用这个窗口,也是窗口的标题。
内置flags,用来指定窗口显示格式
cv2.WINDOW_NORMAL 窗口大小可改变
cv2.WINDOW_AUTOSIZE 窗口大小不可改变
cv2.WINDOW_FREERATIO 自适应比例
cv2.WINDOW_KEEPRATIO 保持比例饿
cv2.imshow(winname,mat)
功能:在指定的winname窗口中显示图像
Mat类是用于保存图像以及其他矩阵数据的数据结构,这里的mat可以是array类型,不能是tensor类型。
cv2.waitKey(0)
功能:控制图像显示持续的时间
如果是0,就会一直显示,知道你任意按下一个键或者把它叉掉又或者你把程序杀掉。
如果是一个正整数,比如25,那么图像就显示25秒后自动消失。
6、Tensorflow中图像保存的方法
6.2 在tensorflow中用matplotlib保存图像
plt.imsave(fname,arr)
功能:将数组保存为图像文件
fname:要保存的文件名(包括路径和扩展名),array类型数据,形状可以是MxN,MxNx3 (RGB)或MxNx4 (RGBA)
6.1 在tensorflow中用OpenCV保存图像
cv2.imwrite(filename,img,params=None)
功能:保存图像到指定文件夹和指定文件名
filename:要保存的文件名(包括路径和扩展名),img要保存的图像。
可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别,默认为3
7、 python的图像处理模块PIL(Python Imaging Library),Pillow
PIL是Python平台上图像处理标准库,功能强大,使用简单。PIL默认仅支持到Python2.7,如果要支持Python3.x版本,必须使用兼容PIL的新版本–Pillow,Pillow中加入了相比于PIL更多的新特性。
from PIL import Image as im
img = im.open('image/13.png')
img.show()
img.save("image/img.png")