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()
コメント