Introducción
Esta práctica demuestra cómo utilizar Matplotlib para realizar una transformación afín de una imagen. Las transformaciones afines cambian la forma y la orientación de una imagen. Esta práctica muestra cómo utilizar la función transforms.Affine2D para manipular la forma y la orientación de una imagen.
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.
En ocasiones, 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.
Importar bibliotecas y definir la imagen
En el primer paso, importamos las bibliotecas necesarias y definimos la imagen que se utilizará en el ejemplo. La imagen es una combinación de dos funciones gaussianas.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.transforms as mtransforms
def get_image():
delta = 0.25
x = y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2)
return Z
Crear una función para trazar la imagen
En este paso, definimos una función que toma la imagen, el eje de trazado y la transformación como entradas. La función muestra la imagen en el eje de trazado con la transformación especificada. La función también muestra un rectángulo amarillo alrededor de la imagen para mostrar la extensión deseada de la imagen.
def do_plot(ax, Z, transform):
im = ax.imshow(Z, interpolation='none',
origin='lower',
extent=[-2, 4, -3, 2], clip_on=True)
trans_data = transform + ax.transData
im.set_transform(trans_data)
## display intended extent of the image
x1, x2, y1, y2 = im.get_extent()
ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "y--",
transform=trans_data)
ax.set_xlim(-5, 5)
ax.set_ylim(-4, 4)
Realizar la rotación de la imagen
En este paso, realizamos una rotación de la imagen utilizando la función rotate_deg. Pasamos el ángulo de rotación como entrada a la función rotate_deg. Utilizamos la función do_plot para mostrar la imagen rotada.
## prepare image and figure
fig, ax1 = plt.subplots()
Z = get_image()
## image rotation
do_plot(ax1, Z, mtransforms.Affine2D().rotate_deg(30))
Realizar la inclinación de la imagen
En este paso, realizamos una inclinación de la imagen utilizando la función skew_deg. Pasamos los ángulos de inclinación como entradas a la función skew_deg. Utilizamos la función do_plot para mostrar la imagen inclinada.
## prepare image and figure
fig, ax2 = plt.subplots()
Z = get_image()
## image skew
do_plot(ax2, Z, mtransforms.Affine2D().skew_deg(30, 15))
Realizar la escala y reflexión de la imagen
En este paso, realizamos una escala y reflexión de la imagen utilizando la función scale. Pasamos los factores de escala y reflexión como entradas a la función scale. Utilizamos la función do_plot para mostrar la imagen escalada y reflejada.
## prepare image and figure
fig, ax3 = plt.subplots()
Z = get_image()
## scale and reflection
do_plot(ax3, Z, mtransforms.Affine2D().scale(-1,.5))
Realizar múltiples transformaciones
En este paso, realizamos múltiples transformaciones de la imagen utilizando las funciones rotate_deg, skew_deg, scale y translate. Pasamos los parámetros de transformación como entradas a las respectivas funciones. Utilizamos la función do_plot para mostrar la imagen transformada.
## prepare image and figure
fig, ax4 = plt.subplots()
Z = get_image()
## everything and a translation
do_plot(ax4, Z, mtransforms.Affine2D().
rotate_deg(30).skew_deg(30, 15).scale(-1,.5).translate(.5, -1))
Resumen
Esta práctica demostró cómo utilizar Matplotlib para realizar una transformación afín de una imagen. Utilizamos la función transforms.Affine2D para manipular la forma y la orientación de una imagen. Realizamos rotación, inclinación, escala, reflexión y múltiples transformaciones de la imagen. También mostramos la imagen transformada en un eje de trazado con la extensión deseada de la imagen.