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