- 最近傍補間法で3倍に拡大した画像
- hq3xアルゴリズムで3倍に拡大された画像


ピクセルアートのスケーリングアルゴリズムは、手描きの2Dピクセルアートグラフィックの外観を向上させるためのグラフィカルフィルタです。これらのアルゴリズムは、自動画像補正の一種です。ピクセルアートのスケーリングアルゴリズムは、画像の外観を維持することを目的とした 一般的な画像再スケーリング手法とは大きく異なる手法を採用しています。
ピクセルアートグラフィックは一般的に非常に低い解像度で使用されるため、個々のピクセルに細心の注意を払って色付けされます。その結果、複雑な形状を定義するために、多くの様式化された視覚的手がかりに依存するグラフィックが作成されます。このようなグラフィックの再スケーリングを処理するために、いくつかの特殊なアルゴリズム[ 1 ]が開発されています。
これらの特殊なアルゴリズムはピクセルアートのグラフィックの外観を向上させることができますが、その過程で変化が生じます。特に元の外観を忠実に再現することが目的の場合、こうした変化は望ましくない場合があります。
この技術の典型的な応用例は、アーケードやコンソールエミュレータにおける第4世代以前のビデオゲームの外観を向上させることであるため、多くのピクセルアートスケーリングアルゴリズムは、十分に小さい入力画像を60フレーム/秒でリアルタイムに実行できるように設計されています。そのため、この種のリアルタイム処理に使用できるプログラミング手法の種類には制約が課せられます。多くのアルゴリズムは特定のスケール係数でのみ動作します。最も一般的なスケール係数は2倍ですが、3倍、4倍、5倍、6倍も存在しますが、あまり使用されていません。
Mullard SAA5050テレテキスト文字生成チップ (1980) は、原始的なピクセルスケーリングアルゴリズムを使用して、内部ROMの低解像度表現から画面上に高解像度の文字を生成しました。内部的には、各文字の形状は5 × 9ピクセルのグリッドで定義され、対角線を平滑化することで補間され、特徴的な角張った形状で、上部と左側に 2 ピクセルの空白がある10 × 18ピクセルの文字が生成されました。このアルゴリズムはモノクロのソースデータでのみ機能し、ソースピクセルが「オン」か「オフ」かによって論理的に真または偽であると想定します。グリッドパターンの外側のピクセルはオフであると想定されます。[ 2 ] [ 3 ] [ 4 ]
アルゴリズムは次のように動作します。
ABC --\ 1 2 守備 --/ 3 4 1 = B | (A & E & !B & !D) 2 = B | (C & E & !B & !F) 3 = E | (!A & !E & B & D) 4 = E | (!C & !E & B & F)
このアルゴリズムには、以下のEagleアルゴリズムと同様に欠陥があることにご注意ください。4ピクセルのひし形パターンが現れた場合、そのパターンは拡張によって消去されてしまいます。SAA5050の内部文字ROMは、このパターンの使用を慎重に回避しています。
退化したケース:
* * * *
次のように変わります。
** **** ****** ****** **** **
エリック・ピクセル拡張(EPX)は、ルーカスアーツのエリック・ジョンストンが1992年頃に 開発したアルゴリズムである。ジョンストンは、 SCUMMエンジンのゲームをIBM PC(320×200×256色)から、その2倍程度の解像度で動作していた初期のカラーMacintoshコンピュータに移植する際に開発した。[ 5 ] このアルゴリズムは次のように動作し、Pの周囲に基づいてPを4つの新しいピクセルに拡張する。
1=P; 2=P; 3=P; 4=P; C==A => 1=Aの場合 A==B => 2=Bの場合 D==C => 3=Cの場合 B==D => 4=Dの場合 A、B、C、Dのうち3つ以上が同一である場合: 1=2=3=4=P
この同じアルゴリズムの後の実装(2001年頃に開発されたAdvMAME2×やScale2×など)は、若干効率的ですが、機能的には同じです。
1=P; 2=P; 3=P; 4=P; C==A かつ C!=D かつ A!=B の場合 => 1=A A==B かつ A!=C かつ B!=D の場合 => 2=B D==C かつ D!=B かつ C!=A の場合 => 3=C B==D かつ B!=A かつ D!=C の場合 => 4=D
AdvMAME2× は、dosbox.confオプションを介してDOSBoxで利用できます。 scaler=advmame2x
AdvMAME4×/Scale4× アルゴリズムは、EPX を 2 回適用して 4 倍の解像度を得るだけです。

