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


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

編碼與解碼

圖像解碼與編碼:一張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函數為編碼過程,編碼后將圖片重命名寫入到指定的路徑下。

圖像尺寸調整
圖像尺寸調整屬於基礎的圖像幾何變換,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()

原圖:
這里寫圖片描述

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

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

resize_image_with_crop_or_pad(img_data, 500, 500):
這里寫圖片描述

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()  

結果:


免責聲明!

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



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