Antialiasing d'images avec Matplotlib

Beginner

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

Introduction

Ce tutoriel vous guidera tout au long du processus d'antialiasing d'une image à l'aide de Matplotlib en Python. L'antialiasing est une technique utilisée pour apaiser les bords escamotés et réduire la distorsion dans les images. Dans ce tutoriel, nous utiliserons Matplotlib pour générer une image de 450x450 pixels avec un contenu de fréquence variable. Nous allons ensuite sous-échantillonner l'image de 450 pixels de données à soit 125 pixels soit 250 pixels pour démontrer comment l'antialiasing peut être utilisé pour réduire les motifs de Moiré causés par le sous-échantillonnage de données haute fréquence.

Conseils sur la VM

Une fois le démarrage de la VM terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous réglerons rapidement le problème pour vous.

Générer une image

Tout d'abord, nous devons générer une image de 450x450 pixels avec un contenu de fréquence variable à l'aide de NumPy.

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

Sous-échantillonnage de l'image avec interpolation 'nearest'

Maintenant, nous allons sous-échantillonner l'image de 450 pixels de données à 125 pixels ou 250 pixels en utilisant l'interpolation 'nearest'. Cela démontrera comment les données haute fréquence soumises au sous-échantillonnage peuvent causer des motifs de Moiré.

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

Sous-échantillonnage de l'image avec interpolation 'antialiased'

Ensuite, nous allons sous-échantillonner l'image de 450 pixels de données à 125 pixels ou 250 pixels en utilisant l'interpolation 'antialiased'. Cela démontrera comment l'antialiasing peut être utilisé pour réduire les motifs de Moiré causés par le sous-échantillonnage de données haute fréquence.

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

Redimensionnement d'une image par interpolation 'nearest'

Maintenant, nous allons redimensionner l'image de 500 pixels de données à 530 pixels affichés en utilisant l'interpolation 'nearest'. Cela démontrera comment les motifs de Moiré peuvent encore apparaître même lorsque l'image est redimensionnée si le facteur de redimensionnement n'est pas un nombre entier.

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

Redimensionnement d'une image par interpolation 'antialiased'

Enfin, nous allons redimensionner l'image de 500 pixels de données à 530 pixels affichés en utilisant l'interpolation 'antialiased'. Cela démontrera comment l'utilisation d'algorithmes d'antialiasing plus performants peut réduire les motifs de Moiré.

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

Sommaire

Dans ce tutoriel, nous avons appris à utiliser Matplotlib pour anti-alias une image afin de réduire les motifs de Moiré causés par le sous-échantillonnage de données haute fréquence. Nous avons généré une image de 450x450 pixels avec un contenu de fréquence variable, et avons sous-échantillonné l'image de 450 pixels de données à 125 pixels ou 250 pixels en utilisant l'interpolation 'nearest' et 'antialiased'. Nous avons également démontré comment le redimensionnement d'une image en utilisant l'interpolation 'nearest' peut encore entraîner des motifs de Moiré, mais en utilisant de meilleurs algorithmes d'anti-aliasing, on peut réduire ces effets.