Matplotlib による画像のアンチエイリアシング

PythonPythonBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、Python の Matplotlib を使って画像のアンチエイリアシングを行う方法を説明します。アンチエイリアシングは、画像のジャギーなエッジを滑らかにし、歪みを軽減するために使用される技術です。このチュートリアルでは、Matplotlib を使って周波数成分の異なる 450x450 ピクセルの画像を生成します。次に、画像を 450 データピクセルから 125 ピクセルまたは 250 ピクセルにサブサンプリングして、高周波データのサブサンプリングによって引き起こされるモアレパターンを軽減するためにアンチエイリアシングをどのように使用できるかを示します。

VM のヒント

VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替えて、Jupyter Notebook を使った練習を行います。

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。

学習中に問題が発生した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

画像の生成

まず、NumPy を使って周波数成分の異なる 450x450 ピクセルの画像を生成する必要があります。

import matplotlib.pyplot as plt
import numpy as np

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))
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 ピクセルにサブサンプリングします。これにより、サブサンプリングされる高周波データがどのようにしてモアレパターンを引き起こすかを示します。

fig, axs = plt.subplots(2, 2, figsize=(5, 6), layout='constrained')
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()

「アンチエイリアス」補間を使った画像のサブサンプリング

次に、「アンチエイリアス」補間を使って画像を 450 データピクセルから 125 ピクセルまたは 250 ピクセルにサブサンプリングします。これにより、高周波データのサブサンプリングによって引き起こされるモアレパターンを軽減するためにアンチエイリアシングをどのように使用できるかを示します。

fig, axs = plt.subplots(2, 2, figsize=(5, 6), layout='constrained')
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()

「最寄り」補間を使った画像のアップサンプリング

次に、「最寄り」補間を使って画像を 500 データピクセルから 530 レンダリングピクセルにアップサンプリングします。これにより、アップサンプリング係数が整数でない場合、画像をアップサンプリングしたときでもモアレパターンが発生する可能性があることを示します。

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()

「アンチエイリアス」補間を使った画像のアップサンプリング

最後に、「アンチエイリアス」補間を使って画像を 500 データピクセルから 530 レンダリングピクセルにアップサンプリングします。これにより、より良いアンチエイリアシングアルゴリズムを使用することがどのようにしてモアレパターンを軽減できるかを示します。

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()

まとめ

このチュートリアルでは、Matplotlibを使って画像にアンチエイリアシングを行い、高周波データのサブサンプリングによって引き起こされるモアレパターンを軽減する方法を学びました。周波数成分の異なる450x450ピクセルの画像を生成し、「最寄り」および「アンチエイリアス」補間を使って画像を450データピクセルから125ピクセルまたは250ピクセルにサブサンプリングしました。また、「最寄り」補間を使って画像をアップサンプリングするとモアレパターンが発生する可能性があることも示しましたが、より良いアンチエイリアシングアルゴリズムを使用することでこれらの影響を軽減できることも示しました。