N2
NanToo
画像スケーリングのアルゴリズム — Lanczos 1956 から Mitchell-Netravali 1988、bilinear/bicubic の数学
GDESIGN
デザイン11 分で読める

画像スケーリングのアルゴリズム — Lanczos 1956 から Mitchell-Netravali 1988、bilinear/bicubic の数学

「写真を 2 倍に拡大したらピクセルがガビガビになった」「縮小したらアンテナが消えた」「リサイズした文字がなんだかぼやけている」 — 全部、画像スケーリングのアルゴリズム選択が原因です。本記事では信号処理の基礎である Nyquist-Shannon サンプリング定理 (1928 / 1949) を出発点に、Lanczos 1956、Catmull-Rom 1974、Mitchell-Netravali 1988 SIGGRAPH の原典までを辿りつつ、Nearest / Bilinear / Bicubic / Lanczos の数学的差異と用途を整理します。

#画像処理#Lanczos#Bicubic#Nyquist-Shannon#信号処理

なぜ「スケーリング」は数学的に難しいのか

画像は離散的なピクセルの配列です。100×100 px の画像を 200×200 に拡大するとき、新しい 4 倍のピクセル値はどこから持ってくるのか — 単純そうで根が深い問題です。

  • 拡大 (upscaling): 元になかった中間値を「補間」して作る必要がある
  • 縮小 (downscaling): 複数のピクセルを 1 つにまとめる必要がある (情報を捨てる)

どちらも本質的には「元の連続信号を再構成し、新しい解像度でサンプリングし直す」操作です。離散信号と連続信号の往復が伴うため、信号処理の理論が必要になります。

理論的基盤 — Nyquist-Shannon サンプリング定理

1928 年に Harry Nyquist (Bell Labs) が "Certain Topics in Telegraph Transmission Theory" AIEE Trans. で、1949 年に Claude Shannon が "Communication in the Presence of Noise" Proc. IRE で確立した標本化定理。画像処理にも例外なく適用されます。

連続信号の最大周波数 = f_max
情報を失わずサンプリングするには
サンプリング周波数 ≥ 2·f_max

逆に言うと、サンプリング周波数の半分 (Nyquist 周波数) を超える成分があると「エイリアス (折り返し雑音)」が発生する。これが画像縮小時のモアレ・ジャギー・ストロボ効果の正体です。

例: 1000×1000 の写真を 100×100 に縮小するとき、1/10 のサンプリングで再構成するためには、元画像の高周波成分 (周波数 ≥ 1/(2×10) = 1/20 px⁻¹) を事前にローパスフィルタで除去する必要がある。これを怠ると、細い線や格子模様が消えたり、別の柄に化けたりします。

つまり「縮小 = ローパスフィルタ + サンプリング」、「拡大 = サンプリング + 補間 (高周波の充填)」という 2 段階処理が原理的に必要です。

Nearest Neighbor — 最速・最低品質

最も単純な手法。新しい位置に対応する元画像の最も近いピクセルをそのまま使う

output(x, y) = input(round(x / scale_x), round(y / scale_y))

長所:

  • 計算量 O(1) 1 ピクセルあたり 1 メモリアクセス
  • ピクセル値を一切変えない (色保存)
  • ピクセルアート・ドット絵にはこれ一択 (補間すると意図したカクカク感が消える)

短所:

  • 拡大: 角ばったジャギー (階段状)
  • 縮小: ローパスフィルタなしのため重大なエイリアス

CSS の image-rendering: pixelated はこのアルゴリズムを指定する標準値で、Web サイトのレトロゲーム表現や QR コード描画で使われます。

Bilinear — 4 近傍の線形補間

新しいピクセルの位置を囲む 4 つの元ピクセルを、距離に反比例した重みで平均する。x 方向と y 方向の線形補間を 2 段階に行うため "bi-linear"。

// (x, y) が 4 つの元ピクセル (x0,y0), (x1,y0), (x0,y1), (x1,y1) に挟まれているとき
fx = x - x0,  fy = y - y0
output(x, y) =
  (1-fx)(1-fy) · I(x0, y0)
+    fx (1-fy) · I(x1, y0)
+ (1-fx)   fy  · I(x0, y1)
+    fx     fy · I(x1, y1)

計算量 O(4) で軽く、滑らかさが格段に上がる。GPU のテクスチャマッピングはほぼこれ (ハードウェア実装あり)。

ただし周波数特性は「三角窓」なので、Nyquist 周波数の半分くらいから減衰し始め、高周波成分はバッサリ落ちる → 結果は「ぼやけ」気味。Web ページの自動リサイズ縮小などで使われ、CSS の image-rendering: auto のデフォルトはほぼこれ相当。

