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.