TensorFlow 圖像預處理(一) 圖像編解碼,圖像尺寸調整

TensorFlow提供了幾類圖像處理函數,下面介紹圖像的編碼與解碼,圖像尺寸調整。python

編碼與解碼git

圖像解碼與編碼:一張RGB三通道的彩色圖像能夠當作一個三維矩陣,矩陣中的不位置上的數字表明圖像的像素值。而後圖像在存儲時並非直接記錄這些矩陣中的數字,而是通過了壓縮編碼。因此將一張圖像還原成一個三維矩陣的過程就是解碼的過程,反之就是編碼了。其實若是你們熟悉opencv的話,imread和imwrite就是一個解碼和編碼的過程。
TensorFlow提供了經常使用圖片格式的解碼和編碼操做,下面用一個jpg的圖像演示:算法

import matplotlib.pyplot as plt import tensorflow as tf image_raw_data = tf.gfile.FastGFile('.//image//1.jpg','rb').read() with tf.Session() as sess: img_data = tf.image.decode_jpeg(image_raw_data) print(img_data.eval()) plt.imshow(img_data.eval()) plt.show() #img_data = tf.image.convert_image_dtype(img_data,dtype = tf.float32) encoded_image = tf.image.encode_jpeg(img_data) with tf.gfile.GFile(".//image//3.jpg","wb") as f: f.write(encoded_image.eval()) 

其中:
decode_jpeg函數爲jpeg(jpg)圖片解碼的過程,對應的encode_jpeg函數爲編碼過程,編碼後將圖片重命名寫入到指定的路徑下。markdown

圖像尺寸調整
圖像尺寸調整屬於基礎的圖像幾何變換,TensorFlow提供了幾種尺寸調整的函數:
tf.image.resize_images:將原始圖像縮放成指定的圖像大小,其中的參數method(默認值爲ResizeMethod.BILINEAR)提供了四種插值算法,具體解釋能夠參考圖像幾何變換(縮放、旋轉)中的經常使用的插值算法
tf.image.resize_image_with_crop_or_pad:剪裁或填充處理,會根據原圖像的尺寸和指定的目標圖像的尺寸選擇剪裁仍是填充,若是原圖像尺寸大於目標圖像尺寸,則在中心位置剪裁,反之則用黑色像素填充。
tf.image.central_crop:比例調整,central_fraction決定了要指定的比例,取值範圍爲(0,1],該函數會以中心點做爲基準,選擇整幅圖中的指定比例的圖像做爲新的圖像。函數

import matplotlib.pyplot as plt import tensorflow as tf import numpy as np image_raw_data = tf.gfile.FastGFile('.//image//1.jpg','rb').read() with tf.Session() as sess: img_data = tf.image.decode_jpeg(image_raw_data) plt.imshow(img_data.eval()) plt.show() resized = tf.image.resize_images(img_data, [100, 100], method=0) # TensorFlow的函數處理圖片後存儲的數據是float32格式的,須要轉換成uint8才能正確打印圖片。 print("Digital type: ", resized.dtype) resized = np.asarray(resized.eval(), dtype='uint8') # tf.image.convert_image_dtype(rgb_image, tf.float32) plt.imshow(resized) plt.show() croped = tf.image.resize_image_with_crop_or_pad(img_data, 100, 100) padded = tf.image.resize_image_with_crop_or_pad(img_data, 500, 500) plt.imshow(croped.eval()) plt.show() plt.imshow(padded.eval()) plt.show() central_cropped = tf.image.central_crop(img_data, 0.5) plt.imshow(central_cropped.eval()) plt.show()

原圖:
這裏寫圖片描述ui

resize_images(img_data, [100, 100], method=0):
這裏寫圖片描述編碼

resize_image_with_crop_or_pad(img_data, 100, 100):
這裏寫圖片描述spa

resize_image_with_crop_or_pad(img_data, 500, 500):
這裏寫圖片描述.net

central_crop(img_data, 0.5):
這裏寫圖片描述

 

另外能夠看 http://www.360doc.com/content/17/0513/14/10408243_653519828.shtml

tensorflow裏面提供了實現圖像進行裁剪和填充的函數,就是tf.image.resize_image_with_crop_or_pad(img,height,width )。img表示須要改變的圖像,height是改變後圖像的高度,width是寬度。

例如:

[python] view plain copy
  1. import matplotlib.pyplot as plt;  
  2. import tensorflow as tf;  
  3.   
  4. image_raw_data_jpg = tf.gfile.FastGFile('11.jpg', 'r').read()  
  5.   
  6. with tf.Session() as sess:  
  7.     img_data_jpg = tf.image.decode_jpeg(image_raw_data_jpg)  
  8.     img_data_jpg = tf.image.convert_image_dtype(img_data_jpg, dtype=tf.float32)  
  9.     crop = tf.image.resize_image_with_crop_or_pad(img_data_jpg, 500, 500)  
  10.     pad = tf.image.resize_image_with_crop_or_pad(img_data_jpg, 2000, 2000)  
  11.   
  12.     plt.figure(1)  
  13.     plt.imshow(crop.eval())  
  14.     plt.figure(2)  
  15.     plt.imshow(pad.eval())  
  16.     plt.show()  

結果:

相關文章
相關標籤/搜索