Как обнаружить два разных цвета, используя `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 ответа

Решение

Как вы получаете две маски colors, затем используйте 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)

Источник:

введите описание изображения здесь

Найдите зеленый и желтый (диапазон не такой точный):

введите описание изображения здесь


Кстати, чтобы получить более точный диапазон, вот карта ссылки в моем ответе:

Как определить пороговое значение для обнаружения только объектов зеленого цвета на изображении:Opencv

введите описание изображения здесь

На изображении ниже показано цветовое пространство HSV, которое работает с использованием оттенка, насыщенности и значения (или яркости).

HSV Color Space

При работе в цветовом пространстве 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
Другие вопросы по тегам