python opencv

¿Cómo detectar dos colores diferentes usando `cv2.inRange` en Python-OpenCV?



(3)

A medida que obtiene dos máscaras de color s, use cv2.bitwise_or para obtener la máscara final.

import cv2 ## Read img = cv2.imread("sunflower.jpg") ## convert to hsv hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) ## mask of green (36,0,0) ~ (70, 255,255) mask1 = cv2.inRange(hsv, (36, 0, 0), (70, 255,255)) ## mask o yellow (15,0,0) ~ (36, 255, 255) mask2 = cv2.inRange(hsv, (15,0,0), (36, 255, 255)) ## final mask and masked mask = cv2.bitwise_or(mask1, mask2) target = cv2.bitwise_and(img,img, mask=mask) cv2.imwrite("target.png", target)

Fuente:

Encuentra verde y amarillo (el rango no es tan preciso):

Por cierto, para obtener un rango más preciso, aquí hay un mapa de referencia en mi respuesta relacionada:

Cómo definir un valor umbral para detectar solo objetos de color verde en una imagen: Opencv

¿Cómo puedo definir el rango "inferior" y "superior" de dos colores diferentes, como el rojo y el azul (porque el rojo y el azul no están uno al lado del otro en el color HSV)

Este pertenece al rojo:

lower_red = np.array([160,20,70]) upper_red = np.array([190,255,255])

y este pertenece al azul:

lower_blue = np.array([101,50,38]) upper_blue = np.array([110,255,255])

Intenté combinarlos usando if condition o hacer su propia función pero no funciona, ¿pueden mostrarme la solución?

P / s: OpenCV en Python


La imagen a continuación muestra el espacio de color HSV, que funciona con Tono, Saturación y Valor (o luminosidad).

Cuando trabaje en el espacio de color HSV, es importante recordar esto y que conceptos como Rojo y Verde son una especie de conversión a un tipo de datos diferente.

Por lo tanto, sus límites superior e inferior solo pueden ser un punto en este espacio, pero pueden incluir partes de los espectros rojo y azul, es decir, púrpura. Debería seleccionar valores de umbral que cumplan los criterios de cualquier salida de procesamiento que necesite.

O eso, o ejecuta dos bucles separados, el primero para reducir el rojo y el segundo para reducir el azul y luego mezclar las dos imágenes juntas usando las funciones OpenCV Blend. Vea here para mezclar dos espacios de color.


# Make a copy of the image image_copy = np.copy(image) ## TODO: Define the color selection boundaries in RGB values # play around with these values until you isolate the blue background lower_blue = np.array([200,0,0]) upper_blue = np.array([250,250,255]) # Define the masked area mask = cv2.inRange(image_copy, lower_blue, upper_blue) # Vizualize the mask plt.imshow(mask,cmap=''gray'')