【Pillow】マスクした画像を別の画像に貼る
完成予定図
↑これを作ります。
準備する画像(2枚)
四角い黒枠で囲まれた般若
と
神社の画像(背景画像)
背景画像の上に般若を貼るので、サイズは背景が大きくなければなりません。
逆にするとはみ出します。
作業環境
- Android
- termux
- Python3.8
- JupyterNotebook
- 外部ライブラリ
- Pillow(画像処理用)
- matplotlib(画像表示用)
2つの画像のフォーマット、サイズ、モードを確認
# Pillowをインポート from PIL import Image # 画像ファイルパス fname1 = "hannya.jpeg" fname2 = "jinja.JPG" # pillowで読み込み im_1 = Image.open(fname1) im_2 = Image.open(fname2)
# 画像を表示 # (次の工程で目盛りを見たいのでmatplotlibを使用) import matplotlib.pyplot as plt plt.imshow(im_1)
<matplotlib.image.AxesImage at 0x77ef78cd00>
(作業中のスクリーンショット画像です)
# 画像を表示(JupyterNotebookに表示)
im_2
画像省略!(般若が表示されている)
JupyterNotebookで画像を表示したいとき、↑のようにpillowのImage.open(画像パス)
で取得した画像イメージのオブジェクトをそのまま書くだけで画像が表示される。
matplotlibを使うと目盛りが表示されますが、貼り付け座標を決める時に参考にできて便利です。
使い分けしましょう。
# フォーマット、サイズ、モード print("般若 ", im_1.format, im_1.size, im_1.mode) print("神社 ", im_2.format, im_2.size, im_2.mode)
般若 JPEG (183, 276) RGB
神社 JPEG (800, 450) RGB
般若のマスク作成
般若を楕円のアイコン風にする為に、まずはマスク画像を描画で作成します。
# Pillowの描画用ライブラリのインポート from PIL import ImageDraw # マスク画像作成、元画像サイズで mask = Image.new("L", im_1.size, 0) # 画像描画の準備 draw = ImageDraw.Draw(mask) # 描画(座標を適当に指定) draw.ellipse((15, 30, 180, 260), fill=255)
# マスク画像イメージの表示
mask
写真保存し忘れた。省略で!(いい加減な性格)
JupyterNotebookには白黒の楕円が描画され表示されています。
般若とマスクの位置合わせ
次に般若とマスクの位置が合っているか確認します。ズレていたら↑の工程で再度マスク描画の座標を変え微調整します。
# 般若イメージをコピー im_mask = im_1.copy() # 般若にマスクのアルファチャンネル追加 im_mask.putalpha(mask) # 貼り合わせ画像表示 im_mask
マスク画像の位置は大体合っているので、これで行きます。
最終段階 全画像の貼り合わせ
- 般若 RGB
- 神社 RGB
- mask L
の画像イメージが用意出来ましたので、これを貼り合わせます。
# 神社(背景)イメージをコピー im_pst = im_2.copy() # 背景に般若を座標指定でマスクして貼り付け im_pst.paste(im_1, (220,80), im_mask)
# 完成画像イメージの表示
im_pst
画像省略!
先頭に貼った画像が表示されています。
最終工程で座標を指定しなければ、背景の原点(左上)に自動的に貼り付けられる。
↓
コロナで写真撮影を休んだ子。
般若をもう少し中央に貼りたいなら、指定した座標(220,80)の220に少し数を足す。
般若の位置を下げたいなら80に数を足す。y
軸は下向きがプラス方向。
完成画像の保存
# 完成画像の保存 im_pst.save("jinja_hannya.jpg")
以上です。