色空間変換

TensorFlow.orgで表示 Google Colab で実行 GitHub でソースを表示{ ノートブックをダウンロード/a0}

概要

コンピュータビジョンでは、選択した色空間がモデルの性能を大きく左右することがあります。最も一般的な色空間はRGBですが、多くの場合はYUVYCbCrXYZ (CIE)などの他の色空間に切り替えると、モデルの性能が向上します。

tensorflow-ioパッケージは、画像データの準備や拡張に使用できる色空間変換 API のリストを提供しています。

セットアップ

必要なパッケージをインストールし、ランタイムを再起動する

pip install -q tensorflow-io

サンプル画像をダウンロードする

このチュートリアルで使用する画像例は雪の中の猫ですが、任意の JPEG 画像で置き換えても構いません。

以下のように画像をダウンロードし、sample.jpgとしてローカルディスクに保存します。

curl -o sample.jpg -L https://storage.googleapis.com/download.tensorflow.org/example_images/320px-Felis_catus-cat_on_snow.jpg

ls -ls sample.jpg
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17858  100 17858    0     0  93497      0 --:--:-- --:--:-- --:--:-- 93497
20 -rw-rw-r-- 1 kbuilder kokoro 17858 Feb 13 02:54 sample.jpg

使い方

画像ファイルを読み込む

画像を読み取り、形状が(213, 320, 3)uint8テンソルにデコードします。

import tensorflow as tf
import tensorflow_io as tfio

image = tf.image.decode_jpeg(tf.io.read_file('sample.jpg'))

print(image.shape, image.dtype)
(213, 320, 3) <dtype: 'uint8'>

画像は以下の方法で表示できます。

import matplotlib.pyplot as plt

plt.figure()
plt.imshow(image)
plt.axis('off')
plt.show()

png

RGB からグレースケールに変換する

tfio.experimental.color.rgb_to_grayscaleを使用してRGB画像をGrayscaleに変換し、チャンネル数を 3 から 1 に減らすことができます。

grayscale = tfio.experimental.color.rgb_to_grayscale(image)

print(grayscale.shape, grayscale.dtype)

# use tf.squeeze to remove last channel for plt.imshow to display:
plt.figure()
plt.imshow(tf.squeeze(grayscale, axis=-1), cmap='gray')
plt.axis('off')
plt.show()
(213, 320, 1) <dtype: 'uint8'>

png

RGB から BGR に変換する

画像ソフトやカメラのメーカーによってはBGRを好む場合がありますが、tfio.experimental.color.rgb_to_bgrを使用して BGR に変換することができます。

bgr = tfio.experimental.color.rgb_to_bgr(image)

print(bgr.shape, bgr.dtype)

plt.figure()
plt.imshow(bgr)
plt.axis('off')
plt.show()
(213, 320, 3) <dtype: 'uint8'>

png

RGB から CIE XYZ に変換する

CIE XYZ(または CIE 1931 XYZ)は、多くの画像処理プログラムで使用されている一般的な色空間です。以下ではtfio.experimental.color.rgb_to__xyzを使用して、RGB からCIE XYZに変換しています。tfio.experimental.color.rgb_to_xyz[0, 1]の範囲の浮動小数点入力を想定しているため、追加の前処理が必要なので注意してください。

# convert to float32
image_float32 = tf.cast(image, tf.float32) / 255.0

xyz_float32 = tfio.experimental.color.rgb_to_xyz(image_float32)

# convert back uint8
xyz = tf.cast(xyz_float32 * 255.0, tf.uint8)

print(xyz.shape, xyz.dtype)

plt.figure()
plt.imshow(xyz)
plt.axis('off')
plt.show()
(213, 320, 3) <dtype: 'uint8'>

png

RGB から YCbCr に変換する

最後に、多くのビデオシステムではYCbCrがデフォルトの色空間です。YCbCrへの変換は、tfio.experimental.color.rgb_to_ycbcrを使用して行います。

ycbcr = tfio.experimental.color.rgb_to_ycbcr(image)

print(ycbcr.shape, ycbcr.dtype)

plt.figure()
plt.imshow(ycbcr, cmap='gray')
plt.axis('off')
plt.show()
(213, 320, 3) <dtype: 'uint8'>

png

さらに面白いことに、YCbCrは各成分が知覚的に意味のある情報を持つY'(ルマ)、Cb(青色差クロマ)、Cr(赤色差クロマ)という成分に分解することができます。

y, cb, cr = ycbcr[:,:,0], ycbcr[:,:,1], ycbcr[:,:,2]

# Y' component
plt.figure()
plt.imshow(y, cmap='gray')
plt.axis('off')
plt.show()

# Cb component
plt.figure()
plt.imshow(cb, cmap='gray')
plt.axis('off')
plt.show()

# Cr component
plt.figure()
plt.imshow(cr, cmap='gray')
plt.axis('off')
plt.show()

png

png

png