How to detect two different colors using `cv2.inRange` in Python-OpenCV?
How can I define "lower" and "upper" range of two different color, such as red and blue (because red and blue are not next to each other in the HSV color)
This one belongs to red:
lower_red = np.array([160,20,70])
upper_red = np.array([190,255,255])
and this one belongs to blue:
lower_blue = np.array([101,50,38])
upper_blue = np.array([110,255,255])
I tried to combine them using if condition or make their own function but not work, can you guys show me the solution?
P/s: OpenCV in Python
Solution 1:
As you get two masks of color
s, then use cv2.bitwise_or
to get the final mask.
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)
Source:
Find green and yellow(the range is not that accurate):
BTW, to get more accurate range, here is a refer map in my related answer:
How to define a threshold value to detect only green colour objects in an image :Opencv
Solution 2:
# 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')