werry-chanの日記.料理とエンジニアリング

料理!コーディング!研究!日常!飯!うんち!睡眠!人間の全て!

pythonで逆光写真のアート化

普段住んでる部屋がボロすぎて,実家帰ると部屋が暖かくて身震いしてしまうウェリーちゃんです.
今住んでる部屋は,築60年over,冷気ガンガン入ってくる,風呂桶が突然壊れて風呂入れなくなる,シャワーは5秒ごとに冷水が出る,etc.と大変です.

関係ない話はこれくらいにして,
それでは今回の記事の内容に入りましょう.

今回はpython使って逆光写真をアーティスティックにします.
f:id:werry-chan:20181230212525j:plain
↑SokuUPさんのサイトから持ってきた画像です.
SokuUp :: 風景 自然 空 夕焼け 逆光 原爆ドーム :: permalink

この画像の影の部分を,クレースケールの画素の輝度によって閾値で2分割します.
輝度は0で黒,255で白です.
次にマスク画像の作成です.

f:id:werry-chan:20181230215006j:plain
↑今回は閾値は輝度0〜100を全て黒(255),それ以上は全て白(0)の画像をマスク画像として作成します.黒っぽいところを白に,白っぽいところを黒にするって感じですね.

次に元の逆光写真の影の部分,マスク画像で言うと白くなった部分に合成する画像を用意します.
f:id:werry-chan:20181230215552j:plain
http://freeillustbook.net/starry-sky01/
↑このサイトから持ってきた画像と

f:id:werry-chan:20181230220141j:plain
http://shinkaiyablog.com/post-33/
↑このサイトから持ってきた画像を合成に使いましょう.

さて,それでは...
フュージョン!!ハッ!!」
f:id:werry-chan:20181230220615j:plain

はい出来ました.
f:id:werry-chan:20181230220824p:plain
〇〇ンクスです.
カッケェーーー!!!!
あのさっきまでの逆光の風景写真がここまでカッコ良くなりました!!
Pythonやってて良かった〜ーー!!
みんなも頑張ってフュージョンしてみてくださいね.

下手だとデブのカッコ悪い奴になりますから気をつけて.

ごめんなさい.ドラゴンボール大好きなのでふざけてしまいました.
とまぁ茶番はこの辺にして,本当に合成してみましょう.
f:id:werry-chan:20181230221319j:plain
f:id:werry-chan:20181230221334j:plain
綺麗な雰囲気の画像が出来ましたねぇ.
逆光写真の影の部分を合成することでアーティスティックに仕上げることが出来ます.

ソースコードは以下のようになります.

from PIL import Image
import numpy as np

#入力画像(逆光画像)の読み込み
img=Image.open('gyakkou02.jpg','r')

#合成する画像の読み込み
img_back=Image.open('deep_sea03.jpg','r')

#imgのコピー作成
img_origin=img.copy()

#imgの画像サイズ取得
width,height=img.size

#img_backの画像サイズをimgと同じにリサイズ
img_back=img_back.resize((width,height))

#imgをグレースケールに変換してimg_grayとする
img_gray=img.convert("L")

#輝度0〜100を255,それ以外を0にする.(二値化する)
img_gray=img_gray.point(lambda x: 0 if x > 100 else 255)

#img_grayを保存
#img_gray.save('gakkyou_gray02.jpg', 'JPEG', quality=100, optimize=True)

#新しい変数maskにimg_grayを代入.(名前をmaskにしたかっただけです.)
mask=img_gray

#合成して,合成画像をimg_resultとする.
img_result = Image.composite(img_back, img_origin, mask)

#img_resultを保存.
img_result.save('gakkyou_fusion3.jpg', 'JPEG', quality=100, optimize=True)

入力画像,二値化の閾値,二値化の値変更((0,255)→(100,255)など,透過率の変更ということ),二値化ではなく3,4,5値化で透過率をグラデーションする
などなどすることで,さらに面白いことが出来ます.

以下に他の画像での例をあげますね.
f:id:werry-chan:20181230223752j:plain
↑これが元画像です.
↓以下が合成画像です.
f:id:werry-chan:20181230222950j:plain
f:id:werry-chan:20181230223059j:plain
f:id:werry-chan:20181230223344j:plain
なんかいろんなバリエーションで出来ますねぇ.

参考にしたサイトは以下になります.
Python, Pillowで画像を一括リサイズ(拡大・縮小) | note.nkmk.me
Python, Pillowで二枚の画像をマスク画像に従って合成 | note.nkmk.me
PIL/Pillow チートシート - Qiita
Python 3.5 対応画像処理ライブラリ Pillow (PIL) の使い方 - Librabuch