图像处理python有很多个库,因为最近在学习Tensorflow,所以就用Tensorlow做了一些小处理。
一:图像编码处理
图像在存储时不是直接记录图像中的每个像素值,而是记录经过压缩编码后的结果。所以要将图像还原成矩阵,需要解码的过程。Tensorflow提供了对jpeg/png格式图像的编码或解码函数。
import matplotlib.pyplot as plt
import tensorflow as tf
# 读取图像的原始数据
image_raw_data = tf.gfile.FastGFile("timg.jpg", 'rb').read()
with tf.Session() as sess:
# 将图片使用jppeg的格式解码从而得到图像对应的三维矩阵。tensorflow还提供了
# tf.image.decode_png函数对png格式的图像进行解码,解码之后的结果为一个张量
# ,在使用它的取值之前需要明确调用运行的过程
image_data = tf.image.decode_jpeg(image_raw_data)
# 输出解码的三维矩阵
#eval() 其实就是tf.Tensor的Session.run() 的另外一种写法
print(image_data.eval())
# 使用pyplot工具可视化得到的图像
plt.imshow(image_data.eval())
plt.show()
#将数据转化成实数方便下面的样例程序对图像进行处理
image_data = tf.image.convert_image_dtype(image_data,dtype=tf.uint8)
#将表示一张图像的三维矩阵重新按照jpeg格式编码并存入文件中,打开这张像
#可以得到和原始图像一样的图像
encode_image = tf.image.encode_jpeg(image_data)
with tf.gfile.GFile("out./01.jpg",'wb') as f:
f.write(encode_image.eval())
这就是把图像另存了一下,就不贴图片了。
二:图像大小调整
(一)
我们从网上获取到的数据集往往不符合我们的需求,但神经网络的输入节点个数确是固定的,所以需要去先把图像的尺寸改为自己所需要的。Tensorflow给我们提供了四种方法,它们被封装在tf.image.resize_images函数里。
resized = tf.image.resizes(image_data,[img_H,img_W],method=)
method取值 | |
0 | 双线性插值法 |
1 | 最近邻居法 |
2 | 双三次插值法 |
3 | 面积插值法 |
这四种方法的具体区别我也不是很清楚,如果有知道的,请赐教。
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
# 读取图像的原始数据
image_raw_data = tf.gfile.FastGFile("timg.jpg", 'rb').read()
with tf.Session() as sess:
image_data = tf.image.decode_jpeg(image_raw_data)
#method =0 双线性插值法
#method = 1 ,最近邻居法
#method = 2 ,双三次插值法
#meithod = 3 面积插值法
resized = tf.image.resize_images(image_data,[300,300],method=0)
# 输出调整后图像的大小,此处的结果为(300,300,?)。表示图像的大小是300*300但图像的深度在没有明确设置之前会是问号。
print(resized.get_shape())
# TensorFlow的函数处理图片后存储的数据是float32格式的,
# 需要转换成uint8才能正确打印图片。
resized = np.asarray(resized.eval(), dtype='uint8')
plt.imshow(resized)
plt.show()
#将表示一张图像的三维矩阵重新按照jpeg格式编码并存入文件中,打开这张像可以得到和原始图像一样的图像
encode_image = tf.image.encode_jpeg(resized)
with tf.gfile.GFile("out./02.jpg",'wb') as f:
f.write(encode_image.eval())
(二)对处理的图像进行填充或裁剪与按照比例调整图像大小
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
image_raw_data = tf.gfile.FastGFile('timg.jpg','rb').read()
with tf.Session() as sess:
img_data = tf.image.decode_jpeg(image_raw_data)
# tensorflow提供了api对图像进行裁剪或者填充
# 如果目标图像小于原始图像,则自动在截取原始图像居中部分
croped = tf.image.resize_image_with_crop_or_pad(img_data, 150, 150)
plt.imshow(croped.eval())
plt.show()
# 如果目标图像大于原始图像,则自动在原始图像四周填充0
padded = tf.image.resize_image_with_crop_or_pad(img_data, 600, 800)
plt.imshow(padded.eval())
plt.show()
#tensorflow还支持比例调整
#第二个参数为(0,1]之间的实数
central_cropped = tf.image.central_crop(img_data, 0.5)
plt.imshow(central_cropped.eval())
plt.show()
croped1 = tf.image.encode_jpeg(croped)
with tf.gfile.GFile("out./02_crop.jpg", 'wb') as f:
f.write(croped1.eval())
padded1 = tf.image.encode_jpeg(padded)
with tf.gfile.GFile("out./02_padded.jpg", 'wb') as f:
f.write(padded1.eval())
central_cropped1 = tf.image.encode_jpeg(central_cropped)
with tf.gfile.GFile("out./02_central_cropped.jpg", 'wb') as f:
f.write(central_cropped1.eval())
三:图像翻转
对图像进行翻转可以有效的扩充数据集.我们可以将图像上下翻转,左右翻转以及沿对角线翻转。
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
# 读取图像的原始数据
image_raw_data = tf.gfile.FastGFile("timg.jpg", 'rb').read()
with tf.Session() as sess:
image_data = tf.image.decode_jpeg(image_raw_data)
#将图像上下翻转
flipped = tf.image.flip_up_down(image_data)
resized = np.asarray(flipped.eval(), dtype='uint8')
plt.imshow(resized)
plt.show()
encode_image = tf.image.encode_jpeg(resized)
with tf.gfile.GFile("out./03_up_down.jpg", 'wb') as f:
f.write(encode_image.eval())
#将图片左右翻转,
flipped = tf.image.flip_left_right(image_data)
resized = np.asarray(flipped.eval(), dtype='uint8')
plt.imshow(resized)
plt.show()
encode_image = tf.image.encode_jpeg(resized)
with tf.gfile.GFile("out./03_left_right.jpg", 'wb') as f:
f.write(encode_image.eval())
#将图片沿对角线翻转
flipped = tf.image.transpose_image(image_data)
resized = np.asarray(flipped.eval(), dtype='uint8')
plt.imshow(resized)
plt.show()
encode_image = tf.image.encode_jpeg(resized)
with tf.gfile.GFile("out./03_transpose_image.jpg", 'wb') as f:
f.write(encode_image.eval())
#将图片沿以一定概率上下翻转
flipped = tf.image.random_flip_up_down(image_data)
resized = np.asarray(flipped.eval(), dtype='uint8')
plt.imshow(resized)
plt.show()
encode_image = tf.image.encode_jpeg(resized)
with tf.gfile.GFile("out./03_random_flip_up_down.jpg", 'wb') as f:
f.write(encode_image.eval())
#将图片以一定概率
flipped = tf.image.random_flip_left_right(image_data)
resized = np.asarray(flipped.eval(), dtype='uint8')
plt.imshow(resized)
plt.show()
encode_image = tf.image.encode_jpeg(resized)
with tf.gfile.GFile("out./03_random_flip_left_right.jpg", 'wb') as f:
f.write(encode_image.eval())