AdvMAME3×/Scale3×アルゴリズム(DOSBoxではscaler=advmame3xdosbox.confオプションで利用可能)は、EPXを3×スケールに一般化したものと考えることができます。コーナーピクセルの計算はEPXと同様に行われます。
1=E; 2=E; 3=E; 4=E; 5=E; 6=E; 7=E; 8=E; 9=E; D==B かつ D!=H かつ B!=F の場合 => 1=D (D==B かつ D!=H かつ B!=F かつ E!=C) または (B==F かつ B!=D かつ F!=H かつ E!=A) の場合 => 2=B B==F かつ B!=D かつ F!=H の場合 => 3=F (H==D かつ H!=F かつ D!=B かつ E!=A) または (D==B かつ D!=H かつ B!=F かつ E!=G) の場合 => 4=D 5=E (B==F かつ B!=D かつ F!=H かつ E!=I) または (F==H かつ F!=B かつ H!=D かつ E!=C) の場合 => 6=F H==D かつ H!=F かつ D!=B の場合 => 7=D もし (F==H かつ F!=B かつ H!=D かつ E!=G) または (H==D かつ H!=F かつ D!=B かつ E!=I) ならば => 8=H F==H かつ F!=B かつ H!=D の場合 => 9=F
Sp00kyFoxによって開発されたScale3×の改良版ScaleFXと、Reverse-AAと組み合わせたScaleFX-Hybridというバージョンも存在する。[ 6 ] [ 7 ] [ 8 ]
Eagleの動作は次のようになります。入力ピクセルごとに4つの出力ピクセルを生成します。まず、4つの出力ピクセルすべてを、現在スケーリングしているピクセルの色(最近傍色)に設定します。次に、上、左、左斜め上の3つのピクセルを確認します。3つすべてが同じ色であれば、出力ピクセルの左上のピクセルを、最近傍色よりも優先してその色に設定します。4つのピクセルすべてに対して同様に処理し、次のピクセルに進みます。[ 9 ]
3×3ピクセルの入力行列(中心のピクセルがスケーリングされるピクセル)と2×2ピクセルの出力行列(つまりスケーリングされたピクセル) を想定する。
最初: |その後 . . . --\ CC |STU --\ 1 2 . C . --/ CC |VCW --/ 3 4 . . . |XYZ | V==S==T の場合 => 1=S | T==U==W の場合 => 2=U | V==X==Y => 3=X の場合 | W==Z==Y => 4=Zの場合
したがって、白い背景に黒いピクセルが1つだけある場合、そのピクセルは消えてしまいます。これはEagleアルゴリズムのバグですが、EPX、2xSaI、HQ2xなどの他のアルゴリズムによって解決されています。
2×SaI(2×スケールおよび補間エンジンの略)は、Eagleに着想を得ました。Kreedとしても知られるDerek Liauw Kie Faによって設計され、主にコンソールおよびコンピュータエミュレータでの使用を目的としており、この分野ではかなりの人気を博しています。ZSNESやVisualBoyAdvanceなど、多くの人気エミュレータは、このスケーリングアルゴリズムを機能として提供しています。このスケーリングアルゴリズムには、わずかに異なる複数のバージョンがあり、これらはSuper 2×SaIやSuper Eagleと呼ばれることがよくあります。

