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,因此必須轉一下,不然什麼效果,能夠本身試一下。ui
tf.image.resize_images接口能夠指定不一樣的縮放算法,好比:spa
tf.image.resize_images(img_data, [200, 200], method=tf.image.ResizeMethod.BICUBIC)code
圖像的反轉在各路深度學習算法中就用的比較多了,主要是經過這種操做能夠擴大樣本的數量,何樂不爲。blog
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中可能被縮略掉,請注意!ip