今天我们来一起学习一下如何用TensorFlow来处理图片,其实这个也很简单,主要就是做图片旋转,亮度色彩对比度的调整,还有就是裁剪等一系列处理。首先我们导入要用的Python库:
import tensorflow as tf
import matplotlib.pyplot as plt
我们用的是一张喵的图片,原图如下:
我们首先来读取图片:
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]]]
我们还可以看到读取出来的图片:
下面我们可以对图片进行如下的一些处理:
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()方法就是调整图片大小的,调整完成之后的图片我们可以得到:
这就相当于将图片等比例缩放了。
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的部分图片,得到的结果如下所示:
我们可以看到图片截取了原图中间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()
可以得到图片:
恩,这个图片,也很皮。
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()
我们这里是对图片进行上下翻转的结果:
恩,这回喵好像方向对了。
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()
这里的例子是将图片标准化处理之后的结果:
这回可以看大喵颜色很深。
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]表示显示第一个图片,我们就可以得到一张有标注框的图片:
上面这些就是我们可以用TensorFlow对图片进行的基本处理,希望能对大家有所帮助,因为本人能力有限,如有纰漏,请各位朋友指正,不吝指教,如有转载,请标明出处,谢谢。