2xSaI ファミリは、以下の A でマークされたピクセルがスケーリングされる 4 × 4ピクセル マトリックスで動作します。
IEFJ GABK --\ WX HCDL --/ YZ MNOP
16ビットピクセルの場合、16ビットピクセル形式が565か55かに応じて変化するピクセルマスクを使用します。定数colorMask、lowPixelMask、qColorMask、qLowPixelMask、redBlueMaskはgreenMask16ビットマスクです。下位8ビットはどちらのピクセル形式でも同じです。
2 つの補間関数について説明します。
INTERPOLATE(uint32 A、UINT32 B)。 -- AとBの直線中点 (A == B) の場合は A を返します。 戻る ( ((A & カラーマスク) >> 1) + ((B & カラーマスク) >> 1) + (A & B & lowPixelMask) ); Q_INTERPOLATE(uint32 A, uint32 B, uint32 C, uint32 D) -- 双線形補間; A、B、C、Dの平均 x = ((A & qColorMask) >> 2) + ((B & qColorMask) >> 2) + ((C & qColorMask) >> 2) + ((D & qColorMask) >> 2); y = (A & qLowPixelMask) + (B & qLowPixelMask) + (C & qLowPixelMask) + (D & qLowPixelMask); y = (y >> 2) & qLowPixelMask; x + y を返します。
このアルゴリズムは、A、B、C、D について、 と が一致する対角線上の一致、A==DあるいはB!=Cその逆、あるいは両方が対角線上にあるか、あるいは対角線上の一致がないかをチェックします。これらの条件に基づいて、アルゴリズムは出力ピクセルごとに、A、B、C、D のいずれかを使用するか、あるいはこれら 4 つのみの補間を使用するかを決定します。2xSaI 任意スケーラーは、任意の画像を任意の解像度に拡大でき、双線形フィルタリングを使用してピクセルを補間します。
Kreedは[ 10 ]ソースコードをGNU一般公衆利用許諾書(GPL)の下で公開しているため、同ライセンスの下で公開されたプロジェクトで利用したい人は誰でも自由に利用できます。GPL以外のプロジェクトでKreedのソースコードを利用したい開発者は、Kreedの既存コードを一切使用せずにアルゴリズムを書き直す必要があります。
DosBoxではオプション経由で利用できますscaler=2xsai。
Maxim Stepinのhq2x、hq3x、hq4xは、それぞれ2:1、3:1、4:1のスケール係数に対応しています。各関数は、各ピクセルの色値をその8つの隣接ピクセルの色値と比較し、隣接ピクセルを近いか遠いかでマークし、事前に生成されたルックアップテーブルを使用して、対応する4、9、または16個の出力ピクセルそれぞれについて、入力ピクセルの値の適切な比率を計算します。hq3xファミリは、傾きが±0.5、±1、または±2で、入力時にアンチエイリアス処理されていない対角線を完全に平滑化します。それ以外の傾きの対角線は、出力時に2つの傾きが交互に現れます。また、非常に急な曲線も平滑化します。2xSaIとは異なり、出力にアンチエイリアス処理が施されます。[ 11 ] [ 8 ]
hq n xは当初、スーパーファミコンエミュレータZSNES用に開発されました。bsnesの作者は、hq2xのメモリ効率の高い実装をパブリックドメインで公開しました。[ 12 ] xBRの初期バージョンに匹敵する品質を持つシェーダーへの移植版が利用可能です。 [ 13 ]移植以前は、「scalehq」というシェーダーがhqxと混同されることがよくありました。[ 14 ]
このファミリーには、 xBR、xBRZ、xBR-Hybrid、Super xBR、xBR+3D、Super xBR+3D の6 つのフィルターがあります。
Hyllian によって作成された xBR ("scale by rules") は、HQx (パターン認識に基づく) とほぼ同じように動作し、上記のパターンが与えられた場合、HQx と同じ結果を生成します。[ 15 ]しかし、2 段階の補間ルールを使用することで HQx よりも進んでおり、アンチエイリアスされた直線や曲線などのより複雑なパターンをより適切に処理します。 スケーリングされた背景テクスチャは、HQx (実際には ScaleHQ であることが多い) のようにぼやけるのではなく、元の画像の鮮明な特徴を維持します。 最新の xBR バージョンはマルチパスであり、小さな詳細をより適切に保持できます。 また、xBR と Reverse-AA シェーダーを組み合わせた xBR-Hybrid というバージョンもあります。[ 16 ] xBR+3D は、2D 要素のみをフィルターする 3D マスクを備えたバージョンです。
ZenjuによるxBRZはxBRの改良版である。これはCPUベースのフィルタとしてC++でゼロから実装されている。[ 17 ] xBRのパターン認識と補間と同じ基本的な考え方を採用しているが、数ピクセルほどの微細な画像の詳細を保持するように設計された異なるルールセットを採用している。そのため、顔、特に目の詳細を拡大縮小する場合に有効である。xBRZはマルチコアCPUと64ビットアーキテクチャに最適化されており、シングルCPUコアで実行した場合でもHQxよりも40~60%優れたパフォーマンスを示す。アルファチャンネルによる画像の拡大縮小と、2倍から6倍までの整数倍の拡大縮小を サポートしている。
Super xBR [ 18 ] [ 19 ]は、2015年にHylianによって開発されたアルゴリズムです。既知の線形フィルタとxBRエッジ検出ルールを非線形的に組み合わせて使用します。2パスで動作し、画像を2倍(または再適用することで2の倍数)に拡大縮小できます。また、アンチリンギングフィルタも備えています。Super xBR+3Dは、2D要素のみをフィルタリングする3Dマスクを備えたバージョンです。C/C++で書き直されたSuper xBRバージョンもあります。[ 20 ] [ 8 ]

