5.8. Preenchimento por inundação e glifos de detecção

Os primitivos geométricos no início desta seção colocam marcas em posições que a aplicação já conhece. A composição de imagens sobrepõe uma imagem a outra. Um pequeno grupo final de métodos de desenho faz algo diferente: coloca marcas cuja forma depende do que já está na imagem, ou do que algum algoritmo anterior encontrou nela.

5.8.1. Preenchimento por inundação

flood_fill() parte de um único pixel – a semente – e cresce para fora, pintando cada pixel que seja suficientemente parecido com a semente e conectado a ela por uma cadeia de outros pixels semelhantes. O resultado é uma região preenchida cujo limite é decidido pela própria imagem, e não por algo passado à chamada.

A forma mais simples recebe a coordenada da semente e uma cor para preencher:

img.flood_fill(x=160, y=120, color=(0, 255, 0))

Dois parâmetros de limiar controlam quão agressivamente o preenchimento cresce. seed_threshold (uma fração normalizada de 0.0 a 1.0) define quão diferente um pixel pode ser do valor da semente original ainda assim sendo incluído. floating_threshold define quão diferente ele pode ser de cada vizinho já incluído. Os dois limiares trabalham juntos: um floating_threshold generoso permite que o preenchimento siga um gradiente ao longo da imagem, enquanto um seed_threshold apertado o impede de se afastar demais do valor da semente, mesmo ao longo desse gradiente.

Algumas flags refinam ainda mais o resultado:

  • invert=True pinta cada pixel que não corresponde – o complemento da região correspondente – em vez dos pixels correspondentes em si.

  • clear_background=True zera cada pixel fora da região de preenchimento. Útil para extrair apenas a região preenchida como uma máscara.

  • A palavra-chave mask tem seu significado usual: pixels desativados na máscara são deixados intactos, independentemente de o preenchimento os ter alcançado ou não.

O preenchimento por inundação é mais útil para dois padrões. O primeiro é visualizar o que algum detector de regiões encontrou, preenchendo a região detectada com uma cor distinta para que ela se destaque do resto do quadro. O segundo é extrair a própria região, combinando clear_background=True com uma semente conhecida dentro da região e lendo a imagem resultante como uma máscara para operações posteriores.

5.8.2. Desenhando resultados de detecção

Algoritmos de processamento de imagem frequentemente retornam objetos de resultado que carregam tanto uma posição quanto alguma estrutura adicional: um ponto-chave com uma orientação, uma detecção de face com um centroide distinto de sua caixa delimitadora, uma AprilTag com quatro pontos de canto. Desenhar isso bem – com um glifo que capture a estrutura, e não apenas uma caixa delimitadora – é um padrão recorrente o suficiente para que o módulo exponha dois auxiliares para isso.

draw_keypoints() recebe ou um descritor de pontos-chave retornado por um extrator de características, ou uma simples lista de triplas (x, y, rotation), e desenha um pequeno glifo em cada ponto. O glifo carrega tanto a posição quanto a orientação: um círculo ao redor do ponto mais uma linha a partir do centro indicando a rotação. Essa visualização de chamada única é a maneira mais fácil de verificar se um extrator de pontos-chave está retornando as orientações que a aplicação espera.

draw_detection() recebe uma tupla de seis elementos (rx, ry, rw, rh, cx, cy) – o retângulo delimitador mais um centroide reportado separadamente – e desenha ambos de uma vez: um retângulo ao redor da caixa delimitadora, uma cruz no centroide e, opcionalmente, um rótulo de texto no canto do retângulo. A forma corresponde ao que uma detecção de rede neural ou um rastreador de modelos tipicamente reporta, onde o centroide é uma posição mais precisa do que o centro da caixa delimitadora forneceria.

Ambos os métodos de glifo são camadas de conveniência sobre os primitivos geométricos no início desta seção. Uma aplicação sempre pode reproduzir a mesma visualização chamando draw_rectangle(), draw_circle(), draw_cross() e draw_string() diretamente; os métodos de glifo apenas poupam a contabilidade dos padrões que aparecem repetidamente.

Com os primitivos geométricos para geometria conhecida, a composição de imagens para sobreposições, o preenchimento por inundação para regiões derivadas da imagem e os glifos de detecção para os padrões de visualização padrão, o kit de ferramentas de desenho está completo. Qualquer coisa de que uma aplicação precise para tornar visível a saída de um algoritmo tem um método na superfície que a coloca lá.