Как определить пороговое значение для обнаружения только объектов зеленого цвета на изображении:Opencv
Я просто хочу обнаружить только зеленые объекты на изображении, полученном в естественной среде. Как это определить? Поскольку здесь я хочу передать пороговое значение, скажем, "х", с помощью этого х я хочу, чтобы объекты зеленого цвета отображались в одном цвете (белом), другие должны отображаться в другом цвете (черном). этот. заранее спасибо.
3 ответа
Обновление:
Я делаю HSV
Colormap. Это more easy and accurate
найти цветовую гамму с помощью этой карты, чем раньше.
И, возможно, я должен изменить использование (40, 40,40) ~ (70, 255,255) in hsv
найти green
,
Оригинальный ответ:
- Преобразовать в
HSV
цветовое пространство, - использование
cv2.inRange(hsv, hsv_lower, hsv_higher)
чтобы получить зеленую маску.
Мы используем the range (in hsv)
: (36,0,0) ~ (86,255,255)
за это sunflower
,
Исходное изображение:
Маскированные зеленые регионы:
Больше шагов:
Основной исходный код:
import cv2
import numpy as np
## 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)
mask = cv2.inRange(hsv, (36, 0, 0), (70, 255,255))
## slice the green
imask = mask>0
green = np.zeros_like(img, np.uint8)
green[imask] = img[imask]
## save
cv2.imwrite("green.png", green)
Аналогичный:
Вступление:
Применение порога для обнаружения зеленого цвета может быть легко выполнено с использованием цветового пространства LAB .
Цветовое пространство LAB также имеет 3 канала, но в отличие от своего аналога RGB (где все 3 являются цветовыми каналами), в LAB есть 2 канала цвета и 1 канал яркости :
- L-канал : представляет значение яркости изображения.
- A-канал : представляет красный и зеленый цвета в изображении.
- B-канал : представляет синий и желтый цвета в изображении.
Соблюдая следующую схему:
Зеленый и красный цвета представлены на концах А-канала. Применение подходящего порога для любого из этих крайних значений в этом канале может сегментировать либо зеленый, либо красный цвет.
Демо:
Следующие изображения идут по порядку:
1. Исходное изображение -->> 2. A-канал преобразованного изображения LAB
3. Порог -->> 4. Маска на исходном изображении
Образец 1:
Образец 2:
Образец 3:
Код:
В коде всего несколько строк:
# read image in BGR
img = cv2.imread('image_path')
# convert to LAB space
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
# store the a-channel
a_channel = lab[:,:,1]
# Automate threshold using Otsu method
th = cv2.threshold(a_channel,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]
# Mask the result with the original image
masked = cv2.bitwise_and(img, img, mask = th)
Исключение:
Описанный выше метод отлично работает, если отчетливо проявляется зеленый цвет. Но применение автоматического порога может не всегда работать, особенно когда на одном и том же изображении присутствуют разные оттенки зеленого.
В таких случаях порог устанавливается вручную на А-канале.
img = cv2.imread('flower.jpg')
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
a_channel = lab[:,:,1]
# manually set threshold value
th = cv2.threshold(a_channel, 105, 255, cv2.THRESH_BINARY_INV)
# perform masking
masked = cv2.bitwise_and(img, img, mask = th)
Threshold image Masked image
Вы можете использовать простой сценарий порогового значения цвета HSV, чтобы определить нижний/верхний диапазоны цветов с помощью полос для любого изображения на диске. Просто измените путь к изображению в
cv2.imread()
. Пример выделения зеленого:
import cv2
import numpy as np
def nothing(x):
pass
# Load image
image = cv2.imread('1.jpg')
# Create a window
cv2.namedWindow('image')
# Create trackbars for color change
# Hue is from 0-179 for Opencv
cv2.createTrackbar('HMin', 'image', 0, 179, nothing)
cv2.createTrackbar('SMin', 'image', 0, 255, nothing)
cv2.createTrackbar('VMin', 'image', 0, 255, nothing)
cv2.createTrackbar('HMax', 'image', 0, 179, nothing)
cv2.createTrackbar('SMax', 'image', 0, 255, nothing)
cv2.createTrackbar('VMax', 'image', 0, 255, nothing)
# Set default value for Max HSV trackbars
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)
# Initialize HSV min/max values
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0
while(1):
# Get current positions of all trackbars
hMin = cv2.getTrackbarPos('HMin', 'image')
sMin = cv2.getTrackbarPos('SMin', 'image')
vMin = cv2.getTrackbarPos('VMin', 'image')
hMax = cv2.getTrackbarPos('HMax', 'image')
sMax = cv2.getTrackbarPos('SMax', 'image')
vMax = cv2.getTrackbarPos('VMax', 'image')
# Set minimum and maximum HSV values to display
lower = np.array([hMin, sMin, vMin])
upper = np.array([hMax, sMax, vMax])
# Convert to HSV format and color threshold
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(image, image, mask=mask)
# Print if there is a change in HSV value
if((phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
phMin = hMin
psMin = sMin
pvMin = vMin
phMax = hMax
psMax = sMax
pvMax = vMax
# Display result image
cv2.imshow('image', result)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
Диапазоны нижнего/верхнего цветового порога HSV
(hMin = 52 , sMin = 0, vMin = 55), (hMax = 104 , sMax = 255, vMax = 255)
После того, как вы определили свою
lower
а также
upper
Цветовые диапазоны HSV, вы можете сегментировать нужные цвета следующим образом:
import numpy as np
import cv2
image = cv2.imread('1.png')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([52, 0, 55])
upper = np.array([104, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow('result', result)
cv2.waitKey()