こんな画像が
こうなります
画像の中の細かい部分(髪の毛とか目の周りとか)が復元されているのが見ていただけるでしょうか?
ソースコードはgistにアップロードしてあります。
べた書きのCとOpenCVを用いています。
https://gist.github.com/2424856
ご自由にお使いください。
ぼけのモデル
画像にあらわれる、ぼけてつぶれてしまう現象は一般に、ぼけのない画像とぼけ方の畳み込みで表現されます。ぼけのモデル |
畳み込みは、ぼけた画像の1画素がぼけてない画像の何画素かとぼけ方を掛けて足し合わせていく処理のことです
畳み込み |
フーリエ変換
この畳み込みは、逆演算をストレートに求めることが難しいです。しかし、畳み込みはフーリエ変換を用いることで乗算に変換できるので逆演算が簡単になります。
アルゴリズム
- ぼけを含んだ画像 y とぼけ方 f を入力として受け取る
- yとfをフーリエ変換
- ぼけのない画像をフーリエ変換領域で求める
- 以下の数式に従って計算
- 逆フーリエ変換
結果
結果は上の通りです。実行時間ははかってませんが、10秒はかからず、1〜2秒くらいだと思う。before |
after |
離散フーリエ変換が周期関数を仮定しているんですが、実際の画像では周期関数でないために上式に従わないために発生します。
窓関数をかけると、抑制することができます。