Transformación afín con Matplotlib

Beginner

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

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.