Total Variation Minimization 3

第一人者の関係者からトラバが来ててビックリ.どうやらパラメータは概ね良いらしいです.ありがとうございます.

さて,このTVネタも自分の中での発展性が乏しいので,そろそろ終わりです.折に触れて活用はするでしょうが.

入力画像fは骨格画像u,テクスチャ画像v,差分画像rに分解されます.差分画像は先の2つのモデルに当てはまらない成分で,ランダムノイズというには少し問題があります.エッジやテクスチャがうっすら見えてますから.このうち,u+vでほとんど入力画像と同じ画像が得られます.Lennaの場合で45.30dBになりました.思ったより低い.

原因は3つ.1つ目はパラメータλの値が大きいから.これは入力画像との差分をコントロールします.この値を小さくすればPSNRは上がります.2つ目は繰り返し回数が少ないから.概ね収束しているのですが,完全に変動が止まったわけではありません.あとで各成分の変動を掲載します.3つ目は入力値を0〜1に正規化しているから.この正規化が結構くせ者で,しない方が良かったかもです.ただ,値の意味を知る意味では便利だったので正規化しました.

各画像の輝度は図のようになりました.なかなか良さそうな特性ですね.右下のテクスチャ画像はコントラストを弄っています.紙の部分と帽子の部分が変化が分かりやすいでしょうね.

計算時間はそこそこかかります.1秒間の繰り返し回数は5.88回@512x512画素,20.28回@QVGAでした(Pentium 4,3GHz).仮に32回の繰り返しだと1画像処理するの数秒かかります.ただし,この処理はdoubleを用いているので,整数化すればコンスタントに数倍早くなるでしょう.さらに,全ての画素について繰り返し計算をする必要があるとは思えないので,画像の特性を見て処理を省くことも出来るはずです.したがって,頑張れば1枚1秒以下で計算できるようになると思います.アプリケーション次第ですね.

各ノルムの変化はこの図のようになります.全て1画素当たりにしています.一番下の青がTVノルムで単調減少かつ収束してます.一番上の紫がGノルム(L∞ノルム)で単調増加かつ収束してます.この2つは左の軸.中央の緑が差分の2乗ノルムで,基本的に単調減少で,かつ収束してます.階段状なのはデータの出力精度の問題です.これは右の軸.

今回はu+vの足し算モデルを検討しました.斉藤先生のグループでは,u*vの掛け算モデルを提案しています.この方が結果が良いようです.そうは言っても掛け算で正直に計算するのは難しいので,logを取って加算モデルに帰着させます.log(f)=log(u)+log(v)+rというのがモデルになりますかね.このとき,底を何にするかで結構特性が変わると思います.テクスチャの振幅はパラメータμで制限されます.つまり,元の輝度の何倍までをテクスチャにするのか,という視点になります.そして,この事は元の輝度がいくつかにも依存します.要は,輝度によってテクスチャとエッジの振り分けられ方が変わり,それは結局底に依存する.何が良いとか使うべきという指標は得られないと思いますが,一般的な傾向ぐらいは明らかになるでしょう.

そもそものTVノルムの傾向として,エッジは保存されやすいですが,画素値レベルでの保証はされません.依然としてエッジの一部はテクスチャに分離されます.ただし,しきい値を決めたエッジ抽出なんかに比べれば格段に筋が良さそうです.これを正解としたエッジ抽出の研究は面白いかもしれません(その方が計算量の観点から実用的かも,と密かに思っている(昨日とっさに思いついて,口から適当にこんな出任せを言う羽目に)).

分離に関して,これ以上の一般的な議論は不毛でしょう.少なくとも私は大分満足しました.この後はアプリケーションを意識したパラメータや計算方法の最適化などが挙げられます.切り口を変えて,分離した画像を効率的な別空間に写像する話があるようです.言い換えると,エッジを含む骨格画像はどの基底で表現すると良いのか,という話題です.Donohoさんが提案しているCurveletがかなり有力候補のようです.これとは別に,そもそものTVノルムを見直す動きもあるようです.例えば,2乗ノルムとTVノルム(1乗ノルム)の間が良いらしい,など.