5.8. Relleno por inundación (flood fill) y glifos de detección

Las primitivas geométricas del comienzo de esta sección colocan marcas en posiciones que la aplicación ya conoce. La composición de imágenes superpone una imagen sobre otra. Un pequeño grupo final de métodos de dibujo hace algo diferente: coloca marcas cuya forma depende de lo que ya hay en la imagen, o de lo que algún algoritmo anterior encontró en ella.

5.8.1. Relleno por inundación (flood fill)

flood_fill() parte de un único píxel – la semilla – y crece hacia afuera, pintando cada píxel que sea suficientemente similar a la semilla y esté conectado a ella a través de una cadena de otros píxeles similares. El resultado es una región rellena cuyo límite lo decide la propia imagen, no nada que se pase a la llamada.

La forma más simple toma la coordenada de la semilla y un color con el que rellenar:

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

Dos parámetros de umbral controlan con qué agresividad crece el relleno. seed_threshold (una fracción normalizada de 0.0 a 1.0) establece cuán diferente puede ser un píxel del valor de la semilla original y aun así ser incluido. floating_threshold establece cuán diferente puede ser de cada vecino ya incluido. Los dos umbrales funcionan juntos: un floating_threshold generoso permite que el relleno siga un degradado a través de la imagen, mientras que un seed_threshold ajustado evita que se aleje demasiado del valor de la semilla incluso a lo largo de ese degradado.

Unos pocos indicadores refinan aún más el resultado:

  • invert=True pinta cada píxel que no coincide – el complemento de la región coincidente – en lugar de los píxeles coincidentes en sí.

  • clear_background=True pone a cero cada píxel fuera de la región de relleno. Útil para extraer únicamente la región rellena como una máscara.

  • La palabra clave mask tiene su significado habitual: los píxeles desactivados en la máscara se dejan intactos independientemente de si el relleno los habría alcanzado de otro modo.

El relleno por inundación es más útil para dos patrones. El primero es visualizar lo que algún detector de regiones encontró, rellenando la región detectada con un color distintivo para que destaque frente al resto del fotograma. El segundo es extraer la propia región, combinando clear_background=True con una semilla conocida dentro de la región y leyendo la imagen resultante como una máscara para operaciones posteriores.

5.8.2. Dibujar resultados de detección

Los algoritmos de procesamiento de imágenes a menudo devuelven objetos de resultado que llevan tanto una posición como alguna estructura adicional: un punto clave con una orientación, una detección de rostro con un centroide distinto de su cuadro delimitador, un AprilTag con cuatro puntos de esquina. Dibujarlos bien – con un glifo que capture la estructura, no solo un cuadro delimitador – es un patrón lo bastante recurrente como para que el módulo exponga dos ayudantes para ello.

draw_keypoints() toma o bien un descriptor de punto clave devuelto por un extractor de características, o bien una simple lista de tripletas (x, y, rotation), y dibuja un pequeño glifo en cada punto. El glifo lleva tanto la posición como la orientación: un círculo alrededor del punto más una línea que sale del centro indicando la rotación. Esa visualización de una sola llamada es la forma más fácil de comprobar que un extractor de puntos clave está devolviendo las orientaciones que la aplicación espera.

draw_detection() toma una tupla de seis elementos (rx, ry, rw, rh, cx, cy) – el rectángulo delimitador más un centroide informado por separado – y dibuja ambos a la vez: un rectángulo alrededor del cuadro delimitador, una cruz en el centroide y, opcionalmente, una etiqueta de texto en la esquina del rectángulo. La forma coincide con lo que normalmente informa una detección de red neuronal o un rastreador de plantillas, donde el centroide es una posición más precisa que la que daría el centro del cuadro delimitador.

Ambos métodos de glifos son capas de conveniencia sobre las primitivas geométricas del comienzo de esta sección. Una aplicación siempre puede reproducir la misma visualización llamando directamente a draw_rectangle(), draw_circle(), draw_cross() y draw_string(); los métodos de glifos solo ahorran el trabajo de gestión para los patrones que surgen una y otra vez.

Con las primitivas geométricas para geometría conocida, la composición de imágenes para superposiciones, el relleno por inundación para regiones derivadas de la imagen y los glifos de detección para los patrones de visualización estándar, el conjunto de herramientas de dibujo está completo. Cualquier cosa que una aplicación necesite para hacer visible la salida de un algoritmo tiene un método en la superficie que la coloca ahí.