Image Deblurring : Non-Blind Deconvolution (Frequency Domain)

 もう一月ほど前になりますが、SmartDeblurというアプリケーションが話題になりました。SmartDeblurはVladimir Yuzhikov氏により開発された画像のボケやブレを補正するツールです。背後にある技術自体は古くから知られたものですが、直感的なUIによりこの技術に詳しくない人にも使えるものとしたことで、処理結果のインパクトと相まって様々な技術系ニュースサイトに取り上げられていました。同氏のサイトに詳しい説明もありますが、ベースとなる技術は他にも使いまわしのできるものであるため、取り上げてみたいと思います。

 blurというとボケと訳されることが多いですが、デジタル写真では一般にはボケ(defocus aberration)とブレ(motion blur)をまとめてこう呼ぶケースが多いようです。前者は光学系の特性からくるもので、後者は撮像系と被写体との相対な位置関係からくるものです。ブレは更に手ブレなど撮像系に起因するものと被写体が撮像系に対して相対的に移動して生じるもの(被写体ブレ)とに分けることができます。ここではブレとボケをまとめてblurと呼びます。

 ボケもブレも基本的な原理は同じであり、前者は空間的に、後者は時間的に光線の記録位置がばらつき、このばらつきを持って記録されることで生じます。この過程はフィルタなどと同様に、異なる位置の情報が1点に合成されることから畳み込み(convolution)と呼ばれます。また、この畳み込まれ方をカーネル(convolution kernel)と呼びます。

 さて、ボケたりブレたりした画像から元の画像を復元するためには、この畳み込みの逆過程である逆畳み込み(deconvolution)を行う必要があります。逆畳み込みは主に、カーネルの推定と元画像の復元の二つのステップから成ります。カーネルが未知の条件で行う逆畳み込みをblind deconvolutionと呼び、逆にカーネルが既知の条件で行う逆畳み込みをnon-blind deconvolutionと呼びます。ここでは後者を扱うことにします。

 逆畳み込みは空間領域で行うことも出来ますが、基本的に不良設定問題であることから解くことは容易ではありません。一方、周波数領域では畳み込み定理(convolution theorem)を用いることで比較的容易に元画像を復元することが可能です。畳み込み定理についての詳細は割愛しますが、空間領域における畳み込みは周波数領域における掛け算と等価である性質があります。
 まず空間領域において、元画像f(x,y)、blurカーネルb(x,y)、ノイズn(x,y)とすると、観測画像g(x,y)は次式のように表せます。("*"は畳み込みを表す)

g(x,y) = b(x,y) * f(x,y) + n(x,y)

周波数領域の元画像F(u,v)、blurカーネルB(u,v)、ノイズN(u,v)、観測画像G(u,v)とすれば、畳み込み定理から、"b(x,y) * f(x,y) ⇔ B(u,v)・F(u,v)"と置き換えることができ、したがって前式は次のように書き換えることができます。

G(u,v) = B(u,v)・F(u,v) + N(u,v)

この性質を利用することで、(ノイズを無視すれば)畳み込みは周波数空間における画像とカーネルの乗算、逆畳み込みは周波数空間における画像とカーネルの除算として計算することができます。尚、これらは画像対して同一のカーネルを作用させることになりますので、Bilateralフィルタなどの適応的な処理には利用できません。

 ボケやブレの補正(deblur)の補正は逆畳み込みですので、仮にノイズを無視すれば次式のように計算できます。


F(u,v) = G(u,v) / B(u,v)

これは即ち、次のような手順で実現できることになります。

  1. 入力画像とカーネルを離散フーリエ変換する
  2. 変換された入力画像を同じく変換されたカーネルで割る
  3. 2の結果を離散逆フーリエ変換する

 Fig.1に周波数空間で畳み込み及び逆畳み込みを行った結果の例を示します。相対的に小さいσの値では元画像を良好に復元できていることが分かります。一方、σが大きくなるほど高周波成分が復元できなくなると共に、エッジ周辺に輪郭が多重に出現するringingと呼ばれる現象が生じていることも見て取れます。



Fig.1 blurring and deblurring samples

 今回行った逆畳み込みではノイズが存在しないことを仮定したため、余り実用的ではありません。ノイズまで考慮した逆畳み込み手法も多数提案されていますので、このあたりは後日アップデートしていきたいと思います。


 サンプルプログラムを置いておきます。deblur_vs2008.zip 直
(Microsoft Visual C++ 2008 Express Editionにて作成、OpenCVの2.1を使用)
以下留意点を記載しておきます。