機械学習用の画像データを増やすために、画像から正方形領域を切り出す際に、切り出す領域をスライドさせながら一枚の画像から複数の画像を作成しました。そのコードを記録します。
# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定
import numpy as np
import matplotlib.pyplot as plt
from dataset.imgnet import load_imgnet
from PIL import Image, ImageDraw, ImageFilter
import pickle
import glob
import math
thumb_width = 100
#全画像のファイル名を取得
melons = glob.glob('melon/*.jpg')
for key, value in enumerate(melons):
print(value)
im = Image.open(value)
tmpAry = np.asarray(im)
print(tmpAry.shape)
if tmpAry.ndim < 3:
continue
if not tmpAry.shape[2] == 3 :
continue
stepSize = math.floor(5*(im.height/100))
i = 0
while max(im.size) - min(im.size) -stepSize * i >= 0:
if im.width > im.height:
im_thumb = im.crop((stepSize * i, 0, stepSize * i + im.height, im.height))
else:
im_thumb = im.crop((0, stepSize * i, im.width, stepSize * i + im.width))
im_thumb = im_thumb.resize((thumb_width, thumb_width), Image.LANCZOS)
#plt.imshow(im_thumb)
#plt.show()
im_thumb.save('melon100new/' + 'melon' + str(key) + '-' + str(i) + '.jpg', quality=95)
i = i + 1
画像で RGB 3枚のデータが揃っていないものははじいています。仕上がりは 100×100 pixel です。その最後の仕上がりにおいて、5 pixel ずれるように、元の画像でのステップ(stepSize)を決めます。im.height から計算していますが、横に長い画像とも限らないので、縦横のうち短い方と書くべきでした。縦に長い場合と横に長い場合で場合分けをしました。
取れる限り切り取るという方針で書いていますので、当然ターゲットが入っていない画像も出てきます。