このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorFlowアドオン画像:操作

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

概観

このノートブックでは、TensorFlowアドオンでいくつかの画像操作を使用する方法を示します。

この例で扱う画像操作のリストを次に示します。

セットアップ

pip install -q -U tensorflow-addons
import tensorflow as tf
import numpy as np
import tensorflow_addons as tfa
import matplotlib.pyplot as plt

画像の準備と検査

画像をダウンロード

img_path = tf.keras.utils.get_file('tensorflow.png','https://tensorflow.org/images/tf_logo.png')
Downloading data from https://tensorflow.org/images/tf_logo.png
40960/39781 [==============================] - 0s 2us/step

画像を検査する

TensorFlowアイコン

img_raw = tf.io.read_file(img_path)
img = tf.io.decode_image(img_raw)
img = tf.image.convert_image_dtype(img, tf.float32)
img = tf.image.resize(img, [500,500])

plt.title("TensorFlow Logo with shape {}".format(img.shape))
_ = plt.imshow(img)

png

白黒バージョンを作る

bw_img = 1.0 - tf.image.rgb_to_grayscale(img)

plt.title("Mask image with shape {}".format(bw_img.shape))
_ = plt.imshow(bw_img[...,0], cmap='gray')

png

tfa.imageで遊ぶ

平均フィルタリング

平均フィルタリングは、画像または信号からノイズを除去するためによく使用されるフィルタリング手法です。アイデアは、画像をピクセルごとに実行し、隣接するピクセルの平均値で置き換えることです。

mean = tfa.image.mean_filter2d(img, filter_shape=11)
_ = plt.imshow(mean)

png

回転

この操作は、ユーザーが入力した角度(ラジアン)で特定の画像を回転させます。

rotate = tfa.image.rotate(img, tf.constant(np.pi/8))
_ = plt.imshow(rotate)

png

変身

この操作は、ユーザーが指定した変換ベクトルに基づいて、指定された画像を変換します。

transform = tfa.image.transform(img, [1.0, 1.0, -250, 0.0, 1.0, 0.0, 0.0, 0.0])
_ = plt.imshow(transform)

png

YIQのランダムHSV

この操作は、指定されたRGB画像のカラースケールをYIQに変更しますが、ここでは、デルタ色相と彩度の値が、指定された範囲からランダムに選択されます。

delta = 0.5
lower_saturation = 0.1
upper_saturation = 0.9
lower_value = 0.2
upper_value = 0.8
rand_hsvinyiq = tfa.image.random_hsv_in_yiq(img, delta, lower_saturation, upper_saturation, lower_value, upper_value)
_ = plt.imshow(rand_hsvinyiq)
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow_addons/utils/resource_loader.py:103: UserWarning: You are currently using TensorFlow 2.3.0 and trying to load a custom op (custom_ops/image/_distort_image_ops.so).
TensorFlow Addons has compiled its custom ops against TensorFlow 2.2.0, and there are no compatibility guarantees between the two versions. 
This means that you might get segfaults when loading the custom op, or other kind of low-level errors.
 If you do, do not file an issue on Github. This is a known limitation.

It might help you to fallback to pure Python ops with TF_ADDONS_PY_OPS . To do that, see https://github.com/tensorflow/addons#gpucpu-custom-ops 

You can also change the TensorFlow version installed on your system. You would need a TensorFlow version equal to or above 2.2.0 and strictly below 2.3.0.
 Note that nightly versions of TensorFlow, as well as non-pip TensorFlow like `conda install tensorflow` or compiled from source are not supported.

The last solution is to find the TensorFlow Addons version that has custom ops compatible with the TensorFlow installed on your system. To do that, refer to the readme: https://github.com/tensorflow/addons
  UserWarning,

png

YIQでHSVを調整する

この操作は、指定されたRGB画像のカラースケールをYIQに変更しますが、ここではランダムに選択するのではなく、デルタ色相と彩度の値をユーザーから入力します。

delta = 0.5
saturation = 0.3
value = 0.6
adj_hsvinyiq = tfa.image.adjust_hsv_in_yiq(img, delta, saturation, value)
_ = plt.imshow(adj_hsvinyiq)

png

高密度画像ワープ

この操作は、オフセットベクトルのフローフィールド(ここでは、たとえばランダムな値を使用)で指定された画像の非線形ワープのためのものです。

input_img = tf.image.convert_image_dtype(tf.expand_dims(img, 0), tf.dtypes.float32)

flow_shape = [1, input_img.shape[1], input_img.shape[2], 2]
init_flows = np.float32(np.random.normal(size=flow_shape) * 2.0)
dense_img_warp = tfa.image.dense_image_warp(input_img, init_flows)
dense_img_warp = tf.squeeze(dense_img_warp, 0)
_ = plt.imshow(dense_img_warp)

png

ユークリッド距離変換

この操作は、前景ピクセルから背景ピクセルまでのユークリッド距離でピクセル値を更新します。

  • 注:バイナリイメージのみを受け取り、変換されたイメージになります。別の画像が指定された場合、単一の値を持つ画像になります
gray = tf.image.convert_image_dtype(bw_img,tf.uint8)
# The op expects a batch of images, so add a batch dimension
gray = tf.expand_dims(gray, 0)
eucid = tfa.image.euclidean_dist_transform(gray)
eucid = tf.squeeze(eucid, (0, -1))
_ = plt.imshow(eucid, cmap='gray')

png