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

Я просто хочу обнаружить только зеленые объекты на изображении, полученном в естественной среде. Как это определить? Поскольку здесь я хочу передать пороговое значение, скажем, "х", с помощью этого х я хочу, чтобы объекты зеленого цвета отображались в одном цвете (белом), другие должны отображаться в другом цвете (черном). этот. заранее спасибо.

3 ответа

Обновление:

Я делаю HSV Colormap. Это more easy and accurate найти цветовую гамму с помощью этой карты, чем раньше.

И, возможно, я должен изменить использование (40, 40,40) ~ (70, 255,255) in hsv найти green,

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


Оригинальный ответ:

  1. Преобразовать в HSV цветовое пространство,
  2. использование 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)

Аналогичный:

  1. Выбор правильной верхней и нижней границ ВПГ для определения цвета с помощью `cv::inRange` (OpenCV)

Вступление:

Применение порога для обнаружения зеленого цвета может быть легко выполнено с использованием цветового пространства 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()
Другие вопросы по тегам