本文实例讲述了Python基于Tensor FLow的图像处理操作。分享给大家供大家参考,具体如下:
在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数据进行处理使其变成一张新的图片,在此基础上进行学习,从而提高网络识别的准确率。
1、图像解码显示
利用matplot库可以方便简洁地在jupyter内对图片进行绘制与输出,首先通过tf.gfile打开图片文件,并利用函数tf.image.decode_jpeg将jpeg图片解码为三位矩阵,之后便可以通过matplot绘制与显示图片信息了
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
#读取图像文件
image_raw = tf.gfile.GFile( 'D:\Temp\MachineLearning\data\cat.jpeg' , 'rb' ).read()
with tf.Session() as sess:
#对jpeg图像解码得到图像的三位矩阵数据
image_data = tf.image.decode_jpeg(image_raw)
print (image_data. eval ())
plt.imshow(image_data. eval ())
plt.show()
|
可以看到打印的图片三维矩阵信息和显示的图片:
2、图像缩放
tensorflow还自带了许多图像处理函数,比如resize_image对图片进行大小的缩放。其中第一个参数代表图片数据源,第二个数组代表缩放后的大小,第三个method代表采用的缩放方法,默认0是双线性插值法,1代表最近邻插值法,2代表双立方插值法,3代表像素区域插值法。
1
2
3
4
5
6
|
#对图片大小进行缩放
image_resize = tf.image.resize_images(image_data,[ 500 , 500 ],method = 0 )
#tensorflow处理后的图片是float32格式的,需要转化为uint8才能正确输出
image_resize = np.asarray(image_resize. eval (),dtype = 'uint8' )
plt.imshow(image_resize)
plt.show()
|
3、图像裁切
函数tf.image.resize_image_with_crop_or_pad可以在保证图片原始比例的条件下对图片进行裁切或填充。
函数tf.image.random_crop是随机对图片进行选取裁剪,而不是以中心。
1
2
3
4
5
6
7
8
|
#图片裁剪
image_crop = tf.image.resize_image_with_crop_or_pad(image_data, 500 , 500 )
plt.imshow(image_crop. eval ())
plt.show()
#随机裁剪
img_random = tf.image.random_crop(image_data,[ 300 , 300 , 3 ])
plt.imshow(img_random. eval ())
plt.show()
|
resize_image_with_crop_or_pad第一个参数是图片资源,后两个参数是裁切后的图片大小,当原始图片大于目标值时将裁去两边多余部分,当图片小于目标值时将用黑色填充,例如上图左右被裁剪,上下用黑色填充。
random_crop第一个参数是图片资源,第二个参数是一个三位张量,代表目标图像大小。
4、图像翻转
通过函数实现图片的上下、左右翻转,在模型训练时,可以将原本的样本图片进行反转,作为新的特征值进行输入供模型训练。
1
2
3
4
5
6
7
8
9
|
#上下翻转
img_down = tf.image.flip_up_down(image_data)
plt.imshow(img_down. eval ())
plt.show()
#左右翻转
img_left = tf.image.flip_left_right(image_data)
plt.imshow(img_left. eval ())
plt.show()
|
5、调整对比度、明度、饱和度
通过tf.image.adjust_contrast可以对图像对比度进行调整,当参数大于1代表加深,小于1代表减淡
tf.image.random_contrast可以在指定范围内随即调整对比度
类似的还有adjust_brightness、adjust_saturation、adjust_hue对明度、饱和度、色相进行调整
1
2
3
4
5
6
7
8
9
10
11
12
|
#加深对比度
img_deep = tf.image.adjust_contrast(image_data, 2 )
plt.imshow(img_deep. eval ())
plt.show()
#降低对比度
img_fade = tf.image.adjust_contrast(image_data, 0.5 )
plt.imshow(img_fade. eval ())
plt.show()
#随机对比度
img_contrast = tf.image.random_contrast(image_data, 0.5 , 2 )
plt.imshow(img_contrast. eval ())
plt.show()
|
6、对VGG网络的输入图片进行处理
Vgg网络训练中传入的图片参数x_img是以batch_size为单位的四维数据,例如传入20张32×32的3通道图片,其数据为[20,32,32,3]。但是tensorflow的图片处理函数只可以处理三维的单张图片。因此需要首先通过split()函数将20张图片拆分成单张[1,32,32,3],再通过reshape()函数转化为三维数据[32,32,3],之后再调用图片处理函数对图片进行处理,将处理后的图片恢复成四维,然后放在数组res_arr中,拼接成原来的一组20×32×32×3的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 将一批batch_size张图片在第一维上切分为单张图片
img_arr = tf.split(x_img,batch_size,axis = 0 )
res_arr = []
# 遍历每个图片对其进行处理
for img in img_arr:
# 将单张四维的图片[1,32,32,3]处理成三维[32,32,3]
img = tf.reshape(img,[ 32 , 32 , 3 ])
# 对单张图片进行图像增强
img_flip = tf.image.random_flip_left_right(img) # 翻转图片
img_bright = tf.image.random_brightness(img_flip,max_delta = 63 ) # 随机调整亮度
img_contrast = tf.image.random_contrast(img_bright,lower = 0.2 , upper = 1.8 ) # 调整对比度
# 将增强后的图片再变回原来的四维格式
img = tf.reshape(img_contrast,[ 1 , 32 , 32 , 3 ])
# 将每个处理后的图片放在一个数组
res_arr.append(img)
# 将处理后的单个图片重新拼接在一起
img_aug = tf.concat(res_arr,axis = 0 )
|
希望本文所述对大家Python程序设计有所帮助。
原文链接:https://blog.csdn.net/theVicTory/article/details/100621722