以前の続きでテクスチャのパーリンノイズの補間法の話です。
いい加減補間について調べようといろいろとプログラムして作ってみました。
テクスチャなので、上下と左右が繋がるように補間します。
8x8px → 256x256px と、各補間法で32倍拡大してみます。
最近傍補間(NearestNeighbor)(1×1の格子点を使用)
線形補間(Biliner)(2×2の格子点を使用)
三角関数による補間(Cosine)(2×2の格子点を使用)
5次のエルミート曲線による補間(2×2の格子点を使用)
バイキュービック法(Bicubic)
(4×4の格子点を用いたsinc関数の近似補間関数を用いる)
sinc関数はrect関数をフーリエ変換・逆フーリエ変換したもの。
Lanczos2
(4×4の格子点を用いた近似補間関数を用いない手法)
Lanczos3
(6×6の格子点を用いた近似補間関数を用いない手法)
近似関数を用いたバイキュービック法の方が、近似関数を用いないLanczos2より画質がいいと思う。速度も速いですし。Lanczos3はバイキュービック法とほぼ変わらない。近似関数とほぼ一致。
結論
綺麗に拡大したい。 → バイキュービック補完
早く綺麗に拡大したい → 3次のエルミート曲線による補間
速度重視で拡大したい → 最近傍補間
バイキュービック補間の係数については、koujinz blogさんのブログの「画像の拡大「Bicubic法」」を用いています。
この係数なんですが、Javaの※拡大機能のバイキュービック補間は、速度重視で多分違う係数を用いていると思う。上記の係数を用いた方が綺麗に補完できましたし。それか、固定小数点で計算していて誤差が出るとか?
※g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);の方法
.NET TIPSの「画像を高品質に拡大/縮小するには?」を見ると
.NETのバイキュービック補間でも「Bicubic」と「HighQualityBicubic」の2種類があるから、
きっと同じバイキュービック補間でも、係数が変えて速度変えるとかあるのかな。
というか「HighQualityBilinear」ってまじで線形補完なのか。どうやってるんだろう。
三角関数による補間とエルミート曲線による補間の元ネタは、t-potの管理人さんが執筆した「DirectX 9 シェーダプログラミングブック」のパーリンノイズの章です。一番後ろの方です。
コメント