TensorFlow進行簡單的影像處理

weixin_41874599發表於2018-12-19

TensorFlow進行簡單的影像處理

 

TensorFlow進行簡單的影像處理 簡單概述

作為計算機視覺開發者,使用TensorFlow進行簡單的影像處理是基本技能,而TensorFlow在tf.image包中支援對影像的常見的操作包括:

  • 亮度調整
  • 對比度調整
  • 飽和度調整
  • 影像取樣插值放縮
  • 色彩空間轉換
  • Gamma校正
  • 標準化

影像的讀入與顯示我們通過OpenCV來實現,這裡需要注意一點,OpenCV中影像三個通道是BGR,如果你是通過tensorflow讀取的話三個通過順序是RGB。影像讀取的程式碼如下:

1.opencv方式

  1. src = cv.imread("D:/vcprojects/images/meinv.png")

2.tensorflow方式

  1. jpg = tf.read_file("D:/vcprojects/images/yuan_test.png")
  2. img = tf.image.decode_jpeg(jpg, channels=3)

3.使用OpenCV顯示影像

  1. def show_image(image, title='input'):
  2. print("result : n", image)
  3. cv.namedWindow(title, cv.WINDOW_AUTOSIZE)
  4. cv.imshow(title, image)
  5. cv.waitKey(0)
  6. cv.destroyAllWindows()

原圖顯示如下:

1.放縮影像

支援三種方式,分別是臨界點插值、雙線性插值與雙立方插值,不過我發現在使用雙立方插值的時候,tensorflow處理之後影像總是會出現一些噪點,這個算不算它的BUG

  • tf.image.resize_nearest_neighbor # 臨界點插值
  • tf.image.resize_bilinear # 雙線性插值
  • tf.image.resize_bicubic # 雙立方插值演算法

演示程式碼如下:

  1. src = cv.imread("D:/vcprojects/images/meinv.png")
  2. cv.imshow("input", src)
  3. h, w, depth = src.shape
  4. src = np.expand_dims(src, 0)
  5. print(src.shape)
  6.  
  7. bi_image = tf.image.resize_bilinear(src, size=[h*2, w*2])
  8. bi_image = tf.squeeze(bi_image)
  9. bi_result = sess.run(bi_image)
  10. bi_result = np.uint8(bi_result)
  11. show_image(bi_result,"bilinear-zoom")

顯示影像如下:

2.影像亮度調整

影像亮度是影像基本屬性之一,tensorflow支援兩種方式API對影像亮度進行調整

  • tf.image.adjust_brightness
  • tf.image.random_brightness

使用上述API的時候需要對影像進行維度新增為四維的tensor資料,完整的影像亮度調整的程式碼如下:

  1. src = cv.imread("D:/vcprojects/images/meinv.png")
  2. src = np.expand_dims(src, 0)
  3. brightness = tf.image.adjust_brightness(src, delta=.5)
  4. brightness = tf.squeeze(brightness)
  5. result = sess.run(brightness)
  6. result = np.uint8(result)
  7. show_image(result, "brightness demo")

顯示影像如下:

3.影像對比度調整

影像對比度是影像基本屬性之一,tensorflow支援兩種方式API對影像對比度進行調整

  • tf.image.adjust_contrast
  • tf.image.random_contrast

前面一種全域性調整,後面一種方式是隨機調整,對比度調整的程式碼演示如下:

  1. src = cv.imread("D:/vcprojects/images/meinv.png")
  2. src = np.expand_dims(src, 0)
  3. contrast = tf.image.adjust_contrast(src, contrast_factor=2.2)
  4. contrast = tf.squeeze(contrast)
  5. result = sess.run(contrast)
  6. result = np.uint8(result)
  7. show_image(result, "contrast demo")

顯示影像如下:

4.影像gamma校正

伽瑪校正就是對影像的伽瑪曲線進行編輯,以對影像進行非線性色調編輯的方法,檢出影像訊號中的深色部分和淺色部分,並使兩者比例增大,從而提高影像的對比度。相關API為:

  • tf.image.adjust_gamma

常見gamma的取值範圍為0.05~5之間,tensorflow實現gamma校正的程式碼演示如下:

  1. src = cv.imread("D:/vcprojects/images/meinv.png")
  2. src = np.expand_dims(src, 0)
  3. contrast = tf.image.adjust_gamma(src, gain=1.0, gamma=4.2)
  4. contrast = tf.squeeze(contrast)
  5. result = sess.run(contrast)
  6. result = np.uint8(result)
  7. show_image(result, "gamma demo")

顯示影像如下:

5.影像飽和度調整

影像飽和度是影像HSV色彩空間最常見的指標之一,通過調整影像飽和度可以得到更加自然光澤的影像,tensorflow中飽和度調整的API如下:

  • tf.image.adjust_saturation

常見的飽和度調整範圍在0~5之間取值即可,演示程式碼如下:

  1. src = cv.imread("D:/vcprojects/images/meinv.png")
  2. contrast = tf.image.adjust_saturation(src, saturation_factor=2.2)
  3. result = sess.run(contrast)
  4. result = np.uint8(result)
  5. show_image(result, "saturation demo")

這裡要特別說明一下,飽和度調整不支援4D tensor物件,所以讀入的RGB影像即可。無需再次進行維度增加操作。最終調整之後的演示影像如下:

6.影像標準化

這個在tensorflow中對影像資料訓練之前,經常會進行此步操作,它跟歸一化是有區別的。歸一化的影像直方圖不會改變,標準化會改變影像直方圖分佈,標準化API如下:

  • tf.image.per_image_standardization

影像標準化實現程式碼如下:

  1. src = cv.imread("D:/vcprojects/images/meinv.png")
  2. contrast = tf.image.per_image_standardization(src)
  3. result = sess.run(contrast)
  4. result = np.uint8(result)
  5. show_image(result, "standardization demo")

演示結果如下:

7.影像色彩空間轉換 tensorflow支援常見影像色彩空間轉換,包括RGB、HSV、灰度色彩空間,相關API如下:

  • tf.image.rgb_ to_hsv
  • tf.image.rgb_ to_grayscale
  • tf.image.hsv_ to_rgb

將影像從RGB色彩空間轉換到灰度空間的程式碼演示如下:

  1. src = cv.imread("D:/vcprojects/images/meinv.png")
  2. gray = tf.image.rgb_to_grayscale(src)
  3. result = sess.run(gray)
  4. result = np.uint8(result)
  5. show_image(result, "gray - demo")

結果顯示如下:

相關文章