今天学到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]]])
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)得出
| |
| |