OMES

?‍? JERARQUÍA de CONTORNOS – OpenCV y Python

En el post anterior toqué el tema de como encontrar contornos en una imagen y como dibujarlos. Vimos algunos de los argumentos que cv2.findContours toma como entrada para encontrar los contornos de una imagen binaria. Recordemos:

Figura 1: Función cv2.findContours. Hoy veremos como afecta en ‘hierarchy’, los 4 opciones del argumento mode.

Sin embargo faltaba explicar qué valores se obtenía en «hierarchy», cuando se usa: cv2.RETR_EXTERNAL, cv2.RETR_LIST, cv2.RETR_CCOMP y cv2.RETR_TREE. Esto es precisamente lo que veremos hoy, para ello usaremos la imagen ejemplo del post anterior. ¡Empecemos!

Jerarquía de contornos

La jerarquía de contornos hace referencia a la relación entre contornos, como relación padre e hijo. Pero para ilustrar mejor como se relacionan, observemos la siguiente imagen:

Figura 2: Izq. Jerarquía padre e hijo. Der. Mismo nivel de jerarquía.

Como ves, para la explicación he usado emojis, esto nos ayudará (según yo) a distinguir entre jerarquías. En la figura 1 a la izquierda, muestra una imagen binaria que tiene un contorno externo y uno interno. La relación que tendrían es que el externo (que está en verde) es padre, mientras el interno (que se encuentra en azul) su hijo.

Otro aspecto que debemos tener en claro es, cuando los contornos se encuentran a un mismo nivel de jerarquía, esto lo vemos en la imagen derecha en la figura 1, con los tres contornos (que están de verde, azul y naranja). Aquí ninguno esta dentro de otro, por lo tanto poseen el mismo nivel de jerarquía.

¿Cómo se representa la JERARQUÍA DE CONTORNOS en OpenCV?

Cada contorno va a almacenar información acerca de su jerarquía, así pues de cada contorno se obtendrá un array con:

Jerarquía de contornos aplicando cv2.RETR_EXTERNAL

Debemos recordar que al usar cv2.RETR_EXTERNAL, recupera los contornos externos, solo los más antiguos de la familia, no el resto. Entonces volvamos a la imagen usada el post anterior, allí vimos como dibujar cada contorno mientras presionábamos una tecla, (aquí puedes ver el orden en el que aparece cada contorno).

Una vez que sabemos el orden en el que van apareciendo los contornos, procedemos al análisis de los arrays obtenemos en ‘hierarchy’.

Figura 3: Jerarquía de contornos usando cv2.RETR_EXTERNAL.

La figura 3, es una captura del video que he hecho sobre jerarquía de contornos. Puedes revisarlo, creo que te podría ayudar de mejor manera ya que se puede apreciar la relación de los contornos mediante emojis.

NOTA: Dado que cv2.RETR_EXTERNAL únicamente toma a los más antiguos de la familia, se tendrá un solo nivel de jerarquía, esto hay que tenerlo en cuenta.

Vamos a analizar los contornos en la posición 0, 1 y 2:

Jerarquía de contornos aplicando cv2.RETR_LIST

cv2.RETR_LIST, recupera todos los contornos sin establecer jerarquía (ninguna relación padre e hijo). Aquí puedes ver el orden en el que aparece cada contorno.

Ahora que tenemos el orden en el que van saliendo los contornos, analicemos ‘hierarchy’.

Figura 4: Jerarquía de contornos usando cv2.RETR_LIST.

Los contornos que vamos a analizar son los siguientes:

Este procedimiento sigue para el resto de contornos.

Jerarquía de contornos aplicando cv2.RETR_CCOMP

Organiza los contornos en jerarquía de dos niveles. Es decir que si tenemos un contorno externo tendrá jerarquía 1, y uno interno jerarquía 2. Si este a su vez tiene otro contorno tendrá jerarquía 1. Esto lo veremos de mejor manera en esta imagen:

Figura 5: Imagen binaria en donde se ha representado la jerarquía de 2 niveles en amarillo y azul.

En la imagen de la figura 5 podemos encontrar contornos dentro de otros contornos, por ejemplo el primer contorno externo en amarillo se le va a asignar una jerarquía de 1, lo que podemos ver entre paréntesis, mientras el contorno interno a este tomará jerarquía 2 ya que es el hijo.

Luego nos encontramos con un nuevo contorno, este tendrá jerarquía 1 nuevamente, mientras que el interno a este 2. Por último tenemos un círculo, el contorno de este tendrá jerarquía 1. Si hubiera más contornos anidados se seguiría con el mismo procedimiento.

Procedemos a analizar la imagen que hemos estado usando a lo largo del video. (Aquí puedes ver el orden en el que aparece cada contorno)

Si analizamos los contornos con su jerarquía con lo que vimos recientemente y además indicamos el orden de aparición de los mismos al usar cv2.RETR_CCOMP obtendremos lo siguiente:

Figura 6: Jerarquía de contornos usando cv2.RETR_CCOMP.

Con estos dos ingredientes, tanto las jerarquías como el orden de cada uno de ellos podemos proceder a analizar cada contorno.

En los contornos 1, 2 y 3 puede recaer ciertas dudas, ya que decimos que no poseen padre y claramente están dentro de otro contorno. Esto se debe al uso de cv2.RETR_CCOMP, ya que como estos pasan a tener jerarquía 1, ya no tiene importancia si están o no dentro de otro contorno.

Este análisis lo realizamos con el resto de contornos.

Jerarquía de contornos aplicando cv2.RETR_TREE

Por último veremos cv2.RETR_TREE que recupera todos los contornos con sus jerarquías. (Aquí puedes ver el orden en el que aparece cada contorno)

Ahora vamor por ‘hierarchy’.

Figura 7: Jerarquía de contornos usando cv2.RETR_TREE.

Es hora de analizar cada contorno.

Seguimos el mismo procedimiento para los contornos restantes.

Referencias

#infoOmes

Salir de la versión móvil