Pillowで画像(画像データ)を拡大/縮小するには、Imageクラスのresizeメソッドを用います。
構文
Image.resize(size, resample=None, box=None, reducing_gap=None)
パラメータ
引数名 | 説明 |
size | リサイズ後の大きさを (幅, 高さ)のタプルで指定します。 |
resample | リサイズ時の補間方法を指定します。 Image.NEAREST Image.BOX Image.BILINEAR Image.HAMMING Image.BICUBIC Image.LANCZOS 画像の mode が 1, P や I;16などのビット指定モードのときは、Image.NEAREST が初期値 その他の場合、Image.BICUBICが初期値 |
box | 画像を拡大/縮小する領域を(左, 上, 右, 下)の座標のタプルで指定します。 初期値は(0, 0, 画像の幅, 画像の高さ)の画像全体 cropメソッドの処理と同じ |
reducing_gap | リサイズ時の最適化(詳細わからず。。) 初期値: None (最適化なし) |
戻り値 | リサイズされた画像(PIL.Image) |
サンプル
from PIL import Image
# 画像を開く
img = Image.open("Parrots.bmp")
# 画像を拡大/縮小する
img_resize = img.resize((64, 64))
# 切り抜いた画像の保存
img_resize.save("Parrots_resize.bmp")
(実行結果)
元画像 | 縮小画像 |
resample(補間方法)について
resampleの設定は、主に画像を拡大するときに画像の画素と画素の間の輝度値を求める事になるのですが、この時の求め方の方法を指定します。
この画素間の輝度値を求める方法は一般に補間と言いますが、補間については、下記のページを参照ください。
Pillowでは、補間方法にImage.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, Image.BICUBIC, Image.LANCZOSの方法を指定する事ができますが、
NEAREST→BOX→BILINEAR→HAMMING→BICUBIC→LANCZOS
の順で、キレイにリサイズすることができますが、処理時間は逆に遅くなるため、用途に応じてresampleの設定を行ってください。
個人的には、画像処理後の1画素1画素の輝度値を見せたいときはNEAREST、とりあえずのBILINEARという使い分けが多いです。
下図のように部分的に画像を拡大したときに、resampleの設定を変えると、どのようになるか?見てみたいと思います。
NEAREST | BOX | BILINEAR |
HAMMING | BICUBIC | LANCZOS |
拡大の時のキレイさは、NEAREST, BOX → HAMMING → BILEAR → BICUBIC → LANCZOS の順ですかね?
参考
https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.resize
https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-filters