TensorFlow圖像處理API


TensorFlow提供了一些常用的圖像處理接口,可以讓我們方便的對圖像數據進行操作,以下首先給出一段顯示原始圖片的代碼,然后在此基礎上,實踐TensorFlow的不同API。

顯示原始圖片

1 import matplotlib.pyplot as plt
2 import tensorflow as tf
3 
4 raw_data = tf.gfile.FastGFile('./new.jpg','rb').read()
5 
6 with tf.Session() as sess:
7      img_data = tf.image.decode_jpeg(raw_data)
8      plt.imshow(img_data.eval())
9      plt.show()

 

運行效果如下圖:

其中tf.gfile.FastGFile,用於讀取本地文件,tf.image.decode_jpeg用於將jpeg圖片原始數據解碼到3-D張量空間,即width, height, channel,最后調用pyplt庫顯示圖片。

圖像的縮放

 1 import matplotlib.pyplot as plt
 2 import tensorflow as tf
 3 
 4 raw_data = tf.gfile.FastGFile('./new.jpg','rb').read()
 5 
 6 with tf.Session() as sess:
 7      img_data = tf.image.decode_jpeg(raw_data)
 8      img_data2 = tf.cast(tf.image.resize_images(img_data, [200, 200]), dtype=tf.uint8);
 9      plt.imshow(img_data2.eval())
10      plt.show()

TensorFlow縮放圖片的接口是tf.image.resize_images,[200, 200]是縮放后的目標尺寸,這里調用了tf.cast這個類型轉換函數,因為經過縮放處理后,張量類型為float32,而pyplt對圖像格式要求uint8,所以必須轉一下,否則什么效果,可以自己試一下。

 

tf.image.resize_images接口可以指定不同的縮放算法,比如:

tf.image.resize_images(img_data, [200, 200], method=tf.image.ResizeMethod.BICUBIC)

圖像的反轉

圖像的反轉在各路深度學習算法中就用的比較多了,主要是通過這種操作可以擴大樣本的數量,何樂不為。

 1 import matplotlib.pyplot as plt
 2 import tensorflow as tf
 3 
 4 raw_data = tf.gfile.FastGFile('./new.jpg','rb').read()
 5 
 6 with tf.Session() as sess:
 7      img_data = tf.image.decode_jpeg(raw_data)
 8      img_data2 = tf.cast(tf.image.flip_left_right(img_data), dtype=tf.uint8)
 9      plt.imshow(img_data2.eval())
10      plt.show()

上述代碼調用了左右反轉接口,TensorFlow還提供了上下反轉及隨機反轉的操作,不再一一嘗試。

圖像的裁剪

中心裁剪

 1 import matplotlib.pyplot as plt
 2 import tensorflow as tf
 3 
 4 raw_data = tf.gfile.FastGFile('./new.jpg','rb').read()
 5 
 6 with tf.Session() as sess:
 7      img_data = tf.image.decode_jpeg(raw_data)
 8      img_data2 = tf.cast(tf.image.resize_image_with_crop_or_pad(img_data, 200, 200), dtype=tf.uint8)
 9      plt.imshow(img_data2.eval())
10      plt.show()
tf.image.resize_image_with_crop_or_pad函數可以用來進行圖像裁剪或擴展,這個是由用戶的目標寬度和高度決定的,另外無論是裁剪還是擴展都是從圖片中心為基准的。

 指定位置裁剪

 1 import matplotlib.pyplot as plt
 2 import tensorflow as tf
 3 
 4 raw_data = tf.gfile.FastGFile('./new.jpg','rb').read()
 5 
 6 with tf.Session() as sess:
 7      img_data = tf.image.decode_jpeg(raw_data)
 8      img_data2 = tf.cast(tf.image.crop_to_bounding_box(img_data, 0, 0, 200, 200), dtype=tf.uint8)
 9      plt.imshow(img_data2.eval())
10      plt.show()
11 
12 ~

上述代碼指定左上角的200px方形box進行裁剪,指定目標范圍必須合理,否則會產生異常。

 圖像上畫框

 1 import matplotlib.pyplot as plt
 2 import tensorflow as tf
 3 
 4 raw_data = tf.gfile.FastGFile('./new.jpg','rb').read()
 5 
 6 with tf.Session() as sess:
 7      img_data = tf.cast(tf.expand_dims(tf.image.decode_jpeg(raw_data), 0), tf.float32)
 8      boxes = tf.constant([[[0.4, 0.4, 0.5, 0.5], [0.5, 0.5, 0.6, 0.6]]])
 9      img_data2 = tf.cast(tf.image.draw_bounding_boxes(img_data, boxes), dtype=tf.uint8)
10      plt.imshow(img_data2.eval()[0])
11      plt.show()

這段代碼有幾個地方要注意一下,在jpeg解碼后,調用了tf.expand_dims,這個函數的意思是在指定的位置增加一個維度,因為解碼后是3維數據,在0位置增加一維,事實上增加了一個batch維度,如此操作主要是為了迎合后面的畫框函數!boxes操作節點定義了兩個方框,用0~1的浮點數標識box的位置比例,最后的圖片顯示位置也要注意,輸出是四維,請取出第一個圖片顯示。下圖為顯示效果,手工放大圖片后的效果,否則,1px方框在plt中可能被縮略掉,請注意!

 

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM