Transformada de distância por erosões numéricas sucessivas — painel interativo
Passo a passo
Cards
Linha do tempo
Código Python
Fluxograma
Transformada de distância por erosão numérica
Propagação matemática de distâncias via elemento estruturante com pesos
1
Inicializar a imagem de trabalho fazendo uma cópia da original:
g ← f.copy(). Os pixels de fundo (0) servem como fontes de distância nula.2
Entrar em um laço infinito de erosões com pesos (ponto fixo):
Salvar estado anterior:
f ← g.copy().Erodir:
g ← ero1(g, b), aplicando a subtração local de pesos e computando o valor mínimo para cada vizinhança.3
Verificar convergência: se
f for idêntica a g (array_equal), a frente de onda de distâncias se estabilizou. Romper o laço (break).4
Retornar a matriz modificada
g contendo o mapa exato de distâncias.Nesta abordagem morfológica numérica, não há incremento artificial ou contador. A distância propaga-se de fora para dentro porque a erosão contínua puxa o valor
0 do fundo e o decrementa matematicamente (subtraindo os pesos negativos como -1), fazendo com que os valores escalem radialmente.Cruz — L₁ (Manhattan)
B_cruz [y,x]
Pesos: Centro=0, Lados=-1, Cantos=-inf
Erosão de Cinzas
f[vy,vx] - bv
Subtrai o peso e busca o valor mínimo local
Convergência
f == g
Para quando nenhum pixel muda de valor
01
Inicialização
Clonar imagem de entrada:
g ← f.copy(). O objeto possui intensidade alta (255) e o fundo possui intensidade 0.02
Mapeamento Local (ero1)
Para cada coordenada
(y, x), buscar o mínimo valor da operação f[vy, vx] - bv aplicada à sua vizinhança estruturante.03
Loop Iterativo
Atualizar sequencialmente:
f = g.copy() seguido de g = ero1(g, b). Os valores nulos propagam-se para o interior do objeto.04
Critério de Parada
Se
np.array_equal(f, g), significa que o mapa de distâncias atingiu o equilíbrio estável e a propagação terminou.01
Cópia de Trabalho
Prepara a matriz inicial `g`.
02
Loop de Erosão de Escala
while True
Guarda estado:
f ← g.copy()Aplica erosão com pesos:
g ← ero1(g, b)03
Estabilização Espacial
Condição de parada acionada assim que
np.array_equal(f, g) se torna verdadeiro.04
Retorno Numérico
Retorna
g contendo as distâncias calculadas pela subtração cumulativa dos pesos.@staticmethod def ero1(f, b): g = np.empty_like(f) for y in range(f.shape[0]): for x in range(f.shape[1]): g[y,x] = 255 for vy,vx,bv in mm._viz(f,b,y,x): if np.isinf(bv): continue val = int(f[vy,vx]) - int(bv) if g[y,x] > val: g[y,x] = max(0, val) return g @staticmethod def dist1(f, b): g = f.copy() while True: f = g.copy() g = mm.ero1(g, b) if np.array_equal(f, g): break return g
1
g[y,x] = 255 — Inicializa o elemento com o valor máximo antes de computar o operador de mínimo da erosão.2
f[vy,vx] - bv — Subtrai o peso associado da vizinhança. Como os pesos da cruz externa são negativos (ex: -1), a operação torna-se uma adição matemática (f[vy,vx] - (-1) = f[vy,vx] + 1) propagando a distância a partir das bordas zeradas.3
np.array_equal(f, g) — Critério de convergência exato por estabilização de ponto fixo. Descrição: Figura 4.18: Algoritmo da Transformada de Distância.