#3【Python】PILで2枚の画像を合成する

《目次》

《内容》

今回はPythonの画像処理ライブラリ「PIL」を使用し2枚の画像を合成してみたいと思います.
画像は以下のサイトを利用させていただきました.
www.pakutaso.com

以下の画像を合成していきたいと思います.

f:id:tqdm8192:20190917222635j:plain
1枚目「ピンクの花」

f:id:tqdm8192:20190917222840j:plain
2枚目「可愛い女性」

《プログラム》

from PIL import Image
#File OPEN
img1 = Image.open("img1.jpg")
img2 = Image.open("img2.jpg")
#convert
rgb_im1 = img1.convert('RGB')
rgb_im2 = img2.convert('RGB')
#size
size1 = rgb_im1.size
size2 = rgb_im2.size

img1n = Image.new('RGB',size1)
img2n = Image.new('RGB',size2)

#min_size
min_sizex = min(size1[0],size2[0])
min_sizey = min(size1[1],size2[1])
size3 = [min_sizex,min_sizey]

img4_1 = Image.new('RGB',size3)
img4_2 = Image.new('RGB',size3)
img4_3 = Image.new('RGB',size3)
#min合成
for x in range(min_sizex):
    for y in range(min_sizey):
        r1,g1,b1 = img1.getpixel((x,y))
        r2,g2,b2 = img2.getpixel((x,y))
        r3 = min(r1,r2)
        g3 = min(g1,g2)
        b3 = min(b1,b2)
        img4_1.putpixel((x,y),(r3,g3,b3,0))
#max合成
for x in range(min_sizex):
    for y in range(min_sizey):
        r1,g1,b1 = img1.getpixel((x,y))
        r2,g2,b2 = img2.getpixel((x,y))
        r3 = max(r1,r2)
        g3 = max(g1,g2)
        b3 = max(b1,b2)
        img4_2.putpixel((x,y),(r3,g3,b3,0))
#avg合成
for x in range(min_sizex):
    for y in range(min_sizey):
        r1,g1,b1 = img1.getpixel((x,y))
        r2,g2,b2 = img2.getpixel((x,y))
        r3 = int((max(r1,r2)+min(r1,r2))/2)
        g3 = int((max(g1,g2)+min(g1,g2))/2)
        b3 = int((max(b1,b2)+min(b1,b2))/2)
        img4_3.putpixel((x,y),(r3,g3,b3,0))

img4_1.show()
img4_1.save("min.png")
img4_2.show()
img4_2.save("max.png")
img4_3.show()
img4_3.save("avg.png")

《結果》

f:id:tqdm8192:20190917223214p:plain
「min合成」

f:id:tqdm8192:20190917223310p:plain
「max合成」

f:id:tqdm8192:20190917223502p:plain
avg合成」

《プチ解説》

※min合成,max合成,avg合成などの名前は私が勝手につけた名前です.

「min合成」

min合成は2枚の画像の各RGBを比べて小さい方を入力しています.
例えば,(R,G,B)の順で,
1枚目(90,120,200)+2枚目(200,70,90)=min(90,70,90)
のような感じです.
画像だけ見ると1枚目が強く出ているようです.

「max合成」

max合成は2枚の画像の各RGBを比べて大きい方を入力しています.
例えば,(R,G,B)の順で,
1枚目(90,120,200)+2枚目(200,70,90)=max(200,120,200)
のような感じです.
画像だけ見ると2枚目が強く出ているようです.

avg合成」

最後はmaxとminを足して割る2しています.と思いましたが,これ無駄な処理ですね(笑)
おそらく,(r1+r2)/2,(g1+g2)/2,(b1+b2)/2と同じ結果になるのでは.
この画像が,THE合成という感じですね.

また,画像のサイズですが,2枚の画像の縦横の小さい方をとって合成後のサイズとしています.
例えば,(x,y)の順で,
1枚目(1200,1500)+2枚目(1000,1800)=min(1000,1500)
のような感じです.大きい方をとるとout of rangeのエラーが出ました.
処理を変えれば解決できると思います.

《今後の課題》

さまざまな合成ができると分かったので,いろいろ試してみたいと思います.

今回は以上です.長くなりましたが,最後まで見てくださった方がいましたらありがとうございます.