5.8. Preenchimento por difusão e glifos de deteção#

As primitivas geométricas no início desta secção colocam marcas em posições que a aplicação já conhece. A composição de imagens sobrepõe uma imagem noutra. Um pequeno grupo final de métodos de desenho faz algo diferente: coloca marcas cuja forma depende do que já existe na imagem, ou do que um algoritmo anterior encontrou nela.

5.8.1. Preenchimento por difusão#

flood_fill() começa a partir de um único pixel – a semente – e cresce para o exterior, pintando todos os pixels suficientemente semelhantes à semente e ligados a ela através de uma cadeia de outros pixels semelhantes. O resultado é uma região preenchida cujo limite é determinado pela própria imagem, não por nada passado à chamada.

A forma mais simples aceita 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 a agressividade do preenchimento. 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 e ainda ser incluído. floating_threshold define quão diferente pode ser de cada vizinho já incluído. Os dois limiares funcionam em conjunto: um floating_threshold generoso permite que o preenchimento siga um gradiente pela imagem, enquanto um seed_threshold restrito o impede de se afastar demasiado do valor da semente mesmo ao longo desse gradiente.

Alguns indicadores refinam ainda mais o resultado:

  • invert=True pinta todos os pixels que não correspondem – o complemento da região correspondente – em vez dos próprios pixels correspondentes.

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

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

O preenchimento por difusão é mais útil para dois padrões. O primeiro é visualizar o que um detetor de regiões encontrou, preenchendo a região detetada com uma cor distinta para se destacar do resto do fotograma. 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 máscara para operações posteriores.

5.8.2. Desenhar resultados de deteção#

Os algoritmos de processamento de imagem devolvem frequentemente objetos de resultado que transportam tanto uma posição como alguma estrutura adicional: um ponto-chave com uma orientação, uma deteção facial com um centróide distinto da sua caixa delimitadora, uma AprilTag com quatro pontos de canto. Desenhá-los bem – com um glifo que capture a estrutura, não apenas uma caixa delimitadora – é um padrão recorrente o suficiente para que o módulo exponha dois auxiliares para isso.

draw_keypoints() aceita um descritor de ponto-chave devolvido por um extrator de características, ou uma lista simples de triplos (x, y, rotation), e desenha um pequeno glifo em cada ponto. O glifo transporta tanto a posição como a orientação: um círculo em torno do ponto mais uma linha a partir do centro indicando a rotação. Essa visualização numa única chamada é a forma mais fácil de verificar que um extrator de pontos-chave está a devolver as orientações que a aplicação espera.

draw_detection() aceita um sextuplo (rx, ry, rw, rh, cx, cy) – o retângulo delimitador mais um centróide reportado separadamente – e desenha ambos de uma vez: um retângulo em torno da caixa delimitadora, uma cruz no centróide e, opcionalmente, uma etiqueta de texto no canto do retângulo. A forma corresponde ao que uma deteção de rede neuronal ou um rastreador de modelo tipicamente reporta, onde o centróide é uma posição mais precisa do que o centro da caixa delimitadora daria.

Ambos os métodos de glifo são camadas de conveniência sobre as primitivas geométricas no início desta secção. Uma aplicação pode sempre reproduzir a mesma visualização chamando draw_rectangle(), draw_circle(), draw_cross() e draw_string() diretamente; os métodos de glifo apenas poupam o registo contabilístico para os padrões que surgem repetidamente.

Com as primitivas geométricas para geometria conhecida, composição de imagens para sobreposições, preenchimento por difusão para regiões derivadas da imagem e os glifos de deteção para os padrões de visualização padrão, o conjunto de ferramentas de desenho está completo. Tudo o que uma aplicação necessita para tornar a saída do algoritmo visível tem um método na superfície que o coloca lá.