Bicubic — 16 近傍の 3 次補間

4×4 = 16 ピクセルを使い、3 次多項式で補間。bilinear より計算量は 4 倍だが、シャープさが格段に向上。

1974 年 Edwin Catmull と Raphael Rom が "A class of local interpolating splines" でその一形態 (Catmull-Rom スプライン) を発表。一般的な bicubic はこの spline を 2D 拡張したもの。

// 1D 3次重み関数 (Keys 1981)
W(x) = (a+2)|x|³ - (a+3)|x|² + 1   if |x| ≤ 1
     = a|x|³ - 5a|x|² + 8a|x| - 4a if 1 < |x| ≤ 2
     = 0                            otherwise
// パラメータ a (-0.5 〜 -1.0 が一般的)

係数 a によりシャープネスが変わる。Photoshop の "Bicubic Sharper" / "Bicubic Smoother" はこれを使い分けている。

  • a = -0.5: Catmull-Rom (Photoshop "Bicubic Sharper")
  • a = -0.75: Mitchell-Netravali の 1 例 (B=0, C=0.75 と等価)
  • a = -1.0: Cubic Convolution (Keys 1981 の標準値)

Mitchell-Netravali 1988 — 万能の 3 次フィルタ族

1988 年 SIGGRAPH で Don Mitchell と Arun Netravali が発表した "Reconstruction filters in computer-graphics" は、3 次補間を 2 つのパラメータ B, C で連続的に表現する家族を提案しました。

// 1D 重み関数 (B, C ∈ [0, 1])
W(x) = (1/6) ·
  ┌  (12 - 9B - 6C) |x|³  + (-18 + 12B + 6C) |x|²  + (6 - 2B)  if |x| ≤ 1
  │  (-B - 6C) |x|³  + (6B + 30C) |x|²  + (-12B - 48C) |x|  + (8B + 24C)  if 1 < |x| ≤ 2
  └  0  otherwise

パラメータの組み合わせで主要フィルタが全部出る:

(B, C)名前特徴
(0, 0)Hermite cubicシンプル線形に近い
(0, 0.5)Catmull-Romシャープ・コントラスト保存
(0, 1)Cubic Cardinal過剰シャープ・リンギング大
(1, 0)Cubic B-spline滑らか・ぼやけ気味
(1/3, 1/3)Mitchell-NetravaliSIGGRAPH 推奨。バランス最良

Mitchell と Netravali は心理物理学的評価実験を行い、被験者の主観評価で B=1/3, C=1/3 が最適と結論。2D 拡張は x, y 独立に同じカーネルを適用 (separable filter)。

FFmpeg / ImageMagick / Pillow など主要ライブラリの "Mitchell" オプションはこの (1/3, 1/3) を指す。デフォルトとしては最も無難な選択肢です。

Lanczos — sinc 関数による「理論的最良」近似

1956 年、ハンガリー出身の数学者 Cornelius Lanczos"Applied Analysis" (Prentice-Hall) で発表した補間法。理論上、理想ローパスフィルタ = sinc 関数に基づきます。

sinc(x) = sin(πx) / (πx)         (sinc(0) = 1 と定義)

// Lanczos カーネル (a パラメータでサポート幅を決める)
L(x) = sinc(x) · sinc(x/a)   if -a ≤ x < a
     = 0                      otherwise

sinc は無限に伸びるリンギングを持つため、そのままでは実装不可能。Lanczos は 2 つ目の sinc で「窓」(window) をかけることで有限サポートに切り詰めるアイデアを提案しました。

パラメータ a (lobes 数):

  • a = 2 (Lanczos2): 4×4 = 16 近傍。bicubic と同じ範囲
  • a = 3 (Lanczos3): 6×6 = 36 近傍。Photoshop / GIMP / FFmpeg のデフォルト
  • a = 4 (Lanczos4): 8×8 = 64 近傍。さらに高品質、計算重

長所:

  • sinc 由来でエッジ保存が極めて良い (シャープ)
  • 縮小・拡大ともに最高品質クラス

短所:

  • 計算量大 (Lanczos3 で bilinear の ~9 倍)
  • 強いエッジ周辺にリンギング (アンダーシュート/オーバーシュート) が出ることがある

縮小と拡大で別アルゴリズムが必要な理由

多くのライブラリは「拡大用」と「縮小用」で別の処理を持っています。

