import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# 1. Máscara original g (0 = Parede, 1 = Corredor)
g_orig = np.array([
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 0, 1, 1, 1],
[0, 0, 0, 0, 0, 1, 0, 1, 0, 1],
[0, 1, 1, 1, 0, 1, 1, 1, 0, 1],
[0, 1, 0, 1, 0, 0, 0, 0, 0, 1],
[0, 1, 0, 1, 1, 1, 1, 1, 1, 1],
[0, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]], dtype=np.uint8)
# Inversão global no início (Dualidade Morfológica)
g = 1 - g_orig # Agora: 1 = Parede, 0 = Corredor
f = np.ones((10, 10), dtype=np.uint8)
f[0, 1] = 0 # Semente injetada como 0 no corredor
# Elemento estruturante em cruz
B_cruz = mm.secross()
# Processamento direto usando mm.cero e mm.suprec no domínio invertido
passo_5 = mm.cero(f, g, B_cruz, n=5)
passo_12 = mm.cero(f, g, B_cruz, n=12)
passo_22 = mm.cero(f, g, B_cruz, n=22)
ponto_fixo = mm.suprec(f, g, B_cruz)
# --- CONFIGURAÇÃO DA EXIBIÇÃO GRÁFICA ---
titles = [
"Máscara (~g)", "Marcador (~f)",
"Avanço (n=5)", "Avanço (n=12)",
"Avanço (n=22)", "~mm.suprec"
]
images = [g, f, passo_5, passo_12, passo_22, ponto_fixo]
fig, axes = plt.subplots(1, 6, figsize=(16, 4), facecolor='#fcfcfc')
# Mapa de cores adaptado para o domínio complementar:
# No domínio invertido: 1 = Parede (Azul Escuro)
# Onde g == 0 e imagem == 1 = Corredor Livre (Cinza Claro)
# Onde g == 0 e imagem == 0 = Onda Geodésica Ativa (Ouro)
cmap_pipeline = mcolors.ListedColormap(['#ffc13b', '#e0e0e0', '#1e3d59'])
for i, ax in enumerate(axes):
if i == 0 or i == 1:
# Para as condições iniciais (~g e ~f)
cmap_init = mcolors.ListedColormap(['#e0e0e0', '#1e3d59'])
ax.imshow(images[i], cmap=cmap_init, vmin=0, vmax=1)
else:
# Renderização baseada nos estados complementares
render_step = np.zeros_like(g, dtype=np.uint8)
render_step[g == 1] = 2 # Parede (1 original do mapa de cores)
render_step[g == 0] = 1 # Corredor padrão
render_step[images[i] == 0] = 0 # Onda ativa (0 original do mapa de cores)
ax.imshow(render_step, cmap=cmap_pipeline, vmin=0, vmax=2)
ax.set_title(titles[i], fontsize=10, fontweight='bold', color='#1e3d59', pad=12)
ax.set_xticks(np.arange(-0.5, 10, 1), minor=True)
ax.set_yticks(np.arange(-0.5, 10, 1), minor=True)
ax.grid(which='minor', color='#ffffff', linestyle='-', linewidth=1)
ax.tick_params(which='both', bottom=False, left=False, labelbottom=False, labelleft=False)
# Indicadores gráficos de Entrada e Saída
ax.plot(1, 0, marker='v', color='#2ecc71', markersize=7, markeredgewidth=1.5)
ax.plot(8, 9, marker='o', color='#e74c3c', markersize=6, fillstyle='none', markeredgewidth=2)
plt.tight_layout()
plt.show()