Pillowのリサイズ（ダウンスケール）の速度比較

　Pythonの画像処理ライブラリPillow（PIL）における`Image.resize()`メソッドを用いた画像ダウンスケール処理について、異なるリサンプリング方式の処理速度を比較しました。

## TL;DR

比較したリサンプリング方式：NEAREST, BOX, BILINEAR, HAMMING, BICUBIC, LANCZOS

- **NEAREST法の圧倒的な処理速度優位性**
    - NEAREST法は他のリサンプリング方式と比較して、処理速度面で圧倒的に優位
    - 特に小さなサイズへのリサイズ時に顕著で、他の方式と比べて数十倍から数百倍高速
- **出力サイズと処理速度の関係性**
    - リサイズ先のサイズが小さくなるほど処理時間は短縮されるが、NEAREST法のみが顕著な速度向上を示す
    - 他の方式は出力サイズによる処理時間の変化が比較的小さい
- **アスペクト比が処理時間に与える影響**
    - 正方形へのリサイズとアスペクト比を維持したリサイズでは、処理時間に大きな差はない
- **画質の視覚的比較結果**
    - 目視による比較では、NEAREST法は他の方法と比べて明らかに画質が劣る
    - それ以外の方式間の画質差は微細で、通常の見方では区別が難しい

## 目次

- [TL;DR](#tldr)
- [目次](#目次)
- [Pillowのリサイズについて](#pillowのリサイズについて)
  - [Pillowのリサイズ処理](#pillowのリサイズ処理)
  - [リサンプリング方式](#リサンプリング方式)
- [実験環境](#実験環境)
  - [データ（画像）の説明](#データ画像の説明)
  - [ハードウェア・ソフトウェア環境](#ハードウェアソフトウェア環境)
- [検証結果](#検証結果)
  - [固定サイズへのリサイズ](#固定サイズへのリサイズ)
  - [アスペクト比を維持してリサイズ](#アスペクト比を維持してリサイズ)
  - [リサイズされた画像の品質](#リサイズされた画像の品質)
- [まとめ](#まとめ)


## Pillowのリサイズについて

### Pillowのリサイズ処理

　Pillowでは、以下のように画像を読み込み、リサイズすることができます。ここでは、例として256×256ピクセルに、LANCZOS法（`Image.LANCZOS`）を用いてリサイズするコードを示します。

```python
from PIL import Image

image = Image.open("path/to/image.png")

width, height = (256, 256)
resample = Image.LANCZOS
resized = image.resize((width, height), resample)
```

　このコードにおいて、`resample`パラメータで指定するLANCZOS法は複数あるリサンプリング方式の一つです。

### リサンプリング方式

　Pillowでは、画像のリサイズ（拡大・縮小）を行う際に、以下のリサンプリング方式から選択できます。リサンプリングとは、画像のサイズ変更時に、出力画像の各ピクセル値をどのように計算するかを決める方法です。

| 手法 | 説明 | 品質 | 速度 |
|---|---| :--: | :--: |
| `NEAREST` | 入力画像から最も近いピクセルを1つ選択します。<br>他のすべての入力ピクセルは無視されます。 | 低 | 高 |
| `BOX` | ソース画像の各ピクセルが同一の重みで出力画像の<br>1ピクセルに寄与します。アップスケーリングの場合は、<br>NEARESTと同等です。 |
| `BILINEAR` | 出力ピクセル値に寄与する可能性のあるすべての<br>ピクセルに対して線形補間を使用します。 |
| `HAMMING` | BILINEARよりも鮮明な画像を生成し、BOXのような<br>ローカルレベルでの位置ずれがありません。|
| `BICUBIC` | 出力ピクセル値に対して三次補間を使用します。 |
| `LANCZOS` | 高品質のLanczosフィルター（切り捨てられたsinc関数）<br>を使用して出力ピクセル値を計算します。 | 高 | 低 |

（参考：[Concepts/Filters](https://pillow.readthedocs.io/en/stable/handbook/concepts.html#filters); いずれもリサイズ時におけるピクセル値の計算方法を示しています。）

　各リサンプリング方式は、画質と処理速度のトレードオフが異なります。一般に、品質が高くなるほど計算量が増加し、処理時間が長くなる傾向があるといわれています。

　しかしながら、これらのリサンプリング方式の処理速度差や、リサイズ先のサイズによる処理時間の変化については、公式ドキュメントやWeb上の情報が限られていたため、本検証を実施しました。

## 実験環境

### データ（画像）の説明

　本検証では、主に縦長（Portrait）画像と一部横長（Landscape）画像を含む計265枚の画像データセットを使用しました。これらの画像は2K品質に近い解像度を持ち、カラー画像とグレースケール画像が混在しています。画像データセットの特性を以下の表に示します。

**表1: 画像データセットの特性**

| データ特性 | 縦長画像 (Portrait) | 横長画像 (Landscape) |
| --- | :--: | :--: |
| サンプル数 | $248$ | $17$ |
| 平均幅 [px] | $1316.67 \pm 186.89$ | $1552.76 \pm 419.33$ |
| 平均高さ [px] | $1850.70 \pm 283.78$ | $1286.94 \pm 427.50$ |
| 平均アスペクト比 | $0.72 \pm 0.07$ | $1.24 \pm 0.15$ |

### ハードウェア・ソフトウェア環境

　実験は以下の環境で実施しました。

- CPU: Intel Core i5-1130G7 @ 1.10GHz
- メモリ: 16GB DDR4
- OS: Windows 11 24H2
- Python: 3.9.10
- Pillow: 11.1.0

## 検証結果

### 固定サイズへのリサイズ

　各画像に対して、異なるリサンプリング方式を用いて10回ずつリサイズを実行し、その平均処理時間を計測しました。

　表2に測定結果を示します。左端の列はリサイズ後の出力サイズ（幅×高さ）を表し、各リサンプリング方式における1回あたりの平均処理時間をミリ秒単位で示しています。なお、NEAREST法は他の方式と比較して処理時間が著しく短いため、より細かい桁数で表示しています。

**表2: 固定サイズへのリサイズにおける処理時間比較**

| サイズ<br>$(w, h) \space\mathrm{[px]}$ | `NEAREST`<br> [ms] | `BOX`<br> [ms] | `BILINEAR`<br> [ms] | `HAMMING`<br> [ms] | `BICUBIC`<br> [ms] | `LANCZOS`<br> [ms] |
|--------|--------------|----------|---------------|--------------|--------------|--------------|
| $(512,512)$ | $ 2.8973 \pm 0.9634$ | $15.1 \pm 5.2$ | $18.8 \pm 6.3$ | $18.8 \pm 5.9$ | $25.8 \pm 7.9$ | $34.9 \pm 12.0$ |
| $(256,256)$ | $ 0.0994 \pm 0.0184$ | $11.7 \pm 3.8$ | $14.6 \pm 4.7$ | $14.7 \pm 4.8$ | $23.1 \pm 7.6$ | $32.5 \pm 10.8$ |
| $(128,128)$ | $ 0.0355 \pm 0.0112$ | $10.0 \pm 3.6$ | $13.8 \pm 4.9$ | $13.8 \pm 4.9$ | $21.4 \pm 6.9$ | $28.1 \pm 9.1$ |
| $(64,64)$ | $ 0.0177 \pm 0.0058$ | $10.1 \pm 3.6$ | $13.5 \pm 4.6$ | $13.5 \pm 4.6$ | $19.6 \pm 6.6$ | $25.7 \pm 8.5$ |
| $(32,32)$ | $ 0.0126 \pm 0.0056$ | $10.5 \pm 3.8$ | $13.1 \pm 4.6$ | $13.1 \pm 4.7$ | $18.6 \pm 6.4$ | $24.0 \pm 8.1$ |
| $(16,16)$ | $ 0.0118 \pm 0.0047$ | $11.0 \pm 4.4$ | $13.7 \pm 5.2$ | $13.7 \pm 5.4$ | $18.9 \pm 7.2$ | $23.7 \pm 8.4$ |

　表からわかるように、NEAREST法は他の方式と比較して桁違いに高速であることが明確です。特に小サイズへのリサイズ時（256x256以下）では、他の方式に比べて数百倍もの速度差が生じています。また、すべてのリサンプリング方式において、出力サイズが小さくなるほど処理時間が短縮される傾向にありますが、この傾向はNEARESTでのみ顕著であり、他の方式では比較的緩やかです。特に16x16などの極小サイズでは、BOX法以降の方式において処理時間がわずかに増加する現象も観察されました。

**その他考察**

1. **NEAREST法の圧倒的速度優位性**: NEAREST法は他のすべての方式と比較して処理速度が著しく高速です。特に小サイズへのリサイズ時には、その差は最大で数百倍に達します。大量画像処理やリアルタイム処理を要するアプリケーションにおいて極めて有効です

2. **高品質リサンプリングのコスト**: BICUBIC法とLANCZOS法は最も計算コストが高く、LANCZOS法はNEAREST法と比較して数十～数百倍、BILINEAR法と比較しても約2倍の処理時間を要します。これらは最終成果物の品質が最優先される場合にのみ選択すべきです

### アスペクト比を維持してリサイズ

　前節では固定サイズへのリサイズを検証しましたが、実際のアプリケーションでは画像のアスペクト比を維持したままリサイズすることも多く行われます。本節では、元画像のアスペクト比を保持しながら、指定した総ピクセル数になるようリサイズした場合の処理時間を測定しました。

　具体的には、元画像のアスペクト比 $r = w/h$（$w$は幅、$h$は高さ）を維持しつつ、出力画像の総ピクセル数が指定値 $N_{px}$ に近づくように、以下の式でリサイズ後の高さ $h'$ と幅 $w'$ を算出しました：

$$h' = \sqrt{\frac{N_{px}}{r}}$$

$$w' = h' \times r$$

　各画像に対して異なるリサンプリング方式を用いて10回ずつリサイズを実行し、その平均処理時間を計測しました。以下の表に結果を示します。

**表3: アスペクト比を維持してリサイズにおける処理時間比較**

| 総ピクセル数 <br> $N_{px} \text{[px]}$ | `NEAREST`<br> [ms] | `BOX`<br> [ms] | `BILINEAR`<br> [ms] | `HAMMING`<br> [ms] | `BICUBIC`<br> [ms] | `LANCZOS`<br> [ms] |
|--------------| :-: | :-: | :-: | :-: | :-: | :-: |
| $262144$ | $ 3.0414 \pm 0.8889$ | $14.9 \pm 4.8$ | $18.7 \pm 5.9$ | $18.6 \pm 5.4$ | $25.9 \pm 8.3$ | $36.1 \pm 11.9$ |
| $65536$ | $ 0.1096 \pm 0.0321$ | $13.8 \pm 5.3$ | $17.0 \pm 6.8$ | $16.9 \pm 6.3$ | $25.7 \pm 9.2$ | $36.5 \pm 12.5$ |
| $16384$ | $ 0.0464 \pm 0.0148$ | $11.4 \pm 4.3$ | $15.4 \pm 5.8$ | $15.4 \pm 5.7$ | $23.4 \pm 7.9$ | $30.6 \pm 10.0$ |
| $4096$ | $ 0.0260 \pm 0.0078$ | $11.0 \pm 4.3$ | $14.5 \pm 5.3$ | $14.7 \pm 5.7$ | $21.2 \pm 8.1$ | $27.6 \pm 9.6$ |
| $1024$ | $ 0.0160 \pm 0.0069$ | $10.1 \pm 3.8$ | $12.9 \pm 4.6$ | $13.0 \pm 4.6$ | $18.4 \pm 6.4$ | $23.7 \pm 8.2$ |
| $256$ | $ 0.0148 \pm 0.0069$ | $10.1 \pm 3.7$ | $12.6 \pm 4.5$ | $12.7 \pm 4.5$ | $17.6 \pm 6.6$ | $22.1 \pm 7.7$ |

　表3から、アスペクト比を維持したリサイズにおいても、固定サイズへのリサイズと同様のパフォーマンス特性が観察されました。具体的には、NEAREST法が全条件下で最も高速であり、LANCZOS法が最も計算コストの高いリサンプリング方式であることが再確認されました。

　また、出力画像の総ピクセル数が減少するに従って処理時間も短縮される傾向が見られますが、NEAREST法を除く他のすべての方式では、その減少率は比較的小さいことが特筆されます。特に注目すべき点として、65,536ピクセル（概ね256×256に相当）以下のサイズへのリサイズにおいては、NEAREST法と他の方式との間に顕著な性能差が存在する一方、BOX、BILINEAR、HAMMING、BICUBIC、LANCZOSといった高品質リサンプリング方式間の処理時間差は相対的に縮小する傾向が認められました。

### リサイズされた画像の品質

　最後に、異なるリサンプリング方式を用いてリサイズした画像の品質を比較しました。

<details><summary>元画像（クリックで表示）</summary><div>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/4eb048b7-d1b0-45c2-b70e-c8bd2631fefe.jpeg">

> [元画像](https://publicdomainq.net/kitten-cat-animal-0002045/): CC0; $4909 \times 3648$ px
</div></details>

　6つのリサンプリング手法を視覚的に比較するため、元画像を固定サイズ（$512 \times 512$ px）およびアスペクト比を維持したサイズ（$593 \times 441 = 261513$ px）にリサイズしました。

　目視比較の結果、NEAREST法では色の不連続性（白抜け）が観察され、品質の低下が顕著でした。一方、他のリサンプリング方式（BOX, BILINEAR, HAMMING, BICUBIC, LANCZOS）間の差異は微細であり、通常の視認条件下では識別が困難です。詳細な観察においては、BILINEAR法が他の高品質リサンプリング方式と比較してわずかに平滑化（ボケ）の傾向を示していますが、実用上の差異は限定的であることが確認されました。

<details><summary>リサイズ後の画像（クリックで表示）</summary><div>

| 方式 | 固定サイズ<br> $(512,512)$ | アスペクト比維持<br> $262144 \text{px}$ |
|---|---|---|
| `NEAREST` | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/be02f651-8552-4e18-8e0d-28cf455fb5b5.png' width=512 alt='NEAREST-square'> | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/2e941bcf-df75-44dc-ac5f-7a078bdeb468.png' width=593 alt='NEAREST-aspect'> |
| `BOX` | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/480799db-d5d5-46c1-8a9d-278103990989.png' width=512 alt='BOX-square'> | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/c8f15cbf-a5d1-4458-865f-3d815e016c91.png' width=593 alt='BOX-aspect'> |
| `BILINEAR` | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/c21c7989-c951-4a48-a8a9-0d8e326342b9.png' width=512 alt='BILINEAR-square'> | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/5fba1b32-4120-44b4-8056-69edf8352531.png' width=593 alt='BILINEAR-aspect'> |
| `HAMMING` | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/6807015a-4b44-41b5-974a-5a8ccaeebf83.png' width=512 alt='HAMMING-square'> | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/9d2f941a-7220-4102-9726-71f2146c6463.png' width=593 alt='HAMMING-aspect'>|
| `BICUBIC` | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/92a77afd-099c-4876-8784-2c1ebbdbf572.png' width=512 alt='BICUBIC-square'> | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/739a014d-b176-4c3b-b4fe-a06055e50195.png' width=593 alt='BICUBIC-aspect'> |
| `LANCZOS` | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/4ffe6fb8-4849-46e0-a8f0-3246102c0e95.png' width=512 alt='LANCZOS-square'> | <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3734488/007a56b8-e40c-4ac3-a5e4-637591601312.png' width=593 alt='LANCZOS-aspect'> |

</div></details>

## まとめ

| リサンプリング | `NEAREST` | `BOX` | `BILINEAR` | `HAMMING` | `BICUBIC` | `LANCZOS` |
|---|:--:|:--:|:--:|:--:|:--:|:--:|
| 処理速度 | ◎ | 〇 | 〇 | 〇 | △ | × |
| サイズ縮小時の<br>速度向上<sup>*1</sup> | ◎ | △ | △ | △ | △ | △ |
| 画質 | 低 | 中 | 中 | 中〜高 | 高 | 最高 |

> *1：出力サイズが小さくなった際の処理時間短縮率

　本検証から得られた主な知見は以下の通りです：

1. **処理速度と品質のトレードオフ**：NEAREST法は他のリサンプリング方式と比較して圧倒的に高速ですが画質は最も低く、LANCZOS法は最高品質を提供する一方で最も処理時間を要します。これらの間に明確なトレードオフ関係が存在します

2. **出力サイズの影響**：すべてのリサンプリング方式において出力サイズが小さくなるほど処理時間は短縮されますが、この効果はNEAREST法で特に顕著です。他の方式では出力サイズによる処理時間の変化が比較的小さく、極小サイズでは内部処理のオーバーヘッドにより処理時間がわずかに増加することもあります

3. **用途別推奨方式**：
    - **高速処理優先**：NEAREST（リアルタイム処理、プレビュー表示など）
    - **バランス重視**：BOX~HAMMING（一般的な用途）
    - **画質優先**：BICUBIC/LANCZOS（最終出力物、印刷用など）

## Appendix

　本検証で使用したコードは、以下のリポジトリで公開しています。詳細な実装やより詳しい解析結果については、そちらをご参照ください。

[Gist](https://gist.github.com/YayoiHabami/97a957255338b59e28ddcd3c64f78818)