SSブログ

楽譜アーカイブアプリ - その20 画像補間について [考え中の問題]

暮れ正月で10日、あいだが空いた。すっかり忘れた。自分でも驚いた。最後に書いた記事を読んだらまるで他人が書いた文章に思える。いや、もちろん脚色無し。マジで。今日丸一日かけて思い出そうとした。当然、何をしていたかは読めばわかるんだけど、興味の中心がどこにあったのかもうわからない。逆に全然違うことを思いついた。今日からそれを書く。

8.1  Bicubic補間のLanczos的拡張

前回、画像回転のための補間を考えていた。以前一度Bicubic補間が、なぜあんな係数を使っているのか、を考えたとこがあった。今回はせっかくなのでLanczos補間と同じ考え方でBicubic補間を拡張してみようと思う。これもまた、だからどうした、というような話だけどそっちに興味がわいたので。

8.1.1  補間再考

離散的な、例えば格子点の上だけにデータがある場合にその途中の点の値が欲しい場合がある。元の格子点上のデータからその途中のデータを作り出すことを補間という。

ここで、その格子点のデータがもともとは稠密なデータをサンプリングして取り出したものだった場合、そのサンプリングしたデータからどうやって元の連続なデータを回復すればいいか、と言う問題と同じことである。厳密に言えばサンプリングした時点で情報を失っているのでそもそも「回復」は不可能で「推測」か、率直にありていな言葉を使えば「捏造」と言うべきである。

このとき、
  1. 元のデータは連続である
  2. 格子点の値は変化させない
  3. 格子点で得られた情報以外は付加しない
とすると、サンプリング定理から補間にはsinc関数を使え、ということが導かれる。詳細は教科書なんかを見てもらいたい。

つまり、例えば1次元の場合、もともとの稠密なデータをf(x)として、格子点の位置をxk
0109eq0802.png
とすると、補間された関数g(x)は
0109eq0803.png
とすることができる。

式-8.3に従って補間をすると、格子点間隔の2倍2p以下の周期に対応する周波数成分は現れない。つまりサンプリングされたデータによる周波数成分以外を付加しない、ということになる。これは「かってな情報をでっち上げない」と言う意味で正直な補間方法である。

8.1.2  sinc関数について

ここで式-8.3にある関数は
0109eq0804.png
で、この関数のことをsinc関数という。この関数の形を図-8.1に示す。
0109fig0801.png
x=0以外の格子点で値が0になって、格子点と格子点の間は正の部分と負の部分が交互に現れてx=0から遠ざかるにつれて値は小さくなるような関数である。

普通のsinc関数の定義ではπ(パイ)のかけ算はないけど、ここではこうしておく方がのちのち簡単。

ちなみに、unixのmathライブラリのようにsinc関数を持たないライブラリを使ってsinc関数を定義に従って数値評価しようとすると問題が出る。x=0では0/0になって例外が発生する(定義式のx → 0の極限は1で、もちろんそこで微分可能である)。またその近傍でも小さい数どうしの割り算になって桁落ちが起こって値があばれることがある。初歩的な関数だけど数値評価には注意が必要な典型例である。

僕はこういう問題に何度か悩まされて身にしみてるんだけど、若い人は、こういうときの年寄りの話を素直に聴いた方がいい。続きは明日。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立01/09献立01/10 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。