2022年1月4日火曜日

【Pillow】マスクを使った画像の合成(Image.composite)

画像処理ライブラリPillowImage.compositeにより2つの画像を、マスク画像の画素値に応じた割合で合成できる。

Pillow(PIL) を使うためにはインポートが必要。 PIL.Imageモジュールは通常以下の形式でインポートされる。

from PIL import Image



1. Image.compositeによる画像合成

composite の書式は以下の通り。

PIL.Image.composite(image1, image2, mask)

image1:合成する1つ目の画像
image2:合成する2つ目の画像。1つ目の画像と同じ色空間とサイズ
mask:マスク画像。モードは1(白黒),L(グレースケール),RGBA(アルファチャンネル付きカラー)のいずれか。2つの画像と同じサイズ。

以下の2つの画像'sea.jpg','stars.jpg'(フリー写真素材ぱくたそより。サイズはどちらも600x400)を合成する例。
海の写真'sea.jpg'をimage1、星空の写真'stars.jpg'をimage2とし、海の写真の空の部分に星空を合成する。マスクに堤防と海の領域が白、空の領域が黒の二値化画像を用いる。

'sea.jpg'



'stars.jpg'



from PIL import Image, ImageDraw

image1 = Image.open('sea.jpg')
image2 = Image.open('stars.jpg')
mask = Image.new('1', image1.size)
draw = ImageDraw.Draw(mask)
draw.rectangle([(0, 318), (600, 400)], 
                fill='white', outline='white', width=1)
out = Image.composite(image1, image2, mask)
out.save('composite.jpg')

実行結果




グレースケール画像をマスクに用いるとマスク画像の画素値に応じて2つの画像が合成される。画素値が255の場合にはimage1、画素値が0の場合にはimage2が採用されその中間の値の場合には画素値に応じてimage1,image2がブレンドされる。
同じ画像を一番上の画素値が0、一番下の画素値が255でグラデーションしたグレースケール画像をマスクに用いた場合。

from PIL import Image, ImageDraw

image1 = Image.open('sea.jpg')
image2 = Image.open('stars.jpg')
mask = Image.new('L', (600, 256))
draw = ImageDraw.Draw(mask)
for i in range(256):
    draw.line([(0, i), (600, i)], 
                fill=i, width=1)
resize = mask.resize(image1.size)
out = Image.composite(image1, image2, resize)
out.save('composite.jpg')

実行結果




合成する画像からマスク画像を作成する例。以下の'ohkawa.jpg','togakure.jpg'(フリー写真素材ぱくたそより。サイズはどちらも600x400)を'ohkawa.jpg'から作成したマスク画像で合成する。

'ohkawa.jpg'




'togakure.jpg'




人物画像をグレースケール化しpointメソッドで画素値235未満を255に画素値235以上を0に変換することで人物が白、背景が黒のマスク画像を生成している。

from PIL import Image

image1 = Image.open('ohkawa.jpg')
image2 = Image.open('togakure.jpg')
gray = image1.convert('L')
mask = gray.point(lambda i: i < 235 and 255)
out = Image.composite(image1, image2, mask)
out.save('composite.jpg')

実行結果




2. リファレンス

Pillow (PIL Fork) > Image Module > PIL.Image.composite(image1, image2, mask)

使用バージョン:Python 3.8.8 / Pillow 8.2.0

0 件のコメント:

コメントを投稿