Solución:
A medida que obtienes dos máscaras de color
s, luego usa cv2.bitwise_or
para conseguir 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:
Encuentre 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 de umbral para detectar solo objetos de color verde en una imagen: Opencv
La siguiente imagen muestra el espacio de color HSV, que funciona con Tono, Saturación y Valor (o luminosidad).
Cuando se trabaja en el espacio de color HSV, es importante recordar esto y que conceptos como el rojo y el 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 del espectro rojo y azul, es decir, púrpura. Debería seleccionar valores de umbral que cumplan con los criterios de cualquier salida de procesamiento que necesite.
O eso o ejecutar dos bucles separados, el primero para reducir el rojo y el segundo para reducir el azul y luego combinar las dos imágenes usando OpenCV
Funciones de mezcla. Consulte aquí la combinación de dos espacios de color.