Posted on

TensorFlow的圖像操作功能筆記

為什麼要盡量使用Tensorflow的圖像操作功能

因為Tensorflow對GPU的支援度高,盡量完全使用Tensorflow內建的圖像操作功能對圖像做操作,可以避免資料在GPU和CPU之間轉換。

將資料集轉為dataset

可以使用 TensorFlow 的 tf.data.Dataset API 將訓練圖像和標籤轉換為數據集。

首先,需要將訓練圖像和標籤轉換為 TensorFlow 張量:

import tensorflow as tf

# Convert training images to tensors
train_images_tensor = tf.convert_to_tensor(train_images, dtype=tf.float32)

# Convert training labels to tensors
train_labels_tensor = tf.convert_to_tensor(train_labels, dtype=tf.int64)

然後,使用 tf.data.Dataset.from_tensor_slices 方法將張量轉換為數據集:

# Create a dataset from tensors
dataset = tf.data.Dataset.from_tensor_slices((train_images_tensor, train_labels_tensor))

使用 tf.data.Dataset 中的方法對數據集進行轉換和操作,例如混淆、重新排列和批次化。例如,要將數據集混淆並分成小批次

# Shuffle and batch the dataset
dataset = dataset.shuffle(buffer_size=1024).batch(32)

將BGR的tensor物件轉為灰階

可以使用rgb_to_grayscale將 BGR 格式的圖片轉換為灰階:

import tensorflow as tf

# 讀取圖片並解碼為張量
image = tf.image.decode_jpeg(image_data)

# 將圖片轉換為灰階
image = tf.image.rgb_to_grayscale(image)

# 將圖片的數據型別轉換為浮點數
image = tf.image.convert_image_dtype(image, tf.float32)

在 TensorFlow 中,通常會將圖片的數據型別轉換為浮點數,因為浮點數能夠提供更大的精度和更多的值域。浮點數通常用於訓練模型和進行數值運算。

例如,在進行影像辨識任務時,您可能會將圖片的像素值轉換為浮點數,以便模型能夠更好地學習圖片中的特徵。同樣地,在進行數值運算時,浮點數也能夠提供更高的精度,以便得到更精確的結果。

注意:不同的數據型別有不同的值域和精度,因此在選擇數據型別時,需要考慮您的應用程序的需求

將灰階圖片轉成黑白

使用以下方法將灰階圖片轉換為黑白圖片(類似 OpenCV 的 threshold):

import tensorflow as tf

# 讀取圖片並轉換為灰階
image = tf.image.rgb_to_grayscale(image)

# 設定閾值並將圖片轉換為黑白圖片
threshold = 128
image = tf.cast(image > threshold, tf.float32)

我們先設定閾值(在這裡設為 128),然後將圖片中的像素值與閾值進行比較。如果像素值大於閾值,則轉換為 1(黑色);否則轉換為 0(白色)。

載入圖片

使用 tf.io.read_file 函數讀取 JPEG 圖片,然後使用 tf.image.decode_jpeg 函數解碼圖片。接著,使用 tf.image.convert_image_dtype 函數將圖片轉換為 GPU 可處理的格式(通常是浮點數)。

import tensorflow as tf

# 讀取 JPEG 圖片
image_raw = tf.io.read_file(image_path)
image = tf.image.decode_jpeg(image_raw)

# 將圖片轉換為 GPU 可處理的格式
image = tf.image.convert_image_dtype(image, tf.float32)

縮小圖片

import tensorflow as tf

# 縮小圖片
image = tf.image.resize(image, (128, 128))

圖片改為灰階

import tensorflow as tf

# 轉換為灰階
image = tf.image.rgb_to_grayscale(image)