RotSpriteは、Xenowhirlによって開発されたスプライトのスケーリングおよび回転アルゴリズムです。最近傍回転アルゴリズムに比べてアーティファクトがはるかに少なく、EPXと同様に、画像に新しい色が追加されることはありません(ほとんどの補間システムとは異なります)。[ 21 ]
このアルゴリズムはまず、類似ピクセル(同一ピクセルではなく)を一致として扱う改良Scale2×アルゴリズムを用いて、画像を元のサイズの8倍に拡大する。次に、境界ピクセルではないサンプル点を優先することで、回転オフセットを計算する(オプション)。次に、近傍拡大・回転アルゴリズムを用いて回転画像を作成する。このアルゴリズムは、画像を元のサイズに縮小すると同時に回転させる。最後に、元画像の対応するピクセルが異なり、かつ、移動先ピクセルに3つの同一の近傍ピクセルがある場合、見落とされていた単一ピクセルの詳細を(オプションで)復元する。[ 22 ]
Fast RotSpriteは、Oleg Mekekechko氏がPixel Studioアプリ向けに開発した、ピクセルアート用の高速回転アルゴリズムです。RotSpriteをベースにしていますが、若干の画質低下はあるものの、より優れたパフォーマンスを実現しています。大きな画像をリアルタイムで処理できます。Fast RotSpriteは、8倍のアップスケールではなく、3倍のアップスケールを1回だけ使用します。その後、座標を丸めてすべてのピクセルを回転させます。最後に、新しい色を追加することなく3倍のダウンスケールを実行します。各ステップのすべての処理は独立しているため、並列処理が可能で、パフォーマンスを大幅に向上させます。
Kopf-Lischinskiアルゴリズムは、2011年の論文「Depixelizing Pixel Art」で説明されている、ピクセルアートから解像度に依存しないベクターグラフィックを抽出する新しい方法です。 [ 23 ] Python実装も利用可能です。[ 24 ]
このアルゴリズムはGPUに移植され、リアルタイムレンダリング用に最適化されています。このバリアントのソースコードは入手可能です。[ 25 ]
このセクションの文体やスタイルは、Wikipedia で使用されている百科事典的な文体を反映していない可能性があります。Wikipedia( 2016年5月) |
エッジ指向補間(EDI)は、統計的サンプリングを使用して画像を拡大する際の品質を保証するアップスケーリング手法を指します。[ 26 ] [ 27 ]以前にも、エッジを検出して線形補間のブレンド重みを生成したり、近傍の状態に応じてピクセルを分類して、その分類に基づいて異なる等方性補間スキームを使用したりする方法がいくつかありました。各補間アプローチは、近隣ピクセルの加重平均に要約されます。目的は、最適な重みを見つけることです。双線形補間では、すべての重みが均等に設定されます。双三次補間やsinc補間などの高次補間法では、隣接するピクセルだけでなく、より多くの近傍ピクセルが考慮されます。
NEDI(New Edge-Directed Interpolation)は、原画像における局所的な共分散を計算し、それを用いて高解像度での補間を適応させる。このフィルタファミリーのプロトタイプフィルタである。[ 28 ]
EDIUpsizer [ 29 ]は、NEDI(新しいエッジ指向補間)を用いて、画像を水平方向と垂直方向の両方で2倍にリサイズするリサンプリングフィルタです。[ 28 ] EDIUpsizerは、NEDIが細かい領域で生成する多くのアーティファクトを防ぐために、基本的なNEDIにいくつかの変更を加えています。これには、条件数テスト、適応型ウィンドウサイズ、[ 30 ]およびキャッピング制約が含まれます。NEDIに対するすべての変更と制約はオプション(オン/オフの切り替えが可能)であり、ユーザーが設定できます。このフィルタはやや遅いです。
FastEDIUpsizerは、EDIUpsizerの軽量版で、速度が若干向上しています。ウィンドウサイズは8×8の固定値を使用し、輝度平面上でのみNEDIを実行し、フォールバック補間法としてバイキュービック法またはバイリニア法のいずれかのみを使用します。
もう一つのエッジ指向補間フィルタ。スキャンライン上のすべてのピクセルに関係するコスト関数を最小化することで動作します。処理速度は遅いです。
EEDI2は、既存の画像を2⋅y(n)にコピーし、欠落しているフィールドを補間することで、画像を垂直方向に2倍にリサイズします。これは、デインターレースのためのエッジ方向の補間を目的としています(つまり、通常の画像のリサイズには適していませんが、同様に可能です)。EEDI2はTDeintとTIVTCの両方で使用できます。使用方法の詳細については、ディスカッションリンクを参照してください。[ 31 ]
SuperRes [ 32 ]シェーダーは、NEDI(またはその他のスケーリングアルゴリズム)と組み合わせて使用できる、異なるスケーリング手法を採用しています。この手法については、2014年に開発者のShiandow氏がDoom9フォーラムに投稿した記事で詳しく説明されています。[ 33 ]この手法は、NEDIのみを使用するよりも優れた結果をもたらすことが多く、NNEDI3に匹敵します。これらは現在、MPDNレンダリングスクリプトとしても利用可能です。
NNEDIは、フィールド内デインターレーサーの一種であり、画像を2の累乗倍に拡大するのにも使用できます。デインターレーサーとして使用する場合、フレームを取り込み、1つのフィールドを破棄し、保持されたフィールドの情報のみを使用して、不足しているピクセルを補間します。NNEDIには、現在までに3つの主要な世代があります。
オリジナル版のNNEDIは、YUY2とYV12の入力に対応しています。[ 34 ] NNEDI2はRGB24のサポートとアップスケーリングのための特別な関数を追加しましたnnedi2_rpow2。NNEDI3はNNEDI2を予測ニューラルネットワークで拡張しました。ネットワークのサイズと検査する近傍範囲は、速度と品質のトレードオフを考慮して調整可能です。[ 35 ]
これは画質と速度の両立を左右するオプションです。特定のリサイズ係数では、ニューロン数によるパフォーマンスの違いは通常小さくなりますが、画像サイズを4倍にすると、ニューロン数によるパフォーマンスの違いは大きくなります。解像度を2倍にするだけであれば、ニューロン数16個と256個の間で大きな違いは見られません。最高と最低のオプションでも、目立った違いはありますが、桁違いではありません。[ 36 ]
{{cite web}}: CS1 maint: アーカイブされたコピーをタイトルとして (リンク)