はじめに本プログラムはPythonとPILがインストールされ、実行できる事が必要だ。必要に応じてインストールしてみて欲しい。尚本プログラムの実行結果については各自でご確認頂きたい。
さてPhotoshopを使っていると、「乗算」や「ソフトライト」などのブレンドモードを使う事があり、これをPython(PIL)を使って再現してみた。
Photoshopのブレンドモード
まず画像におけるピクセルは、R、G、Bの濃さを0〜255(2の8乗)の段階に分けて記録している。この2の24乗通りの組み合わせと色の透明度の4つの要素によって構成されている。
さらにPhotoshopのブレンドモードとは、このピクセルのRGB値を数式に依って処理し、ピクセルや画像に特殊な効果を与えるフィルターの事を言う。Photoshopでは主に「乗算」「ソフトライト」と言ったブレンドモードが用意されており、それぞれに数式が用意されている。数式に関する情報は各種サイトで解説されており、今回は「osakana.factory ブレンドモード解説」の情報を下に各種機能を実装した。
プログラムに入る前に、今回実装したブレンドモードの数式について紹介する。
焼き込みカラー
結果 = ベースの画像の画素値 + 合成する画像の画素値但し結果>255のとき、結果=255
乗算
結果 = ベースの画像の画素値 * 合成する画像の画素値 / 255スクリーン
結果 = ベースの画像の画素値 + 合成する画像の画素値 - ベースの画像の画素値 * 合成する画像の画素値 / 255オーバーレイ
ベースの画像の画素値 < 128 の場合結果 = ベースの画像の画素値 * 合成する画像の画素値 * 2 / 255
ベースの画像の画素値 >= 128 の場合
結果 = 2 * (ベースの画像の画素値 + 合成する画像の画素値 - ベースの画像の画素値 * 合成する画像の画素値 / 255) - 255
ソフトライト
合成する画像の画素値 < 128の時結果 = ( ベースの画像の画素値 / 255 ) ^ ( ( 255 - 合成する画像の画素値 ) / 128 ) * 255
合成する画像の画素値 >= 128の時
結果 = ( ベースの画像の画素値 / 255 ) ^ ( 128 / 合成する画像の画素値 ) * 255
ハードライト
合成する画像の画素値 < 128の時結果 = ベースの画像の画素値 * 合成する画像の画素値 * 2 / 255
合成する画像の画素値 >= 128の時
結果 = 2 * (ベースの画像の画素値 + 合成する画像の画素値 - ベースの画像の画素値 * 合成する画像の画素値 / 255) - 255
注:オーバーレイの逆の演算になっている。ベースの画像と合成する画像を入れ替えるとオーバーレイと同じ結果が得られる。
ソースコード
実行結果
実行結果をここに公開する。ベースの画像はpixivの「ルカさん塗り絵:リア様」から拝借し、合成する画像はRGB値が(229,242,177)の一様な画像だ。
ベースの画像
焼き込みカラー
乗算
スクリーン
オーバーレイ
ソフトライト
ハードライト
付録:実装のコツ
1.仕様書らしき物を作り、結果の値を確認しながら実装する
実装するコツとして、まず仕様書らしき物をExcelで作成してみる事だ。特定の数値におけるテストケースを作成し、計算式通りの結果が出るまで式を調整するようにやると上手く行く場合が多い。
ここで画像処理や統計処理では場合分けで数式が変わる事も多い。今回の場合ならば0、128、255付近で式が変わるためそれに応じたテストケースを作成するのがコツである。趣味でやる場合なら実装〜テスト〜ブログへ公開までの作業を一人でやることになる。この為各工程の計画を自分で立てられるよう心がけたい。
2.小数点は四捨五入!キャストも忘れずに
画像の画素値は整数値(integer)である。しかし割り算などを行なうと分数になる為、この値を四捨五入したり、あるいはintにキャストし直す必要があることに注意だ。
以上でPhotoshopのブレンドモードについての説明を終了する。本プログラムはブログ記事用に整理したもので、フルバージョンを見たり真似したりコピペしたい方が居たらこちらを見て欲しい。