Как обнаружить два разных цвета, используя `cv2.inRange` в Python-OpenCV?
Как я могу определить "нижний" и "верхний" диапазон двух разных цветов, таких как красный и синий (потому что красный и синий не находятся рядом друг с другом в цвете HSV)
Этот принадлежит к красному:
lower_red = np.array([160,20,70])
upper_red = np.array([190,255,255])
и этот принадлежит синему:
lower_blue = np.array([101,50,38])
upper_blue = np.array([110,255,255])
Я попытался объединить их, используя условие или сделать свою собственную функцию, но не работает, вы, ребята, можете показать мне решение?
P / s: OpenCV в Python
4 ответа
Как вы получаете две маски color
s, затем используйте cv2.bitwise_or
чтобы получить окончательную маску.
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)
Источник:
Найдите зеленый и желтый (диапазон не такой точный):
Кстати, чтобы получить более точный диапазон, вот карта ссылки в моем ответе:
На изображении ниже показано цветовое пространство HSV, которое работает с использованием оттенка, насыщенности и значения (или яркости).
При работе в цветовом пространстве HSV важно помнить об этом, и такие концепции, как Red & Green, являются своего рода преобразованием обратно в другой тип данных.
Ваша верхняя и нижняя границы могут быть только одной точкой в этом пространстве, но могут включать части красного и синего спектра, то есть фиолетового цвета. Вам нужно будет выбрать пороговые значения, которые соответствуют критериям любого результата обработки, который вам нужен.
Либо так, либо запустите два отдельных цикла, первый для порогового значения красного, второй - для порогового оттенка синего, а затем смешайте два изображения вместе, используя функции смешивания OpenCV. Смотрите здесь для смешивания двух цветовых пространств.
# 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')
Кроме того, вы можете создать две свои маски и объединить их в одну маску, как показано ниже;
finalmask = mask_red | mask_blue
Это то же самое, что и использование bitwise_or. И вы можете создать множество таких масок;
maskf = maskA | maskB | maskC