プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

キュービックコンボリューション(3次畳み込み内挿法)

詳解画像処理プログラミングをキュービックコンボリューションの関数を調べる為に久しぶりに開いた。

詳解 画像処理プログラミング C言語で実装する画像処理アルゴリズムのすべて

詳解 画像処理プログラミング C言語で実装する画像処理アルゴリズムのすべて

これを買ったのは一昨年の話だが、当時はこのキュービックコンボリューションの意味がさっぱり分からなかったなぁ。唐突に式だけ出てきて、なんぞ?って。
今見てみれば全然難しいことしてないんだけどね。


名前がいけないと思うんだ。


キュービックコンボリューション(どーん!
3次畳み込み内挿法(どーん!

なんか名前の雰囲気が重たい。ゲンナリする。
私ならこう名付ける。


「高周波成分捨ててエッジなくしちゃいましたちゃいましたフィルター」


………いかん、これだとローパスフィルタかけるフィルターが全て同じ名前になってしまう。


でも、やってることは本当にそれだけなんですね。


関数をフーリエ変換すると周波数空間になります。
フーリエ変換知らない方は、元の関数f(x)をa*sin(t*x*2π)の和で表すと、どんな風にaがtが出てくるかに書き換える処理だと思ってください。


高周波成分(tが大きい値)をざっくり切っちゃって0にすると、元の関数はエッジが消えて滑らかになります。なるんです。


画像を再近傍で拡大するとピクセルの形がそのまま出ちゃってがたがたになります。エッジが目立っている状態ですね。
なので、画像の周波数空間で高周波な値をざっくり切っちゃって滑らかにしよう!というのがキュービックコンボリューションでやってることです。


点(x,y)の色をC(x,y)という関数で表しましょう。
 \mathcal{F}(C)がCをフーリエ変換するという意味です。
Cの高周波成分を除去するには、Cをフーリエ変換した関数に矩形関数Rをかけてやってから逆フーリエ変換すればいいです。。矩形関数:ある一区間だけ定数値を持っていて後は0という形の関数。今回は正確には原点で値が1の縦軸対象な矩形関数。範囲は適宜。


ところで、矩形関数というのは、sinc関数をフーリエ変換したものなんです。証明は私には出来ません。
なので、Rをかけ算するという式は以下の様になります。
\mathcal{F}(C)R=\mathcal{F}(C)\mathcal{F}(sinc)=\mathcal{F}(C*sinc)


最後の=\mathcal{F}(C*sinc)が唐突に出てました。
*は畳み込み、という二つの関数から新たな関数を作る演算子です。以下の様な定義です。
(A*B)(x) = \sum_{t=-\infty}^\infty A(t)\times B(x-t) (※関数が離散な時)
二変数の時はΣが二つになるだけでせう。

で、さっきの式で唐突にひとくくりにされていた部分はこの畳み込みの性質をつかったのです。え?何でって?信じなさい。これは宗教です。


というわけで、求めたかったエッジをとって滑らかにした関数はC*sincという関数になることが分かりました。


ただ、sinc関数というのは\frac{\sin x}{x}という非常に扱いにくい関数です。畳み込みも∞回足し算していかなければなりません。


そこで、sinc関数を3次関数で、畳み込みの和の範囲が-∞から∞なのを最も近い16点で近似しちゃおう!という大雑把な発想でC*sincを求めるのがキュービックコンボリューションというものなのです。


ね?全然大したことないでしょ。
分かったかな、2年前の私。