結果を判断するための主な基準は主観的なものであるため、画像処理用の特定のフィルターの選択は、ある種の黒魔術です。コンピューター グラフィックスでは、最終的な質問はほとんどの場合、「見た目が良いかどうか」です。優れたフィルターは数多くありますが、最良のものを選択するかどうかは、判断に委ねられることがよくあります。
そうは言っても、私はいくつかの理論を進めます...
信号処理のフーリエ解析に精通しているので、それを画像処理に適用するためにそれ以上のことを知る必要はありません。すぐに関心のあるすべてのフィルターは「分離可能」です。 x および y 方向。これにより、(2-D) 画像のリサンプリングの問題が (1-D) 信号のリサンプリングの問題に変わります。時間 (t) の関数ではなく、信号はいずれかの座標軸 (たとえば x) の関数です。他のすべてはまったく同じです。
最終的に、フィルタをまったく使用する必要がある理由は、エイリアシングを回避するためです。解像度を下げる場合は、新しい低解像度がサポートしていない高周波数の元のデータを除外する必要があります。そうしないと、追加されます。代わりに無関係な周波数に。
そう。元の信号から不要な周波数を除外している間は、元の信号をできるだけ多く保持する必要があります。また、保持する信号を歪ませたくありません。最後に、不要な周波数をできるだけ完全に消したいと考えています。これは、理論的には、優れたフィルターは周波数空間の「ボックス」関数でなければならないことを意味します。つまり、カットオフより上の周波数ではゼロ応答、カットオフより下の周波数ではユニティ応答、およびその間のステップ関数です。そして、理論的には、この応答は達成可能です。ご存知かもしれませんが、ストレート sinc フィルターはまさにそれを提供します。
これには 2 つの問題があります。まず、ストレート sinc フィルターは制限がなく、急速に減衰しません。これは、単純な畳み込みを行うと非常に遅くなることを意味します。直接畳み込みよりも、FFT を使用して周波数空間でフィルタリングを行う方が高速です...
ただし、実際にストレート sinc フィルターを使用すると、実際には見栄えがよくないという問題があります。関連する質問が言うように、知覚的にリンギング アーティファクトがあり、実際には、「アンダーシュート」から生じる負の値を処理する完全に満足のいく方法はありません。
最後に、この問題に対処する 1 つの方法は、sinc フィルターから始めて (優れた理論的特性のため)、他の問題も解決する何かが得られるまで微調整することです。具体的には、これにより Lanczos フィルターのようなものが得られます。
Lanczos filter: L(x) = sinc(pi x) sinc(pi x/a) box(|x|<a)
frequency response: F[L(x)](f) = box(|f|<1/2) * box(|f|<1/2a) * sinc(2 pi f a)
[note that "*" here is convolution, not multiplication]
[also, I am ignoring normalization completely...]
- sinc(pi x) は、周波数応答の全体的な形状を決定します (a が大きいほど、周波数応答はボックス関数のようになります)。
- box(|x|<a) は有限サポートを提供するため、直接畳み込みを使用できます
- sinc(pi x/a) はボックスのエッジを滑らかにし、(結果として?同等に?)望ましくない高周波の除去を大幅に改善します。
- 最後の 2 つの要因 (「ウィンドウ」) もリンギングを抑えます。それらは、知覚的なアーティファクトと「アンダーシュート」の実際の発生率の両方を大幅に改善しますが、それらを完全に排除するわけではありません
これについて魔法はないことに注意してください。さまざまなウィンドウが利用可能で、ほぼ同様に機能します。また、a=1 と 2 の場合、周波数応答はステップ関数のようには見えません。しかし、これで「なぜ sinc なのか」という質問の答えが得られ、周波数応答などについてのアイデアが得られることを願っています。