Transformação Afim com Matplotlib

Beginner

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

Introdução

Este laboratório demonstra como usar o Matplotlib para realizar a transformação afim de uma imagem. As transformações afins alteram a forma e a orientação de uma imagem. Este laboratório mostra como usar a função transforms.Affine2D para manipular a forma e a orientação de uma imagem.

Dicas da VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido às limitações do Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar Bibliotecas e Definir a Imagem

No primeiro passo, importamos as bibliotecas necessárias e definimos a imagem que será usada no exemplo. A imagem é uma combinação de duas funções 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

Criar uma Função para Plotar a Imagem

Nesta etapa, definimos uma função que recebe a imagem, o eixo do gráfico e a transformação como entradas. A função exibe a imagem no eixo do gráfico com a transformação especificada. A função também exibe um retângulo amarelo ao redor da imagem para mostrar a extensão pretendida da imagem.

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 a Rotação da Imagem

Nesta etapa, realizamos uma rotação da imagem usando a função rotate_deg. Passamos o ângulo de rotação como entrada para a função rotate_deg. Usamos a função do_plot para exibir a imagem rotacionada.

## prepare image and figure
fig, ax1 = plt.subplots()
Z = get_image()

## image rotation
do_plot(ax1, Z, mtransforms.Affine2D().rotate_deg(30))

Realizar a Distorção da Imagem (Skew)

Nesta etapa, realizamos uma distorção (skew) da imagem usando a função skew_deg. Passamos os ângulos de distorção como entradas para a função skew_deg. Usamos a função do_plot para exibir a imagem distorcida.

## prepare image and figure
fig, ax2 = plt.subplots()
Z = get_image()

## image skew
do_plot(ax2, Z, mtransforms.Affine2D().skew_deg(30, 15))

Realizar a Escala e Reflexão da Imagem

Nesta etapa, realizamos uma escala e reflexão da imagem usando a função scale. Passamos os fatores de escala e reflexão como entradas para a função scale. Usamos a função do_plot para exibir a imagem escalada e refletida.

## 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últiplas Transformações

Nesta etapa, realizamos múltiplas transformações da imagem usando as funções rotate_deg, skew_deg, scale e translate. Passamos os parâmetros de transformação como entradas para as funções respectivas. Usamos a função do_plot para exibir a imagem 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))

Resumo

Este laboratório demonstrou como usar o Matplotlib para realizar transformações afins (affine transformation) de uma imagem. Usamos a função transforms.Affine2D para manipular a forma e orientação de uma imagem. Realizamos rotação, distorção (skew), escala, reflexão e múltiplas transformações da imagem. Também exibimos a imagem transformada em um eixo de gráfico com a extensão pretendida da imagem.