拡大時: 元画像のピクセル間に「中間値」を作る → 補間 (interpolation) 寄り

  • 適切なフィルタ: Bicubic / Lanczos
  • 2 倍程度なら違いが顕著、3 倍以上は AI 系 (Real-ESRGAN 等) が圧倒的

縮小時: 複数ピクセルを 1 つに圧縮 → ローパス + サンプリング (decimation)

  • 適切なフィルタ: Box (面積平均) / Lanczos / Mitchell-Netravali
  • 大きく縮小するとき (1/4 以下) は Box average (面積平均) が最速で品質も良い
  • 2 倍程度の縮小は Lanczos3 がエッジ保存で優秀

Pillow (Python) の Image.thumbnail() は内部で 拡大かどうかを判定して適切なフィルタを選択しています。FFmpeg の swscale は 14 種類のアルゴリズムを切替可能。

実用ガイド — どれをいつ使うか

用途推奨アルゴリズム理由
ピクセルアート・ドット絵 (拡大) Nearest カクカク感を保持
QR コード / バーコード (拡大) Nearest 輪郭をシャープに保ちスキャン精度向上
UI のリアルタイム描画 Bilinear 軽量・GPU 最適化済
サムネイル生成 (Web 一般) Bicubic / Mitchell 速度と品質のバランス
写真の縮小 (印刷・配信用) Lanczos3 + 弱い unsharp エッジ保存最良
写真の大幅拡大 AI 系 (Real-ESRGAN, waifu2x 等) ピクセル補間では限界
1/4 以下への大縮小 Box (面積平均) 最速 + 高品質

本サイトの 画像変換, 画像圧縮, GIF 作成 ツールはサーバ側で sharp (libvips ベース) を使用。libvips のデフォルトは縮小: Box (大縮小) + Lanczos3 (微調整)、拡大: Bicubic です。

ブラウザでの制御 — CSS image-rendering

CSS でブラウザ自動スケーリングのアルゴリズムを指定できます。

img {
  image-rendering: auto;          /* デフォルト (実装は Bilinear/Bicubic) */
  image-rendering: pixelated;     /* Nearest neighbor (CSS Images Level 4) */
  image-rendering: crisp-edges;   /* スケーリング控えめ + シャープ保存 */
  image-rendering: smooth;        /* 滑らか優先 */
}

W3C CSS Images Level 4 で標準化された値。Chrome / Firefox / Safari すべて対応。ピクセルアート・QR コード・ドット絵を拡大表示するときは pixelated を必ず指定してください。デフォルトの bilinear だと意図しないぼやけが発生します。

現代の AI 拡大とサンプリング理論

2018 年以降、ESRGAN / Real-ESRGAN / Stable Diffusion Upscaler などの深層学習ベースの超解像技術が普及。これらは:

  • 古典フィルタ (Bicubic 等) で 4 倍程度の拡大が限界 (ぼやけ vs ジャギー)
  • AI は学習データから「もっともらしい高周波を生成」(Hallucination) する

注意: AI 拡大は「忠実な情報復元」ではない。元画像にない情報を作り出すため、医療画像・法廷証拠など正確性が要求される用途では Lanczos などの古典手法が引き続き標準です。AI は「自然画像で見栄えが良い」ことが目的。

Nyquist-Shannon の理論的上限自体は変わらず、AI は「事前知識による補間」と捉えるのが正しい理解です。

まとめ

  • 画像スケーリング = 連続信号の再構成 + 新解像度サンプリング
  • Nyquist-Shannon (1928/1949): エイリアス防止にローパスフィルタ必須
  • Nearest: ピクセルアート専用、それ以外は不可
  • Bilinear: 速いがぼやけ気味。GPU テクスチャマッピングの標準
  • Bicubic (Catmull-Rom 等): バランス良し、汎用デフォルト
  • Mitchell-Netravali (1988, B=C=1/3): SIGGRAPH 推奨、最良の中庸
  • Lanczos3 (1956): sinc 由来で最高品質、Photoshop/FFmpeg デフォルト
  • 縮小と拡大で別アルゴリズムが原則必要
  • AI 超解像は「Hallucination」、忠実性が必要な用途は古典手法

参考文献・ソース

記事作成に関する注記

本記事は AI(大規模言語モデル)を編集補助として活用して作成しています。 公開前に編集者が内容を確認していますが、事実誤認・仕様の解釈ミス・最新情報との齟齬が含まれる可能性があります。 重要な判断を行う際は、本文中の一次ソースや公式ドキュメントを必ずご自身でご確認ください。 誤りにお気づきの場合は、お問い合わせフォームよりご連絡いただけると助かります。

🔧 関連ツール

📚 関連記事