web-dev-qa-db-ja.com

ランツォシュを使用して画像を拡大縮小する背後にある考え方は何ですか?

私は画像スケーリングアルゴリズムに興味があり、双線形および双三次法を実装しました。しかし、ランツォシュやその他のより高品質の画像スケーリングのためのより洗練された方法について聞いたことがあり、それらがどのように機能するのか非常に興味があります。

ここで誰かがランツォシュを使用して画像をスケーリングする背後にある基本的な考え方(アップスケーリングとダウンスケーリングの両方)と、なぜそれがより高い品質をもたらすのかを説明できますか?

私はフーリエ解析のバックグラウンドを持っており、過去にいくつかの信号処理を行ったことがありますが、画像処理とは関係ありません。そのため、回答に「周波数応答」などの用語を使用することを恐れないでください:)

編集:私が本当に知りたいのは、補間に畳み込みフィルターを使用する背後にある概念と理論だと思います。

(注:ランツォシュ再サンプリングに関するウィキペディアの記事はすでに読んでいますが、十分な詳細がありませんでした)

どうもありがとう!

25
horseyguy

結果を判断するための主な基準は主観的であるため、画像処理用の特定のフィルターの選択は、ブラックアートのようなものです。コンピューターグラフィックスでは、最終的な質問はほとんどの場合、「見栄えが良いか」です。そこには良いフィルターがたくさんあり、最良のものからの選択はしばしば判断の呼びかけに帰着します。

そうは言っても、私はいくつかの理論を進めます...


信号処理のフーリエ解析に精通しているので、画像処理に適用するためにそれほど多くのことを知る必要はありません。直接関心のあるすべてのフィルターは「分離可能」です。つまり、基本的には、 xおよびy方向。これにより、(2-D)画像のリサンプリングの問題が(1-D)信号のリサンプリングの問題に軽減されます。時間(t)の関数ではなく、信号は座標軸の1つ(たとえばx)の関数です。他のすべてはまったく同じです。

最終的に、フィルターを使用する必要がある理由は、エイリアシングを回避するためです。解像度を下げる場合は、新しい低解像度でサポートされていない高頻度の元のデータをフィルターで除外する必要があります。そうしないと、追加されます。代わりに無関係な周波数に。

そう。元の周波数から不要な周波数を除外している間、元の信号をできるだけ多く保持する必要があります。また、保存する信号を歪めたくありません。最後に、不要な周波数を可能な限り完全に消します。これは、理論的には、優れたフィルターは周波数空間の「ボックス」関数である必要があることを意味します。カットオフを超える周波数では応答がゼロ、カットオフより低い周波数では応答が1、その間のステップ関数です。そして、理論的には、この応答は達成可能です。ご存知かもしれませんが、ストレート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なのか」という質問に答え、周波数応答などについてのアイデアを与えてくれることを願っています。

34
comingstorm