Python, Pillowで画像の一部をトリミング(切り出し/切り抜き)
Pythonの画像処理ライブラリPillow(PIL)のImageモジュールに、画像の一部の領域を切り抜くメソッドcrop()が用意されている。
ここでは以下の4つの場合についてサンプルコードとともに説明する。
- 通常の切り出し
- 範囲外を指定
- 画像の中心を切り出し
- 長方形から最大サイズの正方形を切り出し
Pillow(PIL)のインストール、基本的な使い方などは以下の記事参照。
一部を切り出すのではなく全体を拡大・縮小してリサイズする場合はresize()、矩形以外の形状(円形など)で切り出して透過画像を作成する場合はputalpha()を使う。
また、OpenCVなどNumPy配列ndarrayで表された画像の切り出し(トリミング)にはスライスを使う。
PILからImageをインポートして、対象の画像を開いておく。
from PIL import Image
im = Image.open('data/src/astronaut_rect.bmp')

通常の切り出し
切り出す領域を引数box=(left, upper, right, lower)で指定する。
左上の座標が(x, y) = (left, upper)、右下の座標が(x, y) = (right, lower)に対応する。切り出されるのはleft <= x < rightかつupper <= y < lowerの領域で、x = right, y = lowerのピクセルは含まれない。
引数の括弧()を忘れやすいので注意。
im_crop = im.crop((60, 20, 400, 200))
im_crop.save('data/dst/astronaut_pillow_crop.jpg', quality=95)
トリミングした画像を他の処理に使わず保存するだけなら、一行にしてもOK。
im.crop((60, 20, 400, 200)).save('data/dst/astronaut_pillow_crop.jpg', quality=95)

範囲外を指定
切り出す領域に画像の範囲外を指定した場合、エラーにはならず黒く表示される。
im_crop_outside = im.crop((200, 150, 600, 360))
im_crop_outside.save('data/dst/astronaut_pillow_crop_outside.jpg', quality=95)

画像の中心を切り出し
画像の中心を任意のサイズでトリミングしたいという場合は、以下のような関数を作っておくと便利。
def crop_center(pil_img, crop_width, crop_height):
img_width, img_height = pil_img.size
return pil_img.crop(((img_width - crop_width) // 2,
(img_height - crop_height) // 2,
(img_width + crop_width) // 2,
(img_height + crop_height) // 2))
使ってみる。
im_new = crop_center(im, 300, 150)
im_new.save('data/dst/astronaut_pillow_crop_center.jpg', quality=95)

長方形から最大サイズの正方形を切り出し
サムネイル画像を作成する場合などに、長方形の画像からできるだけ大きいサイズの正方形をトリミングしたいことがある。
画像の中心から短辺の長さの正方形を切り出す関数を定義する。
size属性で画像の縦横のサイズを取得し、さらにmin()で短い方を取得する。上で定義した関数crop_center()を使っている。
def crop_max_square(pil_img):
return crop_center(pil_img, min(pil_img.size), min(pil_img.size))
使ってみる。
im_new = crop_max_square(im)
im_new.save('data/dst/astronaut_pillow_crop_max_square.jpg', quality=95)

Pillowを使ったサムネイル画像の生成についての詳細は以下の記事を参照。