Antialiasing de imágenes con Matplotlib

PythonPythonBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Este tutorial lo guiará a través del proceso de suavizado anti-aliasing de una imagen utilizando Matplotlib en Python. El anti-aliasing es una técnica utilizada para suavizar los bordes dentados y reducir la distorsión en las imágenes. En este tutorial, utilizaremos Matplotlib para generar una imagen de 450x450 píxeles con contenido de frecuencia variable. Luego, submuestreamos la imagen de 450 píxeles de datos a 125 píxeles o 250 píxeles para demostrar cómo se puede utilizar el anti-aliasing para reducir los patrones de Moiré causados por la submuestreación de datos de alta frecuencia.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Generar imagen

Primero, necesitamos generar una imagen de 450x450 píxeles con contenido de frecuencia variable utilizando 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

Submuestrear imagen con interpolación 'nearest'

Ahora, submuestreamos la imagen de 450 píxeles de datos a 125 píxeles o 250 píxeles utilizando interpolación 'nearest'. Esto demostrará cómo los datos de alta frecuencia que se submuestran pueden causar patrones 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"interpolación='{interp}'\nespacio='{space}'")
plt.show()

Submuestrear imagen con interpolación 'antialiased'

A continuación, submuestreamos la imagen de 450 píxeles de datos a 125 píxeles o 250 píxeles utilizando interpolación 'antialiased'. Esto demostrará cómo se puede utilizar el anti-aliasing para reducir los patrones de Moiré causados por la submuestreación de datos de alta frecuencia.

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"interpolación='{interp}'\nespacio='{space}'")
plt.show()

Interpolar hacia arriba la imagen con interpolación 'nearest'

Ahora, interpolaremos hacia arriba la imagen de 500 píxeles de datos a 530 píxeles renderizados utilizando interpolación 'nearest'. Esto demostrará cómo los patrones de Moiré todavía pueden ocurrir incluso cuando la imagen se interpola hacia arriba si el factor de interpolación hacia arriba no es un número entero.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='nearest', cmap='gray')
ax.set_title("interpolado por un factor de 1.048, interpolación='nearest'")
plt.show()

Interpolar hacia arriba la imagen con interpolación 'antialiased'

Finalmente, interpolaremos hacia arriba la imagen de 500 píxeles de datos a 530 píxeles renderizados utilizando interpolación 'antialiased'. Esto demostrará cómo utilizar algoritmos de anti-aliasing mejores puede reducir los patrones de Moiré.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='antialiased', cmap='gray')
ax.set_title("interpolado por un factor de 1.048, interpolación='antialiased'")
plt.show()

Resumen

En este tutorial, aprendimos cómo utilizar Matplotlib para aplicar anti-aliasing a una imagen y reducir los patrones de Moiré causados por la submuestreación de datos de alta frecuencia. Generamos una imagen de 450x450 píxeles con contenido de frecuencia variable, y submuestreamos la imagen de 450 píxeles de datos a 125 píxeles o 250 píxeles utilizando interpolación 'nearest' y 'antialiased'. También demostramos cómo la interpolación hacia arriba de una imagen utilizando interpolación 'nearest' todavía puede conducir a patrones de Moiré, pero utilizar algoritmos de anti-aliasing mejores puede reducir estos efectos.