読者です 読者をやめる 読者になる 読者になる

プログラムdeタマゴ

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

画像の限界の高周波って?

前回縮小の話で信号理論に基づいた話を少しだけしてみました。
実際の数値には触れませんでしたが、実際にはどの位の値が限界なのでしょうか。
べ、別に日曜日だってのに手頃に書くネタがないから話引っ張ってるって訳じゃないんだからねっ(`・д´・ ;)


1画素で取ることができるサンプルは当然一つです。1画素に二つも三つも情報はありません。
ある周波数を表すには、倍のサンプリングレートが必要なのは前回触れました。逆に言えば、ある周期の波を表すには、半分の長さの周期でサンプルを取っていく必要があります
隣と隣の画素間の距離は1px(ピクセル)ですから、表すことができる最も高周波の波は周期2pxと言うことになりそうです。


あれ?ちょっと待って下さい。隣の画素ってもう一種類ありますよね?
斜め方向。√2px距離離れている隣の画素です


こいつはいったいどのくらいの周波数を表せるのでしょうか。上で述べた定理に基づくと、周期2√2(≒2.83)pxの波までは表現できます。


と、言うことは最も高周波の波は周期2pxで、必ずエイリアスを発生させずに画像を表示させようと思ったら、最高で周期2.83pxの波が限界と言うことになります。

どうでしたでしょうか?
想像したとおりじゃん、大したことねーという人はきちんと標本化定理を理解しています。
それではお疲れ様でした。






まぁ、大嘘なんだけどね。(-_-)


ふむ、なるほど上の議論、間違ってる風はない。風はないけど間違ってるんです。


さて、斜め方向のサンプリング間隔。本当に√2pxなんでしょうか?
下の図をよく見て下さい。

画素の中心点にサンプリング点(赤い点)がある物として、画素を45度回転させてみました。
これではまだよく分かりにくいですね。補助線を入れてみましょう。

この補助線は、横方向のサンプリングによって復元できる波を表しています。
見えてきたでしょうか?

もうちょっとわかりやすくしましょう。波が復元できていると言うことは、線上の任意の点で、波の高さが分かっていると言うことです。
と言うことは事実上、以下の図の青い点の値は分かっていると言うことです。

単純に上下でサンプリングの位相がずれてるだけなので、当然ですね。



さて、この図で縦方向のサンプリング間隔はいくらですか?


そう、√2/2 pxです。

すなわち、斜め方向に表すことができる最大の高周波は、周期√2(≒1.41)pxという事なのです。

縦横方向よりも、斜め方向の方が高周波まで表現できるんですね。



いや、そんなの信じられん!
だって、斜め方向は1px幅の線描けねーだろ
縦横方向はエイリアスの発生なしに描くことができるぞ!バーカ!



ごもっともです。
その辺はピクセルが点ではなく面であり、形を持つこと等の影響も出てくる話になるので一概に周波数だけの話では語ることができませんが、百聞は一見にしかず。実際に例を見てみましょう。






順に周期2px,1.8px,1.6px,1.4pxの正弦波を描画した物です。
確かに、横方向には2pxの正弦波は綺麗に描けています。一方で斜め方向はすでに怪しい感じですね。
しかし、1.8,1.6と周期が短くなっていくとどうでしょうか。斜め方向ではあまり見た目に変化がないのに対して、横方向はなんだかもうすごいことになっていますね。1.6px周期に至っては5px〜7pxぐらいの周期になっちゃっています。

1.4pxになると斜め方向も限界を超えるので、よく見るとモアレのようなエイリアスが発生しています。



この図から斜め方向の方がサンプリングレートが高いと言うこと、納得していただけたかと思います。