【Pillow】画像のマスク処理と合成2
今回もPillowで画像の合成を行います。背景に貼り付ける画像のマスクを前回よりもう少し工夫します。
完成画像
使う画像(2枚)
作業環境
- Android
- termux
- Python3.8
- JupyterNotebook
- 外部ライブラリ
- Pillow(画像処理用)
画像の読み込み
from PIL import Image # 画像ファイルパス file1 = "jinja.JPG" # 背景画像 file2 = "hannya.jpeg" # 貼り付ける画像 # Pillowで読み込み im_jinja = Image.open(file1) im_hannya = Image.open(file2)
画像のフォーマット、サイズ、モード確認
print("神社 ", im_jinja.format, im_jinja.size, im_jinja.mode) print("般若 ", im_hannya.format, im_hannya.size, im_hannya.mode)
神社 JPEG (800, 450) RGB
般若 JPEG (183, 276) RGB
般若のマスク画像作成
【手順】
- 般若のマスク画像のベースを新規作成
- サイズは般若と同じくする
- 白黒モード"L"
- 般若画像のRGB値の合計が高ければ白に、低ければ黒にputpixel()を使って置換
1. 般若のマスク画像のベース作成
# マスク画像のベースを黒で新規作成 im_hannya_mask = Image.new("L", im_hannya.size, 0) # マスク画像イメージの表示 im_hannya_mask
(画像省略)
真っ黒の画像ができる。サイズは般若と同じ。
Image.new(モード, サイズ(tupleで), 色)
で画像イメージが新規作成される。
ここでは、サイズを般若のサイズで渡し、色は0つまり黒を指定している。
2. 色の置換
各ピクセルごどに(r,g,b)値が0~255の範囲で入っている。試しに(x,y)=(0,0)ピクセルの値を見てみる。
im_hannya.getpixel((0,0))
(42, 50, 63)
この赤・緑・青の3つが重なった色が画像の各ピクセルの色として表示される。
これらの合計が0に近ければ0、多ければ255の2値に置換する事により、全ピクセルを白か黒に変える操作を行う。
# 般若画像サイズから座標の最大値に分ける width, height = im_hannya.size # 画像の幅と高さを表示 width, height
(183, 276)
for y in range(height): for x in range(width): if sum(im_hannya.getpixel((x, y))) > 160: im_hannya_mask.putpixel((x, y), 255) else: im_hannya_mask.putpixel((x, y), 0) # マスク画像表示 print("般若マスク ", im_hannya_mask.size, im_hannya_mask.mode) im_hannya_mask
般若マスク (183, 276) L
黒い部分が次の貼り合わせの工程で背景が透ける部分になる。左の頬から顎が黒いので、この部分も透けます。
if文で(r,g,b値の合計 > 160)としている所の160
を別の数値に変えるとマスク画像の白黒の具合も変わるので、そこで調整。
貼り合わせ
- 神社(背景)
- 般若(貼り付ける)
- マスク画像
の3つが準備できましたので、神社(背景)に 般若をマスク画像に従って貼り付けていきます。
# 一応、背景画像をコピー im_jinja_new = im_jinja.copy() # 貼り付け im_jinja_new.paste(im_hannya,(320,20), im_hannya_mask) # 完成画像表示 im_jinja_new
(画像省略)
先頭に貼った完成画像が表示される。
透け具合と貼り付け位置を見て、良ければ画像保存。悪ければ↑の工程に戻って微調整。
# 完成画像の保存 im_jinja_new.save("hannya_jinja_2.jpg")
以上です。