今天学到tensorflow图像数据处理,所以写个笔记。
1 首先是导入库
import matplotlib.pyplot as plt
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)
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())

4 调整图像大小
with tf.Session() as sess:
resized = tf.image.resize_images(img_data, [300, 300], method=0)
print ("Digital type: ", resized.dtype)
cat = np.asarray(resized.eval(), dtype='uint8')
其核心是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.imshow(padded.eval())
 
通过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())
  
7 图片色彩调整 | | with tf.Session() as sess: adjusted = tf.image.random_brightness(img_data, max_delta=0.5) plt.imshow(adjusted.eval())
 上面程序分别介绍了调整图像亮度与对比度 8 添加色相饱和度with tf.Session() as sess: adjusted = tf.image.adjust_hue(img_data, 0.1) plt.imshow(adjusted.eval())

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