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

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

新バージョンB チャンネル再建法ツールにおける新たな緑保護マスクの計算方法の考え方

f:id:yasuo_ssi:20210310145522j:plain

 

 黄変ネガ補正のための B チャンネル再建法ツール Ver. 5.6 バージョンアップに当たって、新たな緑保護マスクの計算式を考えました。

 この緑保護マスクというのは、次のような機能を持ちます。Bチャンネル再建法では、黄変して下がってしまった B チャンネルの値を、間接的に G チャンネルの値を参照しながら、B チャンネルの値を上げる (青くなる方向に補正する)、ということを行っているわけですが、もともと B チャンネルの値が低く、B チャンネルの値を上げなくて良い部分も上げてしまう可能性があります。特に、新緑の緑などは R, G値が高くB 値が低いので、誤って B 値が上昇し、本来あるべき色よりもかなり青くなる可能性があります。つまり、緑色が青緑になる傾向にあります。これを防止するために、そのような部分にマスクをかけて補正を抑制し、黄色みを維持するのが緑保護マスクの役割です。

 以前は、基本的には相対的な G値の高さに応じてマスクの透過度を決めていました (ただし若干モディファイしています)。つまり相対的 G値が高いとマスクの透過度が高く (このマスクは補正前の B 画像に掛けるので、マスクの透過度が高いと補正が抑制される)、相対的 G 値が低いほどマスクの透過度が低くなります(V = G - (R + B)/2)。これに黄緑の時にマスクの透過度が飽和するように 8bit 相当値で明度 15 (32bit 相当値で 0.059) を加え、さらに明るさを調整する係数を掛けていました。

 それを一旦、単純に相対的 G 値が高いほど透過度が明るくなるのではなく、黃緑色のとき透過度が最大になるように変えてみました。具体的には以下の式で決定します。

 V を緑保護マスクの値とすると (値が大きいほどマスクの透過度が高まる = 黄色味をより強く復元する)、

 V = (G-(ABS(R-G x 0.8) x 0.3 + B x 0.7)) ■ B の比重を落とすかガンマ補正を掛ける

   (式 1)

  ※ 但し、ホワイトポイント値は 1.0 、ブラックポイント値は 0.0 を前提

 単純に相対的な G 値の大きさを計算するときは G - (R + B)/2 で計算します。但し、黄緑に対してより明るい (透過度の高い) マスクを作るために、一旦、G - (R x 0.3 + B x 0.4) 式を考えました。これは黄緑色は R 値が高めになるため、マスクを作成するときに差し引く R 値の比重を下げます。但しこのままだと 黄色い場合も黄緑と同様、結構透過度が高くなってしまうため、黄緑の時に透過度のピークが来るようにするため、上の式の R 値を ABS(R-G*0.8) に置き換えたのが、先ほど掲げた計算式になります。

 黄緑のピーク値を  G と R の比が、1: 0.8 と考え、この時、G から差し引く R 値の値が最小になるような式です。つまり、R値が G 値の 80% の時、差し引く R 値が最小になるように R 値をそのまま使う代わりに、ABS(R-G x 0.8) 式で得た値を使います。

 なお、黄色い場合も B 値が低くて良いのではないかという考え方もあると思います。しかし黄変がかなりひどい場合、G 値にも影響し、G 値の低下により本来黄色くない部分もかなり黄色くなってしまうケースがあります。

 従って、黄変の結果黄色い部分と区別して本来黄色い部分を活かす場合は別編集を行ってもらう、という考え方です。

 この式により、G 対 R の比が 1: 0.8 でありかつ B 値が 0 の場合、最も透過度が高くなる (V 値が最大になる) ように設定しています。これより黄色くても、あるいは青くても (B 値が上昇しても) マスクの透過度が下がります。またこれは黄変画像でも、G チャンネルと R チャンネルは正常に近いことが多いのでは、という考え方です。

もっともマスク透過度が高まる色

 さらに、これで得た V 値は概ね値が小さくなる傾向にありますので、マスクとしての効果が小さくなりがちです。そのため ホワイトポイント値を V 値の最大値で割って、その値を掛けています。つまりマスクの透過度 (明るさ) の最大値がホワイトポイント値と一致するように変換しています。これには、B チャンネルに拡張フラットフィールド補正を掛けると B の値が、G の値に一般に接近するため、これを基に作成したマスクの透過度が下がる傾向にあるので、それを補償するという意味もあります。ただ、B チャンネル再建法を掛けた画像はそもそも原理上緑が青緑に寄る傾向がある上、黄変した画像の場合、スキャナドライバのホワイトバランス調整によってさらに青い方向に調整される可能性があるので、係数等をさらに再検討しさらに透過度を増したほうが良いかもしれません (ガンマ補正を追加するなど)。これは今後補正結果を見ながら検討していきたいと思います。

■補正範囲フィルタリングマスクの計算

 こうしてできた画像に対し、ミッドグレー点を超えるハイライト領域は補正の対象から省くため、これをフィルタリングするマスクを重ねます。

 このマスクを作るには、一旦以下の画像を作ります。

  V = (L - mg) * wp / 0.1 (式 2)

  ※但し  mg は中間グレー点の値、 wp はホワイトポイントの値です。
   また 値の範囲は 0.0 - 1.0 でありそれを超える範囲はクリップされます。

  

 これで、中間グレー点以下は黒に、中間グレー点以上は一定範囲がグレースケールになり、一定範囲以上はクリップされホワイトポイントになる画像になります。上式の 0.2 は以下の図のスロープ部分の傾斜を決める値になります。

 

V 式で得られる変換

 これを白黒反転すると、中間グレー点以下がホワイトポイントに、それ以上は元の高いが値ほど黒くなる反転したマスク画像ができます。

反転マスク画像

■上記2マスクの比較暗による合成

 このようにしてできた2つのマスク画像を比較暗で合成します。これにより主として中間グレー点以下のみが有効となる緑保護マスク (相対的 R 値が高い部分の黄色味を戻すマスク) が作成されます。

 

■上記マスク画像からの近景補正レイヤーマスク差引

 さらに、以上のマスク画像から近景補正レイヤーマスクを差し引きます。

 そもそも近景補正レイヤーマスクは補正前の B 画像が、G 画像よりも相対的に青い部分に対して、補正を適用しないためのマスクです。その意味は、基本的には、G 画像をレファレンスとして B 画像に補正を掛けるのは 相対的に黄色い部分 (B 画像の値が低い部分) を引き上げるためなので、G 画像をリファレンスとして B 画像を補正したときに青みが黄色い方向に引き下げられてしまう部分には補正を掛けない、というところにあります。

 このマスクの計算式は、

  v = ( (B - (G - a) ) x 11.5) ^ 0.5  

  ※ a はマスクの明るさを調整するパラメータ
   また値は 0 ~ 1.0 でこの範囲を超える値はクリップされる

  但し、非リニア処理の場合 v = ( (B - (G - a) ) x 7) ^ 0.5

 としています。

 この式の 11.5 もしくは 7 という係数は、上の図同様マスクの値が 0.0 の値と 1.0 を遷移する際の傾きを決めている値です。このあたりの係数は経験的に決定しています。

 この近景補正レイヤーマスクで差し引くのは、いくら R と G の比が 1: 0.8 に近いとしても、原画で元々青みの強い部分は元々緑みが強いとは言えないだろうという考え方です。

 具体的には、上のマスクと近景補正レイヤーマスクの比較暗画像をマスクとして採用します。

 

 因みに、黄変画像ではないのですが、どのような緑保護マスクができるかを正常な画像に対して試した結果を提示します。これを見る限り、このマスクのアイディアは、まずまずうまくいっているようです。

 但し、この結果は B チャンネル再建法ツールに新しい緑保護マスクアルゴリズムを実装したもので作成したものではなく、正常画像に新しい緑保護マスクアルゴリズム部分のみを取り出したプログラムを掛けた結果を表示しています。

 というのは、B チャンネル再建法ツールに新しい緑保護マスクアルゴリズムを実装したものは、補正した B チャンネル画像をベースにこの保護マスクを作成しますが、正常な画像の B チャンネルを「補正」してしまうと、B チャンネルがおかしくなってしまうからです。そのため拡張フラットフィールド補正を掛けていない B 画像を基にマスクを作成しています。

 まずオリジナル画像から。

オリジナル

 これを基に作成した緑保護マスクです。

緑保護マスク

 この画像を見る限り、ほぼ狙い通りのマスクができているようです。

---------

 しかし、これがうまくいくのは B 値が正常な場合です。B チャンネル再建法を適用するとどうしても B 値が G 値に近接し、青っぽくなりがちです。つまり黄緑が青緑に寄りがちです。従ってこのまま適用すると、マスクの透過度が必要以上に下がる傾向になります。さらにスキャナのホワイトバランス補正のせいか、マゼンタの方向に寄る (青みが増す) 傾向も良く見られます。

 そこで上の式 1 を再修正して、今回とりあえず次の式を適用することにしました。

 V = (G-(ABS(R-G x 0.8) x 0.7 + (B^1.7) x 0.3))   (式 3)

B 値にガンマ 1.7 を掛けて明るさの評価を下げた上、G から差し引く際に、変形 R 値の比重を上の式とは逆に上げる一方、変形 B 値の比重を下げました。つまり B 値の青みが上がったとしてもあまり評価せず、なるべく変形 R 値を反映するようにしました。

 

 この場合以下の画像からマスクを作ると、その下のようになりました。

オリジナル画像

上の修正式によるグリーン調整レイヤーマスク

 これが式 1 をベースに考えたマスクだと以下のような結果になっていました。

最初に考えた式によるマスク

 オリジナル式だと、あまり黄色味を残したくない遠景の黄色味が残る一方、田んぼの黄色味はあまり残りません。全般的に平板でメリハリがありません。全般に G 値と B 値の近接の悪影響が大きく影響しているのが分かります。

 明らかに B 値の評価比重を下げたほうがベターな結果になっています。

 

 なお、真っ黄色に近い色をしっかり残すには、以下の編集が必要になる可能性があります。

yasuo-ssi.hatenablog.com

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

[Ver. 5.6 リリース記事]

yasuo-ssi.hatenablog.com