省型旧形国電の残影を求めて

戦前型旧形国電および鉄道と変褪色フィルム写真を中心とした写真補正編集の話題を扱います。他のサイトでは得られない、筆者独自開発の写真補正ツールや補正技法についても情報提供しています。写真補正技法への質問はコメント欄へどうぞ

黄変ネガ写真補正 Bチャンネル再建法ツール Ver. 5.9 リリース

f:id:yasuo_ssi:20210310145522j:plain

 前回のリリースから1か月ちょっとと早めですが、黄変ネガ写真補正 Bチャンネル再建法ツールをバージョンアップします。

 今回の改定では、前回懸案となっていた、緑補正レイヤーと褐色補正レイヤーのマスクのパラメータを変更しました。Ver. 5.8 では、特に緑補正レイヤーマスクの明るさが、固定パラメーターを使って作成すると、画像によってまちまちになるところから、ある程度自動的に明るさを計算して作成するように変更しました。

 ただ、その後、いろいろ試しましたが、これも画像によってまちまちではあるのですが、ややマスクが明るすぎるケースが多いようです。また、ユーザの方から褐色補正マスクの立ち上がりがやや急すぎるのではないかとのご指摘もいただきました。これはマスクがやや明るすぎるということから来ているのかもしれませんが。

 そこで、褐色補正レイヤーマスクと緑補正レイヤーマスクに対して、トーンカーブを掛けてマスクのシャドウ部の立ち上がりを緩くして、途中から急になるようにするアイディアを考えました。最初はシグモイド曲線のトーンカーブを使おうかと思ったのですが、その場合よく考えると、ピクセル単位の処理が必要になります。しかし ImageJ 上で Python (Jython) を使ってピクセル単位の処理を行うと、非常に計算時間がかかることを経験しています。オンラインの Q & A を見ても、ImageJ 上で Pythonピクセル単位の処理を高速化するのは無理なので、Java でプログラムを書いた方が良いというアドバイスがあります。

 とはいえ、プログラム全体を Java で書き直す気力はありませんし、Java によるプログラミングも勉強し直さなくてはなりません。おそらく Javaピクセル単位の処理を行う関数を作成し、それを Python 側から呼び出せばうまくいくのではないかと思いますが、それにしてもちょっと探求する時間が必要です。

 とりあえず、ImageProcessor に対するまとまったピクセル計算処理としては、四則演算とガンマ補正が使えるので、その範囲でできることをと考えて、マスクに対し、次のようなトーンカーブを掛けることにしました。

 マスクのシャドウ部では下向きにガンマを掛けた曲線のトーンカーブを掛け、一定の明るさ以上は、直線で上がっていくようにしようというアイディアです。

 いろいろとシュミレーションして、以下のような計算を行うこととしました。以下の図で、青がオリジナルのトーンカーブ (というかトーン直線) です。x 軸が変換前の (入力) ピクセル値、y 軸が変換後の (出力) ピクセル値です。

 まずオリジナルに下向きにガンマ1.5を掛けた曲線を作成します。その上で交点となる、変換後の明度を決め (0.15 としました)、それより明るい部分は傾き 1 の直線となる (つまりオリジナルの値に一定の y 切片を引いた直線)トーンカーブを考えます。つまり下の図で言えば、0.15以下はオレンジの線、0.15以上は灰色の線となるトーンカーブを考えます。

トーンカーブ 1

 ただ、これだと、最大値がホワイトポイント (1.0) に届きません。最大値が 1 + y 切片 (但し y 切片の値はマイナス) にとどまってしまいます。それで、最大値がホワイトポイントになるように、このトーンカーブに、1/ (1 + y 切片) を掛けて、最大値がホワイトポイントになるようにします。つまり、下の図で言えば、交点以下は、ピンク線、交点以上は青の線をたどるトーンカーブです。

 

トーンカーブ 2

 これにより元のマスクより、シャドウ部の立ち上がりが緩やかなマスク画像となります。このカーブを緑補正レイヤーマスク、および褐色補正レイヤーマスクに掛けて、マスクの立ち上がりを緩やかにしてみました。

 併せて、ホワイトポイントでクリップするピクセルの割合を減らすように、マスクを作成する際に掛ける係数の値をやや小さくしました。

 これらの変更により全般的に今までよりマスクの明るさが暗くなっています。何枚か画像編集を試した限りではこれぐらいで妥当なのではないかと思っておりますが、ユーザの皆様からご意見を頂けますと幸いです。

 今回の変更ではこの2つのマスクのパラメータ変更以外は、基本的に変えていません。UI や操作方法の変更もありません。

 次回のバージョンアップでは、Javaピクセル単位で処理できる関数を作成し、それを Python 側から呼び出すような仕組みを考えて、もう少しスマートな処理ができるような方向で考えたいと思いますが、その前に Java を使った ImageJ 用関数やプラグインを書く方法についてマスターする必要があります。次回バージョンアップまでちょっと時間を置くことになるかもしれません。

 本プログラムのダウンロードはこちらからお願いします。

----------------------

[関連情報]

yasuo-ssi.hatenablog.com

yasuo-ssi.hatenablog.com

----------------------

 なお、本記事で紹介した写真補正技法やソフトウェア (Plug-in) は個人的用途および非営利目的であれば自由に使っていただいて構いませんが、本技法を使って何らかの成果 (編集した写真等) を公表する場合は、本記事で紹介した技法を使った旨クレジットをつけて公表していただくことをお願いします。

 また、本ソフトウェアは現状のまま提供されるものし、作者はこれを使ったことによるいかなる損害補償等にも応じられないことを了解の上使っていただくものとします。
 但し、もしソフトウェアのバグがありましたら、ご連絡いただければなるべく改善するよう努めたいと思います。

 営利・営業目的で使用される方は別途ご相談下さい。

 また、私の作成したPlug-inも自由に改変して使用していただいて構いませんが、その成果を公表する場合はご一報下さい (公表しない場合は特に連絡は必要ありません)。またその改良した結果を私の方で自由に利用させていただくこともご了承下さい。

----------------------