Retinex/jp
ここの解説は一部がまだ不完全です。
概要
薄暗い、鮮やかな色に囲まれている、霞みがかかっている、など周辺の環境が違っても、人間の目は、物の色を正しく捉えて見ることが出来ますが、カメラはそれが苦手です。そこで、環境変化に対する人間の視覚のメカニズムを真似たMSR(MultiScale Retinex)というアルゴリズムが生まれました。デジタル写真撮影の中で、このレティネックス(Retinex:網膜-retinaと皮質-cortexの合成語)というアルゴリズムは、天体写真やX線撮影、CTスキャンで、画像の中の曖昧な箇所をはっきりさせるために使われています。この20年で、様々な理論やアルゴリズムが開発されました。初めの試みは、人間の目の知覚とEdwin Landが提案した網膜の役割を基に、Rahmanが1996年に行った実験です。アプローチ自体はCIECAMと似ていますが、機能的にはDoG(Difference of Gaussian ガウス差分)による画像の生成に似ています。考え方としては、画像の注目画素とその周辺画素の輝度の強弱の特徴を解析するのですが、科学的根拠に基づいている訳ではなく、実験や経験に基づいて、長い間改良が重ねられたものです。これら研究成果は、まだ満足のいくものではありませんが、プログラムに組み込む上で、次の2つの研究成果を参考にしました:
- "Automatic Image Haze Removal Based on Luminance Component" (Fan Guo, Zixing Cai, Bin Xie, Jin Tang)"[1](英語)
- "Retinex Algorithm on Changing Scales for Haze Removal with Depth Map" (Weixing Wang, Lian Xu)"[2](英語)
- 上記2つの研究に加えて、Fabien Pelissonによる“プログラムの工夫2003”を参考にしています。
レティネックスは次の様な画像の補正に有効でしょう:
- 霧などで霞んだ画像
- 輝度の差が著しく少ない画像
- 画像に特殊な効果を付けたい(例 トーンマッピング)
レティネックス 新しい調整機能
以下、このアルゴリズムの限界、長所・短所を説明します。
“ウェーブレット”をレティネックスで使う
ウェーブレットをレティネックスで使うオプションを2つ用意しましたが、説明はウェーブレットの項に移動しました。
RawTherapeeでの応用限度
このアルゴリズムは画像全体を考慮する必要があるため、切り抜いた画像やリサイズした画像には使えません。この制約ため、プログラムへの応用に関しても幾つか制限があります:
- 処理モジュールは“Lab調整”の近くに置くことにしました。Lab調整はraw画像を処理するためRawTherapeeの処理工程の最初の方にあります。従ってレティネックスのモジュールも処理工程の最初の方に置く必要があるため、扱える対象はrawファイルだけになります(TIFFやJPEG画像は扱えません)。
- 処理モジュールをデモザイク処理の直ぐ後に置いたので、処理するrawデータは、ダウンストリームのrawデータとは性質が異なります。ガンマがなく、色域の制限もありません。ホワイトバランスもRGB変換もないので、アーティファクトの発生や、輝度や色度の記録精度が落ちます。
- 処理モジュールが最初の方に置いてあるため、設定を変える度に、他を含む処理プロセス全体の演算が繰り返され、システムに負荷がかかります。
- 色被り(空の色にマゼンタが被る)が発生することがあるので、その場合は、ホワイトポイントの補正が必要となります。
- 但し、このモジュールは“ノイズ低減”の前にあるので、この色被りをノイズ低減機能で補正することが出来ます。
以上の様な制限はありますが、ウェーブレット機能と併用することで、このレティネックスは霞がかかったような画像のコントラストや色のレンダリング補正で十分満足のいく効果が得られると思います。
基本的なアルゴリズム
更に詳しい情報が、上記‘概要’の研究成果(pdf)の中にあります。
“透過マップ”を作る
- まず、入力画像の注目ピクセルの輝度の対数と、ガウスフィルタを使って平滑化したその周辺ピクセルの輝度を算出し、その差を求めます。ここで使われるガウス関数の1標準偏差(σ)は非常に大きくなります‐一般的にRawTherapeeで使われているσは概ね0.5~5.0ですが、ここではその値が10~280(シングルスケールレティネックスの場合で)になります:
- 次に入力画像の輝度分布を変えます:
- “透過マップ”ファイルの作成前にガンマを適用します
- 作成後に、ガンマの逆数を適用し、入力画像の特徴を復元します
こうして輝度分布を変えることで:
- 画像の明暗が変えられます
- 例えば、明るさの過不足を考慮して透過マップを調整出来ます
- スケールを複数回適用します(MSR:マルチスケールレティネックス)。3回適用しますが、この数をユーザーが変えることは出来ません。このアルゴリズムは経験から得た係数の集合で作られています。スケールの深度が浅い場合、見た目のコントラストは増えますが、自然な映りにするためには大きい値の設定が必要です。但し、ノイズが増えやすい傾向があります。
- 目標とする効果に応じて、MSRのバリエーション(均等、低、高、ハイライト)を選びます:
- 均等:濃度の低い部分と高い部分を均等に処理します。
- 低:濃度の低い部分に重点を置いて補正します。
- 高:濃度の高い部分のレンダリングを補正します。
- ハイライト:ハイライト部分でマゼンタ被りが起こる場合のレンダリングを補正しますが、強いアーティファクトが発生することがあります。
- 作業色空間を選びます:
- 対数L*a*b*
- 対数HSL
- 線形HSL:これは標準的なアルゴリズムではありません。通常のレティネックスで適切な効果が得られない場合に使います
この処理(線形HSL以外)により対数分布(透過マップ)が得られ、これを入力画像から“減じる”ことで、理論的には画像から霞を取り除くことが出来ます。画像にもよりますが、対数分布はおおむねガウス分布で、霞の多い画像で、最小値(minT)が‐10~‐40、平均値‐1~+2、1標準偏差値2~6、最大値は(maxT)10~40になります。マイナス値は濃度が低い部分を示し、プラス値は高い部分を示しています。これら値は対数値なので、実数値はかなり大きなものです(例、log1000=6.9、log22000=約10、log500000=約20)。理論的には、高い“スケール”値とガウス値が、画像の中でレンズに近い部分(大気の影響が少ない)で使われ、低い値がレンズとの距離が遠い部分(大気の影響が強い)で使われるべきでしょう。
ガウスフィルタによるマスク処理
“透過マップ”ファイルは以下の再帰処理に対応しています:
- 入力画像-ヒストグラムイコライザやガンマで色々と調整された入力画像
- ガウスフィルタによる平滑化処理(スケール、半径、モード、低・高)から直接得られた“マスク”ファイル
表示“マスク”の種類
“マスク”ファイル処理を使うと、アーティファクトやハロの発生を減らすことが出来ます。マスクの種類はユーザーが選べるように、“コンボボックス”にしました。この機能はレティネックスの学習、及び目標とする調整を行うための補助として設けました。
- プロセス(表示方式):
- 標準:デフォルトに設定されている表示プロセスです。
- マスク:ガウスフィルタを応用したレティネックスで得られたマスクを表示します。表示に影響する要素には次のようなものがあります:
- レティネックス処理工程のアップストリームに位置する設定;バリエーション(低、均等、高、ハイライト)や半径、ガンマ、ヒストグラムイコライザの調整が表示画像に影響します。一方、ダウンストリームに位置する設定;コントラスト、ゲイン、明るさ、しきい値、透過マップのカーブは、表示に影響しません。
- “マスクイコライザ”(マスクの方法で“なし”以外を選択した時に利用可能)による設定。
- これら設定は外部エディタ(GimpやPhotoshop)にエクスポートすることが出来ます。
- アンシャープマスク:入力画像からマスクを取り除いた画像を表示するオプションです。この場合、“強さ”は入力画像とマスクの釣り合いを調節する役割を果たします。半径を大きく取ったアンシャープマスクのような画像になります。
- 透過:“透過マップ”ファイルを“画像”として表示するオプションです。
- このオプションンで表示される“画像”は現実的な画像ではありません。一般的には‐30~+30の対数の範囲に収まる画像データを表示したものです。
- (固定)透過:任意に選んだ2つの係数を使っています。これにより基数が変更され増幅されます。自動計算だけでは比較が困難なので、この様な設定を用意しました。
- (自動)透過:透過マップファイルを見極める目的で、輝度の分布が0~32700に収まるように、プレビュー画面に表示されている値(透過マップ、最小値、最大値、平均、標準偏差)を使いました。もちろん、これら数字が最大範囲にあっても見えますが、現実的な画像ではありません。画像にもよりますが、“固定”の方が適切な表示オプションかもしれません。
- 透過マップは、a) メディアンフィルター、b) ゲイン補正、c) オフセット補正(“明るさ”)、d) “強さ”を除く全てのレティネックス処理を考慮したモードです。
- “マスクイコライザ”や“透過マップ”のカーブを使った補正も反映されるので、ハロやコントラストに対し直接的な作用を見ることが出来ます。
マスクの方法
マスクの方法を3つ用意しました:
- マスクイコライザ(“なし”以外の選択で利用可能)は“マスク”のコントラストに直接的に影響します。敏感に作用するので、このカーブだけを使う方法ではアーティファクトの発生に注意が必要です。但し、処理時間は短くて済みます。このカーブによる調整は単独で使うことも、他の方法と併用も可能です。
- ガウスフィルタ:マスクにガウスフィルタを適用します。シャドウ部分、ハイライト部分、半径を別々に調整することが出来ます。処理時間の増加は多くありません。
- シャープマスク:マスクに“ウェーブレット”による処理(シャープマスク)を適用します。シャドウ部分とハイライト部分を調整することができます。部分的な適用、全体的な適用の選択にもよりますが、処理時間はかなり増えます。