Retinex/jp

From RawPedia
Revision as of 01:43, 24 June 2018 by Yz2house (talk | contribs)
Jump to navigation Jump to search

レティネックス

ここの解説は一部がまだ不完全です。

概要

 薄暗い、鮮やかな色に囲まれている、霞みがかかっている、など周辺の環境が違っても、人間の目は、物の色を正しく捉えて見ることが出来ますが、カメラはそれが苦手です。そこで、環境変化に対する人間の視覚のメカニズムを真似た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)。理論的には、高い“スケール”値とガウス値が、画像の中でレンズに近い部分(大気の影響が少ない)で使われ、低い値がレンズとの距離が遠い部分(大気の影響が強い)で使われるべきでしょう。

ガウスフィルタによるマスク処理

“透過マップ”ファイルは以下の再帰処理に対応しています:

  • 入力画像-ヒストグラムイコライザやガンマで色々と調整された入力画像
  • ガウスフィルタによる平滑化処理(スケール、半径、モード、低・高)から直接得られた“マスク”ファイル