TensorFlow做图片的预处理

今天我们来一起学习一下如何用TensorFlow来处理图片,其实这个也很简单,主要就是做图片旋转,亮度色彩对比度的调整,还有就是裁剪等一系列处理。首先我们导入要用的Python库:

import tensorflow as tf
import matplotlib.pyplot as plt

我们用的是一张喵的图片,原图如下:
cat原图
我们首先来读取图片:

image_cat_data = tf.gfile.FastGFile("Desktop/images/cat.jpg",'rb').read()

这里需要解释一下,这里的’rb’表示非utf-8编码,’r’表示的是utf-8编码。我们用TensorFlow对图片进行解码:

with tf.Session() as sess:
    img_data = tf.image.decode_jpeg(image_cat_data)
    print(img_data.eval())
    #使用pyplot工具可视化得到的图像
    plt.imshow(img_data.eval())
    plt.show()

我们可以得到图片解码之后的结果:

[[[118 106  94]
  [118 106  94]
  [118 106  94]
  ...
  [123 125 112]
  [123 125 112]
  [122 124 111]]

 [[116 104  92]
  [115 103  91]
  [115 103  91]
  ...
  [123 125 112]
  [122 124 111]
  [121 123 110]]

 [[113 101  89]
  [112 100  88]
  [112 100  88]
  ...
  [122 124 111]
  [121 123 110]
  [120 122 109]]

 ...

 [[166 148 112]
  [166 148 112]
  [166 148 112]
  ...
  [109  80  50]
  [109  80  50]
  [109  80  50]]

 [[166 148 112]
  [166 148 112]
  [166 148 112]
  ...
  [109  80  50]
  [109  80  50]
  [109  80  50]]

 [[166 148 112]
  [166 148 112]
  [166 148 112]
  ...
  [109  80  50]
  [109  80  50]
  [109  80  50]]]

我们还可以看到读取出来的图片:
cat1
下面我们可以对图片进行如下的一些处理:

1.调整图片的大小

当我们先要对图片进行大小操作的时候,可以用到如下代码,举个栗子,我把图片调整成300*300的:

with tf.Session() as sess:
    #将数据类型转化成实数,方便后面处理
    img_data = tf.image.convert_image_dtype(img_data, dtype = tf.float32)
    #通过tf.image.resize_images调整图像大小,method是调整的算法,0:双线性差值 1:最近邻算法 2:双三次插值法 3:面积差值法
    resized = tf.image.resize_images(img_data, [300, 300], method = 0)
    print(resized.get_shape())
    plt.imshow(resized.eval())
    plt.show()

resize_images()方法就是调整图片大小的,调整完成之后的图片我们可以得到:
cat1
这就相当于将图片等比例缩放了。

2.截取部分图像

当我们要截取图片的时候我们可以用到resize_image_with_crop_or_pad()这个方法,截取的时候是从图片中间截取,如果截取的范围大于图片,那么就将多余的地方填0补齐。
代码如下:

croped=tf.image.resize_image_with_crop_or_pad(img_data,800,800)
with tf.Session() as sess:
    plt.imshow(croped.eval())
    plt.show()

我截取了800*800的部分图片,得到的结果如下所示:
cat2
我们可以看到图片截取了原图中间800*800的部分,恩,这个图片,很皮,略略略。。。

3.按照比例裁剪图片

我们也可以用central_crop()方法来按照小于1的比例来裁剪图片,举个例子,我按照原图的0.3倍来裁剪,代码如下:

central_croped = tf.image.central_crop(img_data, 0.3)
with tf.Session() as sess:
    plt.imshow(central_croped.eval())
    plt.show()

可以得到图片:
cat3
恩,这个图片,也很皮。

4.图片的翻转

图片的翻转是很常见的处理,左右,上下,对角线都可以进行翻转处理,代码如下:

flipped=tf.image.flip_up_down(img_data)
#将图像左右翻转
#flipped=tf.image.random_flip_left_right(img_data)
#将图像沿对角线翻转
#transposed=tf.image.transpose_image(img_data)
#将图像随机进行翻转
#flipped=tf.image.random_flip_left_right(img_data)
#将图像左右任意翻转
#flipped=tf.image.random_flip_up_down(img_data)
#将图像任意上下翻转
with tf.Session() as sess:
    plt.imshow(flipped.eval())
    plt.show()

我们这里是对图片进行上下翻转的结果:
cat4
恩,这回喵好像方向对了。

5.图像的色彩处理

对于图像色彩的处理是有很多方法的,我们来看看色彩相关处理的代码:

#将图像的亮度-0.5
#adjusted=tf.image.adjust_brightness(img_data,-0.5)
#在[-max_delta,max_delta]内随机调整图像的亮度
#adjusted=tf.image.random_brightness(img_data,0.5)
#图像的对比度-5
#adjusted=tf.image.adjust_contrast(img_data,-1)
#在[lower,upper]范围内随机调整图的对比度
#adjusted=tf.image.random_contrast(img_data,2,7)
#调整图像的色相
#adjusted=tf.image.adjust_hue(img_data,0.5)
#在[-maxdelta,maxdelta]范围内随机调整图像的色相maxdelat在0-0.5的范围内
#adjusted=tf.image.random_hue(img_data,0.4)
#调整图像的饱和度
#adjusted=tf.image.adjust_saturation(img_data,10)
#在[lower,upper]范围内随机调整图像的饱和度
#adjusted=tf.image.random_saturation(img_data,1,10)
#tensorflow还提供了图像的标准化过程,将图像的数字均值变为0,方差变为1
adjusted=tf.image.per_image_standardization(img_data)
#许多的图像需要关注的物体可以使用标注框标注出来
with tf.Session() as sess:
    plt.imshow(adjusted.eval())
    plt.show()

这里的例子是将图片标准化处理之后的结果:
cat6
这回可以看大喵颜色很深。

6.在图像中加入标注框

除了以上的一些处理以外,TensorFlow还可以对图像做加入标注框处理,我们先来看代码:

img_data=tf.image.resize_images(img_data,[180,260],method=1)
batched=tf.expand_dims(img_data,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)
with tf.Session() as sess:
    plt.imshow(result[0].eval())
    plt.show()

首先在第一行里面的expand_dims表示在image_data这个矩阵的前面添加维度,第二个参数0表示添加维度的位置,然后就是下面的boxes就是标注框的相对位置,draw_bounding_boxes表示在前面的图片的boxes位置添加标注框,这里还有一个细节就是这个函数tf.image.draw_bounding_boxes的第一个参数是一个四维数据,第一维是第几张图片,第2维表示图片的row,第三维表示col,第四维表示图片的通道(一般为RGB3通道),所以,上面的result[0]表示显示第一个图片,我们就可以得到一张有标注框的图片:
cat7

上面这些就是我们可以用TensorFlow对图片进行的基本处理,希望能对大家有所帮助,因为本人能力有限,如有纰漏,请各位朋友指正,不吝指教,如有转载,请标明出处,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值