Transformaciones Morfológicas con Visión Artificial

Transformaciones Morfológicas con Visión Artificial

Pensaría que para llegar a dar resultados científicos aplicando Transformaciones Morfológicas necesita de experiencas en Matemáticas y Algoritmos avanzados en Inteligencia Artificial.

Si de una pregunta se tratare, la respuesta sería en parte Si y en parte No.

  • Si, por si desea ser un experto en el tema y encontrar mil variantes posibles.

  • No, si su deseo es encontrar una aplicación rápida que puede puede hacer un combo con otras opciones, y el acceso a la misma lo obtiene rápidamente. En este Post encontrará algunos Tips, pero lo importante es considerar el orden de cada Transformación y saber en que casos aplicarla.

Si desea obtener contornos, aunque existen ya funciones más especificas, tambien podría obtener mediante estas transformaciones.

En mi caso estuve intentando varias veces detectar el contorno de la mano para poder comandar prendido y apagado de artefactos eléctricos. En parte ya funciona el proyecto, pero se necesita de un entorno controlado para que funcione en su totalidad.  La principal dificultad es que no se puede controlar diferentes ambientes, la luz de los fluorescentes por ejemplo generan mucha intermitencia luminosa que no es detectada por los ojos a simple vista, pero si por una camara digital, y ni de hablar de cambiar de ambientes o cuando usas una notebook que va bajando gradualmente de rendimiento cuando lo descontectas de la red. Para estos proyectos es deseable contar con un ambiente controlado.

Dentro del ámbito Eléctrico: «FLICKER» Es un disturbio en la amplitud de la tensión, es de tipo conducido, no simétrico (distinto en cada fase), cuya principal consecuencia es la variación del brillo de las lamparas incandescentes, que causa molestia visual, y que produce cansancio. Como ejemplo de otro fenómeno que se perciben en las luminarias.

Los Smarts TVs utilizan otras funciones adicionales que acompañan a los algortimos de reconocimiento de manos, como por ejemplo encontrar la pigmentacion adecuada del color de la piel como información adicional a los contornos que se utilizan.

Bueno, sin más palabra adicionales les voy a mostrar las funciones de OpenCV para transformaciones morfológicas. En post posteriores continuaremos discutiendo sobre este mundo apasionante de Visión Artificial e Inteligencia Artificial.

Antes de pasar al tema, muchos de los algoritmos son resueltos por Redes Neuronales, pero para Visión Artificial existen otras salidas más adecuadas, para tenerlas en cuenta…

En algún momento, se irá explicando en post posteriores como realizar un pequeño robot seguidor de linea con raspberry pi conectado a una camara que utilice la libreria OpenCV. Realizar un robot de línea blanca o negra es muy sencilla simplemente con un Sensor Infrarrojo ya se obtiene el resultado, pero la idea es poder seguir lineas de diferentes colores y formas.  Incluso se puede visualizar el trayecto del móvil en tiempo real si utilizamos cámaras IPs.  Pero ya tendría que dedicar otro post adicional para mostar como conectar una cámara IP pero eso está en estrecha relación al modelo y marca de la misma.

Se irá por parte, iniciamlmente las Tranformaciones Morfológicas:

Las transformaciones morfológicas son algunas operaciones simples basadas en la forma de la imagen. Normalmente se realiza en imágenes binarias.Necesita dos entradas, una es nuestra imagen original, la segunda se llama elemento de estructuración o kernel que decide la naturaleza de la operación.Dos operadores morfológicos básicos son la erosión y la dilatación. Luego, sus variantes de formas como Apertura, Cierre, Gradiente, etc. también entran en juego. Los veremos uno por uno con la ayuda de la siguiente imagen.

 

Los Tópicos a ser cubiertos con sus nombres en inglés:

1. Erosion
2. Dilation
3. Opening
4. Closing
5. Morphological Gradient
6. Top Hat
7. Black Hat
8. Structuring Element

Manos a la obra, debajo del material se encuentra el enlace para mayor detelle y crédito del mismo.  Especificamente se explica con tendencia del uso de Python, puede usar las referencias de C, java entre otras plataformas que admite la librería OpenCV.

 

1. Erosión

La idea básica de la erosión es como la erosión del suelo solamente, erosiona los límites del objeto de primer plano (siempre trate de mantener el primer plano en blanco). Entonces, ¿qué hace? El kernel se desliza a través de la imagen (como en la convolución 2D). Un píxel en la imagen original (1 o 0) se considerará 1 solo si todos los píxeles debajo del kernel son 1, de lo contrario se erosionará (se pondrá a cero). Entonces, lo que sucede es que todos los píxeles cerca del límite se descartarán dependiendo del tamaño del kernel. Por lo tanto, el grosor o el tamaño del objeto en primer plano disminuye o simplemente la región blanca disminuye en la imagen. Es útil para eliminar pequeños ruidos blancos (como hemos visto en el capítulo del espacio de color), separar dos objetos conectados, etc. Aquí, como ejemplo, usaría un kernel 5×5 lleno de unos. Veamos cómo funciona:

import cv2 as cv
import numpy as np
img = cv.imread(‘j.png’,0)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations = 1

 2. Dilatación

Es justo lo contrario de la erosión. Aquí, un elemento de píxel es ‘1’ si al menos un píxel debajo del núcleo es ‘1’. Por lo tanto, aumenta la región blanca en la imagen o el tamaño del objeto en primer plano aumenta. Normalmente, en casos como la eliminación de ruido, la erosión es seguida por la dilatación.Porque, la erosión elimina los ruidos blancos, pero también encoge nuestro objeto. Así lo dilataremos. Como el ruido se ha ido, no volverán, pero nuestra área de objetos aumenta. También es útil para unir partes rotas de un objeto.

dilation = cv.dilate (img, kernel, iterations = 1)

 

dilation.png

 3. Apertura

Apertura es solo otro nombre de erosión seguido de dilatación . Es útil para eliminar el ruido, como explicamos anteriormente. Aquí usamos la función, cv.morphologyEx ()

opening = cv.morphologyEx (img, cv.MORPH_OPEN, kernel)

apertura.png

4. Cierre

El cierre es al revés de Apertura, Dilatación seguida de Erosión . Es útil para cerrar pequeños orificios dentro de los objetos en primer plano o pequeños puntos negros en el objeto.

closing = cv.morphologyEx (img, cv.MORPH_CLOSE, kernel)

 

cierre.png

5. Gradiente morfológico

Es la diferencia entre la dilatación y la erosión de una imagen. El resultado se verá como el contorno del objeto.

gradient = cv.morphologyEx (img, cv.MORPH_GRADIENT, kernel)

 

gradient.png

6. sombrero de copa

Es la diferencia entre la imagen de entrada y la apertura de la imagen. El siguiente ejemplo se hace para un kernel de 9×9.

tophat = cv.morphologyEx (img, cv.MORPH_TOPHAT, kernel)

 

tophat.png

7. sombrero negro

Es la diferencia entre el cierre de la imagen de entrada y la imagen de entrada.

blackhat = cv.morphologyEx (img, cv.MORPH_BLACKHAT, kernel)

 

blackhat.png

8. Elemento estructurante

Creamos manualmente elementos de estructuración en los ejemplos anteriores con la ayuda de Numpy. Tiene forma rectangular. Pero en algunos casos, es posible que necesite granos elípticos / circulares. Entonces, para este propósito, OpenCV tiene una función, cv.getStructuringElement () . Solo pasa la forma y el tamaño del kernel, obtiene el kernel deseado.

# Kernel Rectangular
>>> cv.getStructuringElement (cv.MORPH_RECT, (5,5))
array ([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype = uint8)
# Kernel Elíptico
>>> cv.getStructuringElement (cv.MORPH_ELLIPSE, (5,5))
array ([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype = uint8)
# Kernel en forma de cruz
>>> cv.getStructuringElement (cv.MORPH_CROSS, (5,5))
array ([[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]], dtype = uint8)

Referencia y Crédito del Material: https://docs.opencv.org/trunk/d9/d61/tutorial_py_morphological_ops.html

283total visits,2visits today

ArabicChinese (Simplified)DutchEnglishFrenchGermanItalianPortugueseRussianSomaliSpanish