¿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'')