Pythonで画像を回転する(Pillow編)

PythonのPillow(PIL)モジュールを使って、画像を回転します。単純に回転するだけではなく、回転の背景を任意の色(白色)にしてみます。

目次

  1. Pillow(PIL)で回転する
  2. 回転の実施例
  3. 背景を白くする方法

Pillow(PIL)で回転する

Pillow(PIL) はPythonで画像を扱う際のモジュールの一つです。いろいろな加工が出来ますので、使えるようになると便利です。

画像を回転するには、Imageオブジェクトのrotateメソッドを使用します。

img = PIL.Image.rotate(angle, [resample], [expand])
変数 内容
angle float 回転角度。単位は度。反時計方向を正方向として指定する。
resample   省略可。既定値はPIL.Image.NEAREST。補間方法の指定。
expand bool 省略可。既定値はFalse。回転した際に画像サイズを大きくするかどうか。
img Image 回転した結果のImageオブジェクト。

補間方法にはPIL.Image.NEARESTの他に、PIL.Image.BILINEARとPIL.Image.BICUBICがあります。

例えば新聞紙を45度回転すると、回転後の高さと幅は開店前よりも大きくなりますよね。そのときに、出力される画像を元の画像の大きさに維持するのか、それとも元の画像全体が表示されるように画像サイズを拡大するのかを、expandに指定します。

回転の実施例

元画像( プロ生ちゃんのサイト からダウンロードした画像をクロップして256x256にして背景色をつけたものです。)

元画像

30度回転してみます。補間方法はPIL.Image.BICUBIC、expandはFalseです。

from PIL import Image

original_image = Image.open('original.png')

roated_image = original_image.rotate(angle=30, resample=Image.BICUBIC, expand=False)

roated_image.save('rotated.png')

回転結果

回転後1

画像サイズが同じなので、元画像の一部が切れてしまっていますね。

ではexpandをTrueにしてみます。

from PIL import Image

original_image = Image.open('original.png')

roated_image = original_image.rotate(angle=30, resample=Image.BICUBIC, expand=False)

roated_image.save('rotated.png')

回転結果

回転後2

元画像全体が回転して表示されています。代わりに、画像サイズが350x350に拡大されました。

どちらが良いかは、用途次第です。

背景を白くする方法

上記の回転の結果を見ると、画像を回転したときに出来る隙間が黒色で埋められています。

実際にはこの隙間を白で埋めてほしいことがあります。

rotateメソッドにそういったオプションが見当たらないので、一手間掛けてみます。

  1. 元画像のサイズを取得する。
  2. 元画像の3倍のサイズの白い画像を作る。
  3. 3倍サイズの画像の中央に、元画像を貼り付ける。
  4. 回転する。
  5. 中央部をクロップする。
from PIL import Image

original_image = Image.open('original.png')

w, h = original_image.size
rotated_image = Image.new('RGB',(3*w,3*h), color=(255,255,255))
rotated_image.paste(original_image, (w, h))
rotated_image = rotated_image.rotate(angle=30, resample=Image.BICUBIC, expand=False)
rotated_image = rotated_image.crop((w,h,2*w,2*h))

rotated_image.save('rotated.png')
回転後3

隙間が白くなってますね。

広告

Pythonで画像処理カテゴリの投稿