您的位置:首页 > 编程语言 > Python开发

tensorflow图像数据处理

2018-03-20 23:21 471 查看
今天学到tensorflow图像数据处理,所以写个笔记。

1 首先是导入库

import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np

2 读取图片

image_raw_data = tf.gfile.FastGFile('../datasets/cat.jpg','rb').read()

with tf.Session() as sess:
img_data = tf.image.decode_jpeg(image_raw_data)

# 输出解码之后的三维矩阵。
print (img_data.eval())
img_data.set_shape([1797, 2673, 3])
print (img_data.get_shape())
用的python3。读的是一个猫的图片其shape是(1797, 2673, 3)。

3 打印图片

with tf.Session() as sess:
plt.imshow(img_data.eval())
plt.show()



4 调整图像大小

with tf.Session() as sess:
resized = tf.image.resize_images(img_data, [300, 300], method=0)

# TensorFlow的函数处理图片后存储的数据是float32格式的,需要转换成uint8才能正确打印图片。
print ("Digital type: ", resized.dtype)
cat = np.asarray(resized.eval(), dtype='uint8')
# tf.image.convert_image_dtype(rgb_image, tf.float32)
plt.imshow(cat)
plt.show()
其核心是tf.image.resize_images函数。通过上面程序,图片被调整成为300×300的。tf.image.resize_images函数的method参数取值对应不同的图像大小调整算法,如下表tf.image.resize_images函数的method参数取值对应不同的图像大小调整算法
Method取值图像调整算法
0
双线性插值法(Bilinear Interpolation)
1最近邻居法(nearest_neighbor nearest_neighbor Interpolation)
2双三次插值法(nearest_neighborBicubic interpolation)
3面积插值法(Area nearest_neighbor Interpolation)
不同算法调整的图片结果会有细微差别,但不相差太远。图片不会设置标题就没有放图。

5 裁剪和填充图片

 
with tf.Session() as sess:
croped = tf.image.resize_image_with_crop_or_pad(img_data, 1000, 1000)
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()






    通过nearest_neighbortf.image.resize_image_with_crop_or_pad  函数调整图像大小。其第一个参数为原始图像,后面俩个参数是调整后的目标图像大小。如果调整的图像小于原始图像,就会裁剪,如果调整的图像大于原始图像,就会填充0为背景。
可以通过比例调整大小,如下:central_cropped = tf.image.central_crop(img_data, 0.5)    tf.image.central_crop函数第一个参数为原始图像,第二个为调整比例。上面的代码截取的中间50%的图像。

另外,tensorflow也提供了tf.crop_to_bounding_box函数与tf.pad_to_bounding_box函数来裁剪与填充给定区域的图像,故而使用这俩个函数要求给定的尺寸满足一定要求。

6 图像翻转

下面代码实现了图像上下翻转,左右翻转,以及沿对角线翻转:with tf.Session() as sess:
# 上下翻转
flipped1 = tf.image.flip_up_down(img_data)
# 左右翻转
flipped2 = tf.image.flip_left_right(img_data)

#对角线翻转
transposed = tf.image.transpose_image(img_data)
plt.imshow(transposed.eval())
plt.show()






7 图片色彩调整

 
with tf.Session() as sess:
# 将图片的亮度-0.5。
#adjusted = tf.image.adjust_brightness(img_data, -0.5)

# 将图片的亮度-0.5
#adjusted = tf.image.adjust_brightness(img_data, 0.5)

# 在[-max_delta, max_delta)的范围随机调整图片的亮度。
adjusted = tf.image.random_brightness(img_data, max_delta=0.5)

# 将图片的对比度-5
#adjusted = tf.image.adjust_contrast(img_data, -5)

# 将图片的对比度+5
#adjusted = tf.image.adjust_contrast(img_data, 5)

# 在[lower, upper]的范围随机调整图的对比度。
#adjusted = tf.image.random_contrast(img_data, lower, upper)

plt.imshow(adjusted.eval())
plt.show()



上面程序分别介绍了调整图像亮度与对比度

8 添加色相饱和度

with tf.Session() as sess:
adjusted = tf.image.adjust_hue(img_data, 0.1)
#adjusted = tf.image.adjust_hue(img_data, 0.3)
#adjusted = tf.image.adjust_hue(img_data, 0.6)
#adjusted = tf.image.adjust_hue(img_data, 0.9)

# 在[-max_delta, max_delta]的范围随机调整图片的色相。max_delta的取值在[0, 0.5]之间。
#adjusted = tf.image.random_hue(image, max_delta)

# 将图片的饱和度-5。
#adjusted = tf.image.adjust_saturation(img_data, -5)
# 将图片的饱和度+5。
#adjusted = tf.image.adjust_saturation(img_data, 5)
# 在[lower, upper]的范围随机调整图的饱和度。
#adjusted = tf.image.random_saturation(img_data, lower, upper)

plt.imshow(adjusted.eval())
plt.show()



9 添加标注框

with tf.Session() as sess:

boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])

4000
begin, size, bbox_for_draw = tf.image.sample_distorted_bounding_box(
tf.shape(img_data), bounding_boxes=boxes)

batched = tf.expand_dims(tf.image.convert_image_dtype(img_data, tf.float32), 0)
image_with_box = tf.image.draw_bounding_boxes(batched, bbox_for_draw)

distorted_image = tf.slice(img_data, begin, size)
plt.imshow(distorted_image.eval())
plt.show()
在图像处理中,图像中需要关注的物体通常会被标注框圈出来,tensorflow通过tf.image.draw_bounding_boxes函数在图像中添加标注框。
1 需要进行图片数据的float转换 
2 如果不是一个batch,是一个图片的话需要手动加一个维度
3 box = [[[]]]
4 最后显示需要转换回去 需要知道原本图片的维度数据利用 print(sess.run(img_data).shape)得出

 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python