送られて来たメールに添付された画像が、携帯のカメラで撮影されたらしくピンボケ状態で
画像中の文章を読むのが少し辛く、如何しようかと躊躇していた時に、昔、畳み込み演算で
ボケ画像の復元をしていたことを思い出した。 折角なので、一般化した話を考える。
最もよく知られている畳み込み演算の例としては、平均値フィルターがあり。 自身の値に
上下左右(と斜めの4方向)を加えた値を5分の1(9分の1)した値を、自身の新しい
値(明るさ)とする処理で以下の様な画素が処理の対象となる。
輪郭検出処理で使われる、ラプラシアンフィルタや、Prewittフィルタでも、畳み込み演算
が利用されているが、何れの場合でも、係数は一定である。
|
|
処理対象の画素
◎: 自身(対象画素)
◯: 周辺の画素 |
|
4方向
|
8方向
|
|
|
0 |
1/5 |
0 |
1/5 |
1/5 |
1/5 |
0 |
1/5 |
0 |
|
1/9 |
1/9 |
1/9 |
1/9 |
1/9 |
1/9 |
1/9 |
1/9 |
1/9 |
|
|
|
4方向の平滑化 |
8方向の平滑化 |
Prewitt フィルタ横方向 |
Prewitt フィルタ横方向 |
|
|
|
|
|
|
|
|
4方向の ラプラシアンフィルタ |
8方向の ラプラシアンフィルタ |
|
|
対象データ数と同じ数の畳み込み演算のカーネルを使用する処理の代表として DFTがあるが、
この場合、畳み込み演算のカーネルの値は、処理するデータ毎に変更される事が特徴である。
この例では、n個のデータから構成されており、カーネルは 360°をnで割った角度を基準
角にした、回転因子群の組合せからなるカーネルを使用した計算を行う。
D0 |
D1 |
D2 |
D3 |
........ |
Dn-1 |
D0用カーネル: |
K00 |
K01 |
K02 |
K03 |
........ |
K0n-1 |
|
D1用カーネル: |
K10 |
K11 |
K12 |
K13 |
........ |
K1n-1 |
|
D2用カーネル: |
K20 |
K21 |
K22 |
K23 |
........ |
K2n-1 |
|
D3用カーネル: |
K30 |
K31 |
K32 |
K33 |
........ |
K3n-1 |
|
: |
: |
Dn-1用カーネル: |
Kn-10 |
Kn-11 |
Kn-12 |
Kn-13 |
........ |
Kn-1n-1 |
|
New Db = Σ Da* Kba; 0<=a<n,0<=b<n;
・本来1点に集中すべき明るさが、本来の1点の周りに拡散している。
・ボケの影響は本来の1点より離れるほど、非線形で且つ劇的に減少する。
・注目点以外の各要素に関しても同等の現象か発生しており、現在の注目点で
観測される値には、周辺から拡散されて来た情報(明るさ)も含まれている。
・観測結果から、拡散方程式は逆算できない。(仮定・推定を行う必要がある)
・周辺の各観測値に対して、本来の観測点から距離を考慮した係数を掛けた値
が加算された値を、本来の観測点で測定している。
3-1 言い換えれば、
現在の観測点の値から、周辺の各観測値に距離に依存した係数を掛けた値を減算する事で、
本来の "ボケを起こしていない状態の特性を持つ値" を算出できる。
※
本事象が主たる要因で、副次的要因の影響は無視できるほど小さい
ボケの影響範囲をNとした時、NxN のマトリックスを用意し、その中心から遠方に対して
拡散しいる量を マイナスの係数 としたテーブル(カーネル)を作成した後、畳み込み
演算する事で自身に混入している周辺からの影響を激減(画像復元)させる事が可能だ。
※畳み込み演算(コンボリューション:Convolution)
ボケ情報を除去する方法として、畳み込み演算のカーネル値を決定して行う処理を特に、
デコンボリューションと表現する様である。デフォーカスによる影響以外にも、光学系の
回折限界(Diffraction limited)に起因した、画像の鮮明化にも応用が可能だろう。
※ この復元処理は、17x17のカーネルを用いた、畳み込み演算を1回行った結果
3-2 復元画像の調整
適切なカーネル値が決定された、コンボリューション・カーネルを用いて算出された画像
には、ボケを生じていない画像の特徴を色よく反映しているが、同時に、不要な値を高周
波成分として含んでいるので、空間フィルター等を用いて、期待される画像の成分以外を
除去する事が望ましい。 この例では、DFTを用いた除去処理を行っている。
※ 高周波成分あり画像 => DFT => filtering => IDFT => 高周波成分軽減画像
着目画素に対して、周辺画素値にカーネル係数
を掛けて、加算する方法はスマートな
計算方法では無い。無駄な計算量を減らして、処理の高速化する事が可能である事を
明記しておく。実際の実装方法に関しての詳細は控えるが、計算時にパイプラインが
乱れ無い様な手順で計算を行える様に、組み替える事で実現できる。
カーネルサイズが小さい時は気にならないかも知れないが、大サイズでは必須の手法
特段新しい話ではないが、思い出したので書き残しておく事にした。
畳み込み演算を行う事は、ドメインAの要素を異なる特徴空間のドメインBの要素に、変換
するので新たな特徴量抽出に於いて非常に有効な手段である。
流行りの AI 処理(CNN)においても、畳み込み演算が最も重要な機能の一つである事は
疑う余地もないが、手法が変わってもその本質は、変わっていないと思うのだが.....