この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部の鈴木です。
scikit-learnのextract_patches_2dを使うと、画像を小さいパッチに切り出すことができます。 どのような挙動をするのか、例が少なかったため、試してみました。
ユーザーガイドは以下にあります。
前提
検証した環境
- コンテナ:jupyter/datascience-notebook
- scikit-learn:1.0
使用する画像
以下の画像をColinkySquash.jpg
として使用しました。
やってみる
パッチの作成
まず、パッチの作成から行っていきます。
Pillowで読み込んだ画像をNumpy配列に変換し、extract_patches_2d
で(200, 200)の大きさのパッチをmax_patches
個作成します。
import numpy as np
from PIL import Image
from sklearn.feature_extraction import image
# 画像を読み込む
im = Image.open("./ColinkySquash.jpg")
# Numpy配列に変換する
im_arr = np.array(im)
# (200, 200)の大きさのパッチをmax_patches個作成する
# 大きめのサイズのパッチを作るので、max_patchesを指定した。
patches = image.extract_patches_2d(im_arr, (200, 200),
max_patches=10000,
random_state=2021)
一つ目のパッチを表示してみます。指定した大きさで、元の画像からパッチが作成されていることが分かります。
パッチから画像の復元
reconstruct_from_patches_2dでパッチから画像の復元することが可能です。
import numpy as np
from PIL import Image
from sklearn.feature_extraction import image
# 画像を読み込む
im = Image.open("./ColinkySquash.jpg")
# Numpy配列に変換する
im_arr = np.array(im)
# パッチを作成する
patches = image.extract_patches_2d(im_arr, (7, 7), random_state=2021)
# パッチから画像を復元する
reconstructed = image.reconstruct_from_patches_2d(patches, im_arr.shape)
# 復元した画像を表示する
Image.fromarray(reconstructed.astype("uint8")).show()
復元した画像は以下のようになります。
パッチを作成する際にmax_patches
を指定していると復元が上手くいかないようでした。また、reconstruct_from_patches_2d
のimage_size
は元の画像の大きさと同じ必要がありました。
パッチから画像を復元する際のユースケースは、以下の例のように、パッチごとに処理してから復元する手法の適用などがあります。
Image denoising using dictionary learning — scikit-learn 1.0.1 documentation
最後に
scikit-learnのextract_patches_2d
を使って画像から小さいパッチを作成し、reconstruct_from_patches_2d
で復元する際の方法をご紹介しました。
機械学習手法と組み合わせるようなケースもありますが、単に元画像から部分的に切り抜いた小さい画像をたくさん作りたいようなケースに便利に使えそうです。