2012年4月26日木曜日

ウィナーデコンボリューション

ウィナーデコンボリューションとは、ぼけてしまった画像をキレイな、シャープな画像に復元する画像処理アルゴリズムです。

こんな画像が

こうなります


画像の中の細かい部分(髪の毛とか目の周りとか)が復元されているのが見ていただけるでしょうか?

ソースコードはgistにアップロードしてあります。
べた書きのCとOpenCVを用いています。
https://gist.github.com/2424856

ご自由にお使いください。

ぼけのモデル

画像にあらわれる、ぼけてつぶれてしまう現象は一般に、ぼけのない画像とぼけ方の畳み込みで表現されます。

ぼけのモデル

畳み込みは、ぼけた画像の1画素がぼけてない画像の何画素かとぼけ方を掛けて足し合わせていく処理のことです
畳み込み
ここでの問題は、ぼけを含んだ画像と、どのようにぼけたかという情報を用いて、ぼけのない画像を逆演算で求めることです。



フーリエ変換

この畳み込みは、逆演算をストレートに求めることが難しいです。
しかし、畳み込みはフーリエ変換を用いることで乗算に変換できるので逆演算が簡単になります。




アルゴリズム


  1. ぼけを含んだ画像 y とぼけ方 f を入力として受け取る
  2. yとfをフーリエ変換
  3. ぼけのない画像をフーリエ変換領域で求める
  4. 以下の数式に従って計算
  5. 逆フーリエ変換
で作ることができます。


結果

結果は上の通りです。実行時間ははかってませんが、10秒はかからず、1〜2秒くらいだと思う。

before
after
 画像の縁の方に縞模様ができていますが、これはリンギングという現象で、
離散フーリエ変換が周期関数を仮定しているんですが、実際の画像では周期関数でないために上式に従わないために発生します。
窓関数をかけると、抑制することができます。