Técnicas de Visualização de Imagens com Matplotlib

Beginner

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

Introdução

Matplotlib é uma biblioteca de plotagem para a linguagem de programação Python e sua extensão de matemática numérica NumPy. Ela fornece uma API orientada a objetos para incorporar gráficos em aplicações usando toolkits GUI de uso geral como Tkinter, wxPython, Qt, ou GTK. Neste laboratório, aprenderemos como plotar diferentes tipos de imagens usando Matplotlib.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook para 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 a limitações no 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 necessárias

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook
import matplotlib.cm as cm
from matplotlib.patches import PathPatch
from matplotlib.path import Path

Plotar uma distribuição normal bivariada

## Gerar uma distribuição normal bivariada simples
delta = 0.025
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) * 2

## Plotar a distribuição
fig, ax = plt.subplots()
im = ax.imshow(Z, interpolation='bilinear', cmap=cm.RdYlGn,
               origin='lower', extent=[-3, 3, -3, 3],
               vmax=abs(Z).max(), vmin=-abs(Z).max())
plt.show()

Plotar imagens de figuras

## Carregar uma imagem de exemplo
with cbook.get_sample_data('grace_hopper.jpg') as image_file:
    image = plt.imread(image_file)

## Carregar outra imagem usando inteiros de 16 bits 256x256.
w, h = 256, 256
with cbook.get_sample_data('s1045.ima.gz') as datafile:
    s = datafile.read()
A = np.frombuffer(s, np.uint16).astype(float).reshape((w, h))
extent = (0, 25, 0, 25)

## Plotar ambas as imagens
fig, ax = plt.subplot_mosaic([
    ['hopper', 'mri']
], figsize=(7, 3.5))

ax['hopper'].imshow(image)
ax['hopper'].axis('off')  ## limpar eixo x e eixo y

im = ax['mri'].imshow(A, cmap=plt.cm.hot, origin='upper', extent=extent)

markers = [(15.9, 14.5), (16.8, 15)]
x, y = zip(*markers)
ax['mri'].plot(x, y, 'o')

ax['mri'].set_title('MRI')

plt.show()

Interpolar imagens

## Interpolar o mesmo array com três métodos de interpolação diferentes
A = np.random.rand(5, 5)

fig, axs = plt.subplots(1, 3, figsize=(10, 3))
for ax, interp in zip(axs, ['nearest', 'bilinear', 'bicubic']):
    ax.imshow(A, interpolation=interp)
    ax.set_title(interp.capitalize())
    ax.grid(True)

plt.show()

Controlar a origem da imagem

## Especificar se as imagens devem ser plotadas com a origem do array x[0, 0] no canto superior esquerdo ou inferior direito
x = np.arange(120).reshape((10, 12))

interp = 'bilinear'
fig, axs = plt.subplots(nrows=2, sharex=True, figsize=(3, 5))
axs[0].set_title('azul deve estar em cima')
axs[0].imshow(x, origin='upper', interpolation=interp)

axs[1].set_title('azul deve estar em baixo')
axs[1].imshow(x, origin='lower', interpolation=interp)
plt.show()

Mostrar imagens usando um caminho de recorte (clip path)

## Mostrar uma imagem usando um caminho de recorte
delta = 0.025
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) * 2

path = Path([[0, 1], [1, 0], [0, -1], [-1, 0], [0, 1]])
patch = PathPatch(path, facecolor='none')

fig, ax = plt.subplots()
ax.add_patch(patch)

im = ax.imshow(Z, interpolation='bilinear', cmap=cm.gray,
               origin='lower', extent=[-3, 3, -3, 3],
               clip_path=patch, clip_on=True)
im.set_clip_path(patch)

plt.show()

Resumo

Neste laboratório, aprendemos como plotar diferentes tipos de imagens usando Matplotlib. Plotamos uma distribuição normal bivariada, imagens de fotos, imagens interpoladas e imagens usando um caminho de recorte (clip path). Também aprendemos como controlar a origem da imagem.