画像のアンチエイリアシング#

画像は、画面上または画像ファイル内の個別のピクセルで表されます。画像を構成するデータの解像度が画面上の表現と異なる場合、エイリアシング効果が見られます。これらがどれだけ目立つかは、解像度の変更 (ある場合) でどれだけのダウンサンプリングが行われるかによって異なります。

データをサブサンプリングする場合、最初に平滑化してから平滑化されたデータをサブサンプリングすることにより、エイリアシングが減少します。Matplotlib では、データを色にマッピングする前にスムージングを行うか、最終画像の RGB(A) データに対してスムージングを行うことができます。これらの違いは以下に示され、interpolation_stageキーワード引数で制御されます。

Matplotlib のデフォルトの画像補間は「アンチエイリアス」で、データに適用されます。これは、ほとんどの状況でエイリアシングを削減するために、ユーザーが提供するデータにハニング補間を使用します。係数 1、2、または >=3 によるアップサンプリングがある場合にのみ、「最近傍」補間が使用されます。

他のアンチエイリアシング フィルタは、 interpolationキーワード引数Axes.imshowを使用して 指定できます。

import numpy as np
import matplotlib.pyplot as plt

まず、さまざまな周波数コンテンツを含む 450x450 ピクセルの画像を生成します。

N = 450
x = np.arange(N) / N - 0.5
y = np.arange(N) / N - 0.5
aa = np.ones((N, N))
aa[::2, :] = -1

X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
f0 = 5
k = 100
a = np.sin(np.pi * 2 * (f0 * R + k * R**2 / 2))
# make the left hand side of this
a[:int(N / 2), :][R[:int(N / 2), :] < 0.4] = -1
a[:int(N / 2), :][R[:int(N / 2), :] < 0.3] = 1
aa[:, int(N / 3):] = a[:, int(N / 3):]
a = aa

次の画像は、450 データ ピクセルから 125 ピクセルまたは 250 ピクセルにサブサンプリングされています (ディスプレイによって異なります)。「最も近い」補間のモアレ パターンは、サブサンプリングされる高周波データによって発生します。「アンチエイリアス処理」された画像にはまだモアレ パターンがいくつかありますが、大幅に軽減されています。

「data」補間と「rgba」補間には大きな違いがあります。画像の左 3 分の 1 にある赤と青の交互のバンドは、サブサンプリングされています。'data' 空間 (デフォルト) で補間することにより、アンチエイリアシング フィルターはストライプを白に近づけます。これは、-1 と +1 の平均がゼロであり、このカラーマップではゼロが白であるためです。

逆に、「rgba」空間でアンチエイリアシングが発生すると、赤と青が視覚的に組み合わされて紫になります。この動作は典型的な画像処理パッケージに似ていますが、紫は元のカラーマップにないため、個々のピクセルをデータ値に戻すことはできなくなっていることに注意してください。

fig, axs = plt.subplots(2, 2, figsize=(5, 6), constrained_layout=True)
axs[0, 0].imshow(a, interpolation='nearest', cmap='RdBu_r')
axs[0, 0].set_xlim(100, 200)
axs[0, 0].set_ylim(275, 175)
axs[0, 0].set_title('Zoom')

for ax, interp, space in zip(axs.flat[1:],
                             ['nearest', 'antialiased', 'antialiased'],
                             ['data', 'data', 'rgba']):
    ax.imshow(a, interpolation=interp, interpolation_stage=space,
              cmap='RdBu_r')
    ax.set_title(f"interpolation='{interp}'\nspace='{space}'")
plt.show()
ズーム、interpolation='nearest' space='data'、interpolation='antialiased' space='data'、interpolation='antialiased' space='rgba'

アップサンプリング係数が整数でない場合、「最も近い」補間を使用して画像をアップサンプリングしても、モアレ パターンが発生します。次の画像は、500 データ ピクセルを 530 レンダリング ピクセルにアップサンプリングします。作成する必要があった 524 - 500 = 24 の余分なピクセルに起因する 30 の線状のアーティファクトのグリッドに気付く場合があります。補間は「最も近い」ため、隣接するピクセルのラインと同じであり、画像が局所的に引き伸ばされて、歪んで見えるようになります。

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='nearest', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='nearest'")
plt.show()
係数 a 1.048 でアップサンプリング、interpolation='nearest'

アンチエイリアシング アルゴリズムを改善すると、この影響を軽減できます。

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='antialiased', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='antialiased'")
plt.show()
係数 a 1.048 でアップサンプリング、interpolation='antialiased'

デフォルトの「ハニング」アンチエイリアシングとは別に、imshowさまざまな補間アルゴリズムがサポートされています。これらのアルゴリズムは、パターンに応じてうまく機能したり、悪化したりします。

fig, axs = plt.subplots(1, 2, figsize=(7, 4), constrained_layout=True)
for ax, interp in zip(axs, ['hanning', 'lanczos']):
    ax.imshow(a, interpolation=interp, cmap='gray')
    ax.set_title(f"interpolation='{interp}'")
plt.show()
補間='ハニング'、補間='ランチョス'

参考文献

この例では、次の関数、メソッド、クラス、およびモジュールの使用が示されています。

スクリプトの合計実行時間: ( 0 分 3.316 秒)

Sphinx-Gallery によって生成されたギャラリー