Вопрос:

Как обнаружить два разных цвета, используя `cv2.inRange` в Python-OpenCV?

python opencv

16208 просмотра

3 ответа

38 Репутация автора

Как я могу определить «нижний» и «верхний» диапазон двух разных цветов, таких как красный и синий (потому что красный и синий не находятся рядом друг с другом в цвете 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

Автор: Nhiên Ngô Đình Источник Размещён: 05.01.2018 08:17

Ответы (3)


2 плюса

4999 Репутация автора

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

HSV Color Space

При работе в цветовом пространстве HSV важно помнить об этом, и такие концепции, как Red & Green, являются своего рода преобразованием обратно в другой тип данных.

Ваша верхняя и нижняя границы могут быть только одной точкой в ​​этом пространстве, но могут включать части красного и синего спектра, то есть фиолетового цвета. Вам нужно будет выбрать пороговые значения, которые соответствуют критериям любого результата обработки, который вам необходим.

Либо это, либо запустите два отдельных цикла, первый для порогового значения красного, а второй для порогового оттенка синего, а затем смешайте два изображения вместе, используя функции смешивания OpenCV. Смотрите здесь для смешивания двух цветовых пространств.

Автор: GPPK Размещён: 05.01.2018 08:25

17 плюса

9488 Репутация автора

Решение

Когда вы получите две маски 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

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

Автор: Kinght 金 Размещён: 05.01.2018 04:31

0 плюса

1 Репутация автора

# 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')
Автор: Abhishek yadav Размещён: 20.05.2019 03:16
Вопросы из категории :
32x32