Antialiasing de Imagens com Matplotlib

Beginner

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

Introdução

Este tutorial irá guiá-lo através do processo de antialiasing (anti-aliasing) de uma imagem usando Matplotlib em Python. Antialiasing é uma técnica usada para suavizar bordas irregulares e reduzir a distorção em imagens. Neste tutorial, usaremos Matplotlib para gerar uma imagem de 450x450 pixels com conteúdo de frequência variável. Em seguida, faremos a subamostragem da imagem de 450 pixels de dados para 125 ou 250 pixels para demonstrar como o antialiasing pode ser usado para reduzir os padrões Moiré causados pela subamostragem de dados de alta frequência.

Dicas para a 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 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ê.

Gerar Imagem

Primeiramente, precisamos gerar uma imagem de 450x450 pixels com conteúdo de frequência variável usando NumPy.

import matplotlib.pyplot as plt
import numpy as np

N = 450
x = np.arange(N) / N - 0.5
y = np.arange(N) / N - 0.5
aa = np.ones((N, N))
aa[::2, :] = -1

X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
f0 = 5
k = 100
a = np.sin(np.pi * 2 * (f0 * R + k * R**2 / 2))
a[:int(N / 2), :][R[:int(N / 2), :] < 0.4] = -1
a[:int(N / 2), :][R[:int(N / 2), :] < 0.3] = 1
aa[:, int(N / 3):] = a[:, int(N / 3):]
a = aa

Subamostrar Imagem com Interpolação 'nearest'

Agora, faremos a subamostragem da imagem de 450 pixels de dados para 125 ou 250 pixels usando a interpolação 'nearest'. Isso demonstrará como os dados de alta frequência sendo subamostrados podem causar padrões Moiré.

fig, axs = plt.subplots(2, 2, figsize=(5, 6), layout='constrained')
axs[0, 0].imshow(a, interpolation='nearest', cmap='RdBu_r')
axs[0, 0].set_xlim(100, 200)
axs[0, 0].set_ylim(275, 175)
axs[0, 0].set_title('Zoom')

for ax, interp, space in zip(axs.flat[1:],
                             ['nearest', 'antialiased', 'antialiased'],
                             ['data', 'data', 'rgba']):
    ax.imshow(a, interpolation=interp, interpolation_stage=space,
              cmap='RdBu_r')
    ax.set_title(f"interpolation='{interp}'\nspace='{space}'")
plt.show()

Subamostrar Imagem com Interpolação 'antialiased'

Em seguida, faremos a subamostragem da imagem de 450 pixels de dados para 125 ou 250 pixels usando a interpolação 'antialiased'. Isso demonstrará como o antialiasing pode ser usado para reduzir os padrões Moiré causados pela subamostragem de dados de alta frequência.

fig, axs = plt.subplots(2, 2, figsize=(5, 6), layout='constrained')
axs[0, 0].imshow(a, interpolation='nearest', cmap='RdBu_r')
axs[0, 0].set_xlim(100, 200)
axs[0, 0].set_ylim(275, 175)
axs[0, 0].set_title('Zoom')

for ax, interp, space in zip(axs.flat[1:],
                             ['nearest', 'antialiased', 'antialiased'],
                             ['data', 'data', 'rgba']):
    ax.imshow(a, interpolation=interp, interpolation_stage=space,
              cmap='RdBu_r')
    ax.set_title(f"interpolation='{interp}'\nspace='{space}'")
plt.show()

Superamostrar Imagem com Interpolação 'nearest'

Agora, faremos a superamostragem da imagem de 500 pixels de dados para 530 pixels renderizados usando a interpolação 'nearest'. Isso demonstrará como os padrões Moiré ainda podem ocorrer mesmo quando a imagem é superamostrada se o fator de superamostragem não for um inteiro.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='nearest', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='nearest'")
plt.show()

Superamostrar Imagem com Interpolação 'antialiased'

Finalmente, faremos a superamostragem da imagem de 500 pixels de dados para 530 pixels renderizados usando a interpolação 'antialiased'. Isso demonstrará como o uso de algoritmos de antialiasing melhores pode reduzir os padrões Moiré.

fig, ax = plt.subplots(figsize=(6.8, 6.8))
ax.imshow(a, interpolation='antialiased', cmap='gray')
ax.set_title("upsampled by factor a 1.048, interpolation='antialiased'")
plt.show()

Resumo

Neste tutorial, aprendemos como usar Matplotlib para aplicar antialiasing a uma imagem a fim de reduzir os padrões Moiré causados pela subamostragem de dados de alta frequência. Geramos uma imagem de 450x450 pixels com conteúdo de frequência variável e subamostramos a imagem de 450 pixels de dados para 125 pixels ou 250 pixels usando as interpolações 'nearest' e 'antialiased'. Também demonstramos como a superamostragem de uma imagem usando a interpolação 'nearest' ainda pode levar a padrões Moiré, mas o uso de algoritmos de antialiasing melhores pode reduzir esses efeitos.