tf.image.sample_distorted_bounding_box(含其他对图形的操作)

此函数为图像生成单个随机变形的边界框。函数输出的是可用于裁剪原始图像的单个边框。返回值为3个张量:begin,size和 bboxes。前2个张量用于 tf.slice 剪裁图像。后者可以用于 tf.image.draw_bounding_boxes 函数来画出边界框。

image_size: 是包含 [height, width, channels] 三个值的一维数组。数值类型必须是 uint8,int8,int16,int32,int64 中的一种。

bounding_boxes: 是一个 shape 为 [batch, N, 4] 的三维数组,数据类型为float32,第一个batch是因为函数是处理一组图片的,N表示描述与图像相关联的N个边界框的形状,而标注框由4个数字 [y_min, x_min, y_max, x_max] 表示出来。例如:tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]]) 的 shape 为 [1,2,4] 表示一张图片中的两个标注框;tf.constant([[[ 0.  0.  1.  1.]]]) 的 shape 为 [1,1,4]表示一张图片中的一个标注框.

min_object_covered:(必选)数组类型为 float,默认为 0.1。图像的裁剪区域必须包含所提供的任意一个边界框的至少 min_object_covered 的内容。该参数的值应为非负数,当为0时,裁剪区域不必与提供的任何边界框有重叠部分。

sample_distorted_bounding_box(
    image_size
,
    bounding_boxes
,
    seed
=None,
    seed2
=None,
    min_object_covered
=None,
    aspect_ratio_range
=None,
    area_range
=None,
    max_attempts
=None,
    use_image_if_no_bounding_boxes
=None,
    name

Return:一个Tensor对象的元组(begin,size,bboxes)。

begin: 和 image_size 具有相同的类型。包含 [offset_height, offset_width, 0] 的一维数组。作为 tf.slice 的输入。

size: 和 image_size 具有相同的类型。包含 [target_height, target_width, -1] 的一维数组。作为 tf.slice 的输入。

bboxes:shape为 [1, 1, 4] 的三维矩阵,数据类型为float32,表示随机变形后的边界框。作为 tf.image.draw_bounding_boxes 的输入。

import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
#读取原始图像,获取图像的原始数据
image_raw_data = tf.gfile.FastGFile("/home/cvx/Downloads/image.jpeg", 'rb').read()

with tf.Session() as sess:
    #将图像使用jpeg的格式解码从而得到图像对应的三维矩阵,tf.image.decode_png函数对png格式的图像进行解码,
    #解码后的结果是一个tensor
    image_data = tf.image.decode_jpeg(image_raw_data)
    #print(image_data.eval())
    #plt.imshow(image_data.eval())
    #plt.show()
    #将数据的类型转化成实数,但是报错了
    #image_data = tf.image.convert_image_dtype(image_data, dtype=tf.float32)



    resized = tf.image.resize_images(image_data, [300, 300], method=3)
    #print(resized.dtype)
    #print(image_data.get_shape())

    # TensorFlow的函数处理图片后存储的数据是float32格式的,需要转换成uint8才能正确打印图片
    resized = np.asarray(resized.eval(), dtype='uint8')
    img_data = tf.image.convert_image_dtype(resized, dtype=tf.uint8)
    #plt.imshow(img_data.eval())
    #plt.show()
    encoded_image = tf.image.encode_jpeg(img_data)
    with tf.gfile.GFile("/home/cvx/Downloads/re3-image.jpeg", "wb") as f:
        f.write(encoded_image.eval())

    # 调整图像大小
    padded = tf.image.resize_image_with_crop_or_pad(image_data, 3000, 3000)
    padded = np.asarray(padded.eval(), dtype='uint8')
    padded_img_data = tf.image.convert_image_dtype(padded, dtype=tf.uint8)
    #plt.imshow(padded_img_data.eval())
    #plt.show()
    encoded_image = tf.image.encode_jpeg(padded_img_data)
    with tf.gfile.GFile("/home/cvx/Downloads/re4-image.jpeg", "wb") as f:
        f.write(encoded_image.eval())

    transposed = tf.image.transpose_image(image_data)
    #plt.imshow(transposed.eval())
    #plt.show()

    filpped = tf.image.random_flip_up_down(image_data)
    #plt.imshow(filpped.eval())
    #plt.show()

    adjusted = tf.image.random_brightness(image_data, 0.5)
    #plt.imshow(adjusted.eval())
    #plt.show()

    adjusted_constrast = tf.image.random_contrast(image_data, 0,  20)
    #plt.imshow(adjusted_constrast.eval())
    #plt.show()

    adjusted_hue = tf.image.random_hue(image_data, 0.5)
    #plt.imshow(adjusted_hue.eval())
    #plt.show()

    adjusted_saturation = tf.image.adjust_saturation(image_data, -5)
    #plt.imshow(adjusted_saturation.eval())
    #plt.show()


    adjusted_whitening = tf.image.per_image_standardization(image_data)
    #有负值,所以画图画不出来
    #plt.imshow(adjusted_whitening.eval())
    #plt.show()

    #缩小图像,让标注框更清晰
    resized_image = tf.image.resize_images(image_data, (200, 200), method=1)
    batched = tf.expand_dims(tf.image.convert_image_dtype(resized_image, tf.float32), 0)
    boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])
    result = tf.image.draw_bounding_boxes(batched, boxes)
    #resized_image_show = np.asarray(result.eval(), dtype=tf.uint8)
    result1 = tf.squeeze(result, axis=0)
    #plt.imshow(result1.eval())
    #plt.show()


    #随机截取图像上有信息含量的部分,也可以提高模型健壮性
    #此函数为图像生成单个随机变形的边界框。函数输出的是可用于裁剪原始图像的单个边框。
    #返回值为3个张量:begin,size和 bboxes。前2个张量用于 tf.slice 剪裁图像。
    #后者可以用于 tf.image.draw_bounding_boxes 函数来画出边界框。
    boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7], [0.35, 0.47, 0.5, 0.56]]])
    print(tf.shape(image_data))
    begin, size, bbox_for_draw = tf.image.sample_distorted_bounding_box(tf.shape(image_data), bounding_boxes=boxes, min_object_covered=0.1)
    batched = tf.expand_dims(tf.image.convert_image_dtype(image_data, tf.float32), 0)
    image_with_box = tf.image.draw_bounding_boxes(batched, bbox_for_draw)
    distorted_image = tf.slice(image_data, begin, size)
    plt.imshow(distorted_image.eval())
    plt.show()


你可能感兴趣的:(tf.image.sample_distorted_bounding_box(含其他对图形的操作))