BMS, Movie, Illustrations, Programming

教科書的なバイリニア補間による画像縮小には、エイリアシング除去は含まれない(が、Photoshop はそうではない)という話

本当か? って思ったけど、教科書的にはそうらしいです。

画像縮小のときにあえてエイリアシングを残したいというケースもあまり無いと思うので、Photoshop の仕様は良い判断なんじゃないかと思います。

要するに、単に「バイリニア補間」と言っても、その中身はソフトウェアによって違うかもしれないっていうことですね。同じ言葉が異なるものに対して使われていると混乱が発生しがちというのはよくある話です。

例 1: CLIP STUDIO PAINT の例

いくつかのソフトでバイリニア補間による縮小を試してみました。4096x4096px の白黒二値画像を 32x32px に縮小し、見やすいように 512x512px にニアレストネイバー法で拡大してあります。

元画像 ソフトな輪郭(バイリニア法) 高精度(色の平均)

CLIP STUDIO PAINT のバイリニア法は、確かに教科書通りのバイリニア補間になっているようです。元の画像で横方向に連続した 2 ピクセルを抽出すると、ほとんど確実に白・白または黒・黒のペアになるため、バイリニア補間の結果もほとんど白と黒だけになるはずだからです。

余談:日常的に使う分には「高精度(色の平均)」が一番綺麗だと思います。CLIP STUDIO PAINT に実装されている他のアルゴリズムではエイリアシングが発生してしまうので、縮小する場合はこれ一択だと思います。名前から推測するに、ボックスフィルター(Pixel Mixing)相当のアルゴリズムであると予想。

例 2: Photoshop の例

Photoshop の場合。

元画像 バイリニア法

Photoshop のバイリニア法では高周波を抑制する処理が含まれていて、教科書通りのバイリニア補間ではないようです。というかこれ CLIP STUDIO の「高精度(色の平均)」と同じですね。ということで Photoshop で画像を縮小した場合は Pixel Mixing (あるいはその亜種) 相当の処理になるのではないかと考えられます。

例 3: Furikake の例

After Effects 用プラグインの Furikake の場合。パーティクルサイズは CLIP STUDIO PAINT の出力結果と一致するように調整してあります。

元画像 Bilinear Trilinear / Anisotropic Linear
Sample 2×2 Sample 4×4 Sample 16×16

Bilinear ではエイリアシングが発生していて、教科書通りのバイリニア補間になっているようです。なので、 Furikake の仕様がおかしいということではなく、Photoshop の表記が不正確だったということです。

Trilinear と名前が付いているものは、マニュアルによるとミップマップを使用したアルゴリズムで、ミップマップをバイリニア補間した結果同士を線形補間するというトリリニア法の一種になっているものと思われます。処理速度を追求した Furikake らしい仕様だと思います。

以下、Furikake のマニュアル PDF より引用。

Bilinear:バイリニア補間によるサンプリング方式です。
縮小して描画される場合にエイリアシングが発生しやすく、ジャギーが出ることがあります。

Trilinear:MipMap を用いた補間方式です。
縮小時でも Bilinear より滑らかな補間が行われます。

Anisotropic Linear:異方性フィルタリングを用いたサンプリング方式です。
3D Texture モードで斜めを向いたテクスチャに最適で、Trilinear より高品質に描画できます。


以下余談。縮小時のエイリアシングを防ぐためのアルゴリズム的な話を見ていきます。

解決法 1: Pixel Mixing(可変幅の台形カーネル)

Pixel Mixing では、移動平均的やボックスブラーに似たカーネルにより高周波を除去して、エイリアシングを抑えることができます。

一次元のみに着目して、拡大の場合には Bilinear、縮小の場合には Pixel Mixing を用いた場合の畳み込みカーネルを図示したものが以下の動画です。

この動画を見ると、畳み込みカーネルが突然ジャンプしたりせず、連続性を保っていることが分かります。

また、Bilinear 法(ここでは線形補間)が常に隣り合った 2 個のピクセルしか見ていないのに対し、Pixel Mixing ではより多くのピクセルを参照していることが分かります。これにより、より高品質な縮小を行うことができるようになります。

他には、カーネルに負の部分がないため、オーバーシュートが無いことも特徴です。

Pixel Mixing のデメリットとしては計算量が多いことが挙げられます。出力画像 1 ピクセルあたりの計算量が Bilinear では O(1) なのに対し、Pixel Mixing では入力画像のすべてのピクセルを見る必要があるので、拡大率 s に対して O(1/s^2) となってしまいます。

詳しくはググってください。

解決法 2: ミップマップとトリリニア補間

リアルタイム 3DCG レンダラーなどにおいて、処理速度を犠牲にせずに縮小時のエイリアシングを改善する方法として使われているものがミップマップです。これは、適切なアルゴリズムによって事前に画像を縮小し、レンダリング時にはその縮小された画像を参照するというものです。この縮小された画像をミップマップと呼びます。

ミップマップを生成する必要があるため、このアルゴリズム全体の計算量が少ないというわけではありませんが、ミップマップはキャッシュとして用いることができるため、3DCG やパーティクルシステムのように同じ画像を何度も異なる縮尺でスケーリングしなければならない場合に有用な手法です。

ただし、1 枚のミップマップを参照するだけでは、ミップマップの切り替え時にちらつきが発生してしまう可能性があるため、2 枚のミップマップそれぞれに対してバイリニア補間を行い、その結果同士を線形補間することで連続性を保つことができます。三方向に線形補間を行っているため、これはトリリニア法の一種となります。

詳しくはググってください。

解決法 3: 入力画像に対するローパス処理

入力画像に対して、縮小倍率に応じたカーネル幅のローパスフィルタを掛けることで、エイリアシングを抑制する方法も考えられます。この際のフィルタとしては、ボックスフィルタ、三角窓フィルタ、sinc フィルタ、ガウシアンブラーなどが考えられます。

以下の動画は、縮小倍率に応じた幅の三角窓を入力画像に畳み込んだ上で、バイリニア補間を行った場合のカーネルを示しています。

このように、連続性を保って計算されていることが分かります。

ただし、ローパスフィルタと補間という二段階の処理になっているため、他のアルゴリズムと比べると論理的整合性は弱いかもしれません。


任意スケールの平滑化カーネル $K(x/s)$ で $y(x)=\sum_{n=-\infty}^{\infty}K((x+n)/s)$ が一定にならず定数係数で正規化できないんだけどなんで??