Lanczosフィルタ

フィルタリングを行う必要が出て、性能が良いと聞いたLanczosフィルタを使おうと思って適当に調べた。


Lanczosというのはフィルタで使用する窓関数の考案者の名前で、読みはランチョスで良いみたい。
コルネリウス・ランチョス - Wikipedia


日本語Wikipediaの窓関数の項目に情報があるが、窓関数とフィルタカーネルの説明が混ざってしまっているように見える。
窓関数 - Wikipedia


英語版Wikipediaには独立した項目があって説明してある。
Lanczos resampling - Wikipedia
日本語版で混ざってしまっている窓とカーネルを分けると以下のような事だろうか?

Lanczos窓

正規化sinc関数SINC(x)の-1

Lanczosカーネル

Lanczos窓を正規化sinc関数にかけて有限長にしたカーネル
aの値でa次のLanczosカーネルやLanczos aカーネルなどと呼んだりするらしい。


画像などで使われるのはLanczos2やLanczos3程度のカーネルが多いということらしい。


SINCを窓関数で有限長にしているなら他の窓関数でもいいような気がするが、Lanczos窓は"keeps low frequencies and rejects high frequencies better than any (achievable) filter we've seen so far."とのことで、バランスが取れているみたいのことらしい。
Jim Blinn's Corner: Dixty Pixels - Jim Blinn - Google ブックス


設計時にフィルタ長のみで係数が決まる(ガウシアンだとσとかが必要)なのと、SINCベースなのでサンプリング周期さえ決まれば係数が一意に求められるとかがメリットなのかなあ…?
あと今日微分してみたらx'=a or -aの点で傾きが0になるのでSINCを途中でぶった切ったり、適当な窓関数を使うのに比べると滑らかとも言える。


Lanczos1を画像の縮小に使ってみたところ、σを適当に決めたガウシアンカーネル移動平均と切り捨てよりは綺麗になっているように見えた。
設計も楽なので、とりあえず画像の時はこれを使うのは良いかも。


ただ、Lanczos2以上は係数に負が含まれるので、画像だと負の値に注意が必要。