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=Truepinta cada pixel que não corresponde – o complemento da região correspondente – em vez dos pixels correspondentes em si.clear_background=Truezera cada pixel fora da região de preenchimento. Útil para extrair apenas a região preenchida como uma máscara.A palavra-chave
masktem 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á.