よちよちpython

独習 python/Qpython/Pydroid3/termux

【Pillow】画像のマスク処理と合成2

今回もPillowで画像の合成を行います。背景に貼り付ける画像のマスクを前回よりもう少し工夫します。

完成画像

f:id:chayarokurokuro:20200817210117j:plain



使う画像(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



般若のマスク画像作成

【手順】

  1. 般若のマスク画像のベースを新規作成
    1. サイズは般若と同じくする
    2. 白黒モード"L"

  2. 般若画像の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


20200817210231


黒い部分が次の貼り合わせの工程で背景が透ける部分になる。左の頬から顎が黒いので、この部分も透けます。
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")



以上です。