Detección de color de imagen usando OpenCV en Python
La biblioteca OpenCV se crea para ayudar con las tareas de Computer Vision y es compatible con varios lenguajes de programación. La biblioteca tiene implementaciones de diferentes algoritmos y técnicas útiles para procesar imágenes.
Este tutorial demostrará cómo realizar la detección de color en una imagen utilizando la biblioteca OpenCV de Python.
Hay varias aplicaciones para la detección de color. Podemos usarlo para distinguir objetos en la vida real. Esto también puede considerarse una técnica de segmentación de imágenes, ya que tratamos de etiquetar cada píxel en función de características similares.
Detectaremos el color utilizando el espacio de color HSV, que significa valor de saturación de tono. Este es un espacio de color cilíndrico, que es muy útil cuando se trabaja con información de color.
El matiz determina la información del color, la saturación representa la intensidad del color y el valor determina el brillo en función de la cantidad de color que se mezcla con el negro.
Detección de color de imagen utilizando la biblioteca OpenCV en Python
Usaremos varias funciones de la biblioteca OpenCV para la detección de color. Discutámoslos a continuación.
Detectaremos un color específico en una imagen dada y agregaremos límites alrededor de los segmentos detectados.
Necesitamos convertir la imagen requerida del espacio de color BGR a HSV. Para realizar tales conversiones en imágenes, podemos usar la función cvtColor()
de la biblioteca OpenCV.
Necesitamos los límites para el color dado y devolvemos una máscara binaria de los lugares donde el color está presente en la imagen. La función inRange()
de OpenCV toma una imagen determinada y devuelve la máscara binaria de dónde se encuentra actualmente el color en función de los límites superior e inferior especificados.
Esta máscara es el subconjunto de la imagen donde se detecta el color.
Luego podemos aplicar operaciones morfológicas a esta máscara binaria para filtrar el ruido no deseado. Usaremos la función morphologyex()
de la biblioteca OpenCV para lograr esto.
Realiza la erosión después de la dilatación para cerrar pequeños agujeros en el objeto.
También necesitamos agregar límites a la imagen usando esta máscara binaria creada.
bitwise_and()
se usa para segmentar las partes de la imagen que coinciden con una máscara dada. La máscara se proporciona mediante el parámetro mask
.
Compara cada píxel de la imagen de origen y hace coincidir el correspondiente en la máscara especificada.
Para agregar los límites a esta imagen segmentada, usaremos los dos métodos, findContours()
y drawContours()
. Este contorno se puede considerar como una curva que une puntos a lo largo de un límite para una imagen segmentada.
La primera función devuelve una lista de todos los contornos de la imagen dada. Usaremos la función drawcontours()
para dibujar los contornos.
Ahora implementemos el código para la detección de color y encontremos el color verde en la siguiente imagen.
Código:
import cv2
import numpy as np
img = cv2.imread("img3.jpeg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
bound_lower = np.array([25, 20, 20])
bound_upper = np.array([100, 255, 255])
mask_green = cv2.inRange(hsv_img, bound_lower, bound_upper)
kernel = np.ones((7, 7), np.uint8)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_CLOSE, kernel)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel)
seg_img = cv2.bitwise_and(img, img, mask=mask_green)
contours, hier = cv2.findContours(
mask_green.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
output = cv2.drawContours(seg_img, contours, -1, (0, 0, 255), 3)
cv2.imshow("Result", output)
cv2.waitKey(0)
cv2.destroyAllWindows()
Producción:
Ahora vamos a informarnos sobre el código implementado.
La función imread()
lee la imagen. Convertimos el espacio de color de esta imagen de BGR a HSV usando la función cvtColor()
; observe el parámetro cv2.COLOR_BGR2HSV
dentro de la función.
Luego especificamos los valores límite superior e inferior para detectar el color verde en la imagen y creamos la máscara binaria usando la función inRange()
.
El ruido se elimina dos veces de esta máscara mediante la función morphologyEx()
.
Por primera vez, con el parámetro cv2.MORPH_CLOSE
filtramos el ruido blanco de la parte negra. Y por segunda vez, usamos el cv2.MORPH_CLOSE
para filtrar el ruido negro de la parte blanca.
Luego dibujamos los límites en la parte segmentada. Determinamos la parte segmentada y sus contornos usando el método findContours()
y dibujamos el límite con el método drawContours()
.
Conclusión
Este tutorial discutió cómo realizar la detección de color usando OpenCV en Python. Trabajamos con una imagen y detectamos las partes que coincidían con el color verde.
Hay varios pasos asociados con esto. Necesitamos convertir la imagen al espacio de color HSV correcto y crear la máscara para el color requerido.
Entonces necesitamos filtrar el ruido de esta máscara. Luego, esta máscara se usa con la imagen original para segmentar la parte detectada y dibujamos límites sobre ella.
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn