Algoritmo Didático do Watershed Limitado por Máscara — painel interativo
Passo a passo
Cards
Linha do tempo
Código Python
Fluxograma
Crescimento de Regiões Confinado por Máscara
Inundação concorrente com restrição geométrica de suporte e sincronização síncrona por malha
1
Rotular os marcadores sementes em
f via mm.label0(f, b), instanciar a malha dinâmica g ← f.copy() e binarizar a mask.2
Enquanto houver pixels não rotulados (
while True), reiniciar o controle de atividade mudou ← False e varrer a imagem:
Identificar se a coordenada atual é um vazio contido no escopo:
g[x,y] == 0 and mask[x,y].Avaliar a vizinhança estrutural em
mm._viz(f, b, x, y) baseada no estado síncrono estável f.Se um vizinho possuir rótulo dominante (
g[x,y] < f[vy,vx]), a célula em g absorve esse identificador e marca-se mudou ← True.3
Verificar ponto fixo: caso uma varredura completa não expanda nenhuma fronteira (
not mudou), interrompe-se o laço (break).4
Atualizar o estado de referência de forma síncrona para a próxima iteração:
f ← g.copy().5
Se
op == 'region', retornar o mapa de bacias g; caso contrário, extrair as cristas divisórias via mm.gradm(g).A sincronização
f = g.copy() ao final de cada ciclo impede o crescimento assimétrico ou dependente da ordem da varredura raster (propagação em estilo Jacobi).Escopo Geométrico
mask[x,y] > 0
Restrição binária rígida impedindo o avanço periférico de rótulos.
Estabilização
if not mudou: break
Evita loops infinitos interrompendo ao saturar o domínio da máscara.
Mapeamento Jacobi
f = g.copy()
Sincronização em bloco após inspeção de todas as coordenadas.
01
Inicialização
Geração dos identificadores iniciais pelo mapeamento de componentes conexas e binarização da máscara de suporte.
02
Expansão Concorrente
Varredura 2D inspecionando vazios internos autorizados. A malha de trabalho
g absorve os rótulos lidos da referência estável f.03
Ponto Fixo Local
A flag
mudou monitora mudanças estruturais. Se nenhuma frente avançar, o laço de inundação é finalizado via break.04
Sincronização e Saída
Atualização em bloco do estado referencial. A saída pode ser moldada como partições regionais ou linhas de cristas (linhas de watershed).
01
Condicionamento Prévio
Rotulagem preliminar de marcadores e isolamento booleano do domínio.
02
Laço Síncrono Iterativo
while True
Redefinição de flag:
mudou = FalseCrescimento condicional: se
g[x,y] == 0 e estiver na máscara, expande lendo fControle de estabilidade:
if not mudou: breakAtualização síncrona:
f = g.copy()03
Extração Topológica
Retorno condicional das bacias preenchidas ou cálculo morfológico do gradiente de transição.
def watershed0(f, mask=None, b=np.zeros((3,3),dtype='uint8'), op='region'): f = mm.label0(f, b) g = f.copy() mask = np.ones_like(f) if mask is None else (mask > 0) while True: mudou = False for x in range(f.shape[0]): for y in range(f.shape[1]): if g[x,y] == 0 and mask[x,y]: for vy,vx,bv in mm._viz(f, b, x, y): if bv and g[x,y] < f[vy,vx]: g[x,y] = f[vy,vx] mudou = True if not mudou: break f = g.copy() return g if op == 'region' else mm.gradm(g, mm.secross())
1
mask = (mask > 0) — Converte a imagem de suporte informada para um mapa Booleano indexável.2
g[x,y] == 0 and mask[x,y] — Filtro ativo: pixels fora da máscara (fundo zero) são ignorados de imediato, confinando as frentes de expansão.3
if not mudou: break — Mecanismo de escape. Quando todos os espaços internos permitidos forem preenchidos ou estabilizados contra a barreira, o laço aborta de forma limpa. Description: Figure 4.23: Didactic Watershed Algorithm by Region Growing Limited by Mask.