【TensorFlow2】画像を分割してみる 【メモ】

Tensorflow2で画像を4分割してみます。まぁメモです。

cifar10のデータセットを使います。

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

(x_train, _), (_, _) = tf.keras.datasets.cifar10.load_data()

x_train = x_train/ 255.
plt.imshow(x_train[0])

このコードを実行すると以下の画像が出力されます。

上の画像を分割します。

tensorflowの crop_and_resize関数を使います。

先にコードを示します。

CROP_SIZE = (16, 16)

image = tf.reshape(x_train[0],(1,32,32,3))

# 分割パターン 
boxes = np.array([
                    [0,0,0.5,0.5], # [y1,x1,y2,x2]
                    [0,0.5,0.5,1.0],
                    [0.5,0,1.0,0.5],
                    [0.5,0.5,1.0,1.0]
                    ])
box_indices = np.array([0,0,0,0])   # 0番目のデータに対して
output = tf.image.crop_and_resize(image, boxes, box_indices, CROP_SIZE)
  • boxesで画像をクロップするところの設定をしています。
    例えば最初の[0, 0, 0.5, 0.5]は左上座標(0, 0)から右下座標(0.5, 0.5)の四角形で切り抜くことを意味します。各座標の値は0〜1までの範囲です。なので、[0, 0, 1, 1]なら画像全体です。
    コメントにもありますが、[y1, x1, y2, x2]を意味します。
  • box_indicesはbatchデータの何番目かを表します。今回はbatchsizeを1にして、一枚目を4分割するだけですので、コードのようになっています。

CROP_SIZE等はわかると思うので省略します。

このコードを実行すると以下のように分割されます。

一応プロットしたコードも

fig, axs = plt.subplots(2, 2)
axs[0][0].imshow(output[0])
axs[0][1].imshow(output[1])
axs[1][0].imshow(output[2])
axs[1][1].imshow(output[3])
plt.show()

参考文献

コメント

タイトルとURLをコピーしました