よちよちpython

独習 python/Qpython/Pydroid3/termux

【Pillow】マスクした画像を別の画像に貼る

完成予定図


f:id:chayarokurokuro:20200816180545j:plain


↑これを作ります。

準備する画像(2枚)

f:id:chayarokurokuro:20200816180619j:plain
四角い黒枠で囲まれた般若



f:id:chayarokurokuro:20200816180716j:plain
神社の画像(背景画像)



背景画像の上に般若を貼るので、サイズは背景が大きくなければなりません。
逆にするとはみ出します。



作業環境

  • 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>

20200816181030


(作業中のスクリーンショット画像です)

# 画像を表示(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

f:id:chayarokurokuro:20200816182038j:plain


マスク画像の位置は大体合っているので、これで行きます。

最終段階 全画像の貼り合わせ

  • 般若 RGB
  • 神社 RGB
  • mask L

の画像イメージが用意出来ましたので、これを貼り合わせます。

# 神社(背景)イメージをコピー
im_pst = im_2.copy()

# 背景に般若を座標指定でマスクして貼り付け
im_pst.paste(im_1, (220,80), im_mask)
# 完成画像イメージの表示
im_pst

画像省略!
先頭に貼った画像が表示されています。

最終工程で座標を指定しなければ、背景の原点(左上)に自動的に貼り付けられる。


f:id:chayarokurokuro:20200816182249j:plain
コロナで写真撮影を休んだ子。



般若をもう少し中央に貼りたいなら、指定した座標(220,80)の220に少し数を足す。
般若の位置を下げたいなら80に数を足す。y 軸は下向きがプラス方向。



完成画像の保存

# 完成画像の保存
im_pst.save("jinja_hannya.jpg")



以上です。