tensorflow中的image预处理操作函数
TensorFlow中有着一个image
模块专门用于处理图片数据的预处理,里面定义了若干常见的图像预处理函数,让我们列举出来,介绍一下,API地为 tf.image.
tf.image.adjust_brightness(images, delta)
:用于改变原图像的明亮度,也就是在原图像的基础上加上一个delta
,于是我们有new_image = old_image+delta
。tf.image.adjust_contrast(images,contrast_factor)
:改变原图片的对比度,公式为, 其中的x
为原输入,mean
为每个通道的均值。tf.image.adjust_jpeg_quality(images, jpeg_quality)
:改变原jpeg图像的编码质量(不是很懂什么叫做编码质量,望指正),其中的jpeg_quality
需在[0,100]这个区间内。tf.image.adjust_gamma
:伽马矫正,tf.image.adjust_hue(image,delta)
:改变原图像的色彩(hue),本函数将原RGB图像转换到HSV空间后,在hue通道上加上delta
后,再转换回RGB空间。tf.image.adjust_saturation(images,saturation_factor)
:类似于改变色彩的函数,这个函数改变的是饱和度。tf.image.central_crop(images,central_fraction)
:对图像进行中心修剪,也就是按照一定比例保留中间的像素,去除中心之外的像素,注意输出图像和输入图像的尺寸是一样的,也就是说中心之外的像素置位了而已。其中central_fraction
在[0,1]区间,表示的是中心保留的比例。tf.image.convert_image_dtype(image,dtype,saturate=False)
:改变图片的数据类型,其中dtype
是目标数据类型,注意到这个转换不是单纯的数据类型转换,他会将浮点类型的图片归一化到[0,1]之间,整型的数据类型归一化到[0,MAX]之间,这里的MAX指的是不同整型数据类型能够表达的最大正数。注意到在浮点型转换到整型的过程中可能会出现上溢或者下溢的问题,如果指定了saturate=True
将可以避免这个问题,它会在数据类型转换之前截断输入的值,比如输入是1.02,那么就会截为1.0tf.image.decode_bmp
,tf.image.decode_gif
,tf.image.decode_jpeg
,tf.image.encode_png
,这些都是图片解码函数,传入图片的地址,解码出图片。可以用更为同一的接口tf.image.decode_image
代替,它会自动判断图片的格式并且解码。
Images
编码和解码函数
TensorFlow提供了一些操作用于编码和解码JPEG,PNG格式的图片。编码后的图像用一个标量字符串张量(Scalar String Tensor,我觉得就是一个图片的地址吧)表示,解码后的图像用一个3D的uint8类型的张量表示,尺寸为[height,width,channels]
。(PNG也可以支持uint16的数据类型)。
这些编解码操作在一个时刻只能应用于一张图片,他们的输入和输出都是可变长的,如果你需要固定尺寸的图片,那么就对输出结果进行裁剪或者resize吧。相关函数有:
tf.image.decode_bmp
tf.image.decode_gif
tf.image.decode_jpeg
tf.image.encode_jpeg
tf.image.decode_png
tf.image.encode_png
tf.image.decode_image
resize操作
resize操作用于将输入图像重新缩放或者放大到固定的尺寸,通常是在数据类型tf.float32情况下应用的。有个简便的函数tf.image.resize_images
同时支持了4D和3D的张量作为输入并且输出。4D的张量指的是包括了batch,3D张量就仅仅是一张图片。其他的resize操作仅仅支持4D张量作为输入,如:
tf.image.resize_area
tf.image.resize_bicubic
(双立方插值)tf.image.resize_bilinear
(双线性插值)tf.image.resize_nearest_neighbor
(最近邻插值)
裁剪Crop
有些场景中需要对原输入图像进行裁剪,可能是随机裁剪,也可是中心对齐裁剪,TF提供了一系列的裁剪函数:
tf.image.resize_image_with_crop_or_pad
tf.image.central_crop
tf.image.pad_to_bounding_box
tf.image.crop_to_bounding_box
tf.image.extract_glimpse
tf.image.crop_and_resize
翻转,旋转和转置操作
有些时候采取这些操作有利于数据的增广,增大训练集。这些函数输入都是4D张量。
tf.image.flip_up_down
(向下翻转)tf.image.random_flip_up_down
(随机上下翻转)tf.image.flip_left_right
(向左右翻转)tf.image.random_flip_left_right
(随机左右翻转)tf.image.transpose_image
(图像转置,调换width
和height
轴)tf.image.rot90
(顺时针方向旋转90°)
颜色空间变换
提供了RGB颜色空间到HSV颜色空间的转换函数,必须在float32的数据类型下进行,可以考虑用tf.image.convert_image_dtype
对整型输入进行转换。
tf.image.rgb_to_grayscale
(RGB到灰度图)tf.image.grayscale_to_rgb
(灰度图到RGB,注意,并不是伪彩色,而是单纯复制了三个通道而已)tf.image.hsv_to_rgb
(HSV到RGB)tf.image.rgb_to_hsv
(RGB到HSV)tf.image.convert_image_dtype
(转换图片的数据类型)
图片调整
TF提供了一系列的函数用于调整图片的基本参数,如:明亮度,对比度,色彩,饱和度等。每个操作都需要在预先定义好的参数,或者随机的参数(从一个预定义的区间中随机取)中完成,随机调整有利于在训练集中提高泛化性能。
tf.image.adjust_brightness
(调整明亮度)tf.image.random_brightness
(随机明亮度)tf.image.adjust_contrast
(调整对比度)tf.image.random_contrast
(随机对比度)tf.image.adjust_hue
(调整色彩)tf.image.random_hue
(随机色彩)tf.image.adjust_gamma
(gamma矫正)tf.image.adjust_saturation
(调整饱和度)tf.image.random_saturation
(随机饱和度)tf.image.per_image_standardization
(图片标准化,零均值单位方差)
bounding box相关
tf.image.draw_bounding_boxes
(绘制bounding box)tf.image.non_max_suppression
(非极大抑制)tf.image.sample_distorted_bounding_box
解噪
tf.image.total_variation
(计算图片总方差)