Можно ли использовать цветовое пространство Lab для сегментации определенных цветов?

Я знаю, что самый простой способ сегментировать определенный цвет - использовать цветовое пространство HSV, но у меня есть задача сделать это в HSV, RGB и Lab... Я действительно запутался, как это сделать в Lab. Я сделал это в HSV, и это действительно просто. Вот функция, которая сегментирует человеческий цвет, используя цветовое пространство HSV.

import cv2
import matplotlib.pyplot as plt
import numpy as np

def HSV_Segmentation(image):
    lowerRange= np.array([0, 70, 0] , dtype="uint8")
    upperRange= np.array([25, 255, 255], dtype="uint8")
    mask = image[:].copy()

    imageHSV = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    imageRange = cv2.inRange(imageHSV,upperRange, lowerRange)

    mask[:,:,0] = imageRange
    mask[:,:,1] = imageRange
    mask[:,:,2] = imageRange

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    faceHSV = cv2.bitwise_and(image,mask)
    
    return faceHSV

И теперь я застрял в цветовом пространстве Lab и не совсем уверен, с чего начать. Я пробовал что-то подобное с верхним и нижним диапазоном человеческого цвета, но, очевидно, это неправильный путь.


person gkvski    schedule 07.11.2020    source источник
comment
Из Википедии CIELAB... выражает цвет тремя значениями: L* для светлоты от черного (0) до белого (100), a* от зеленого (-) до красного (+) и b* от синего (-) до желтого (+). CIELAB был разработан таким образом, что такое же количество числовых изменений в этих значениях соответствует примерно такому же количеству визуально воспринимаемых изменений. Таким образом, L - это интенсивность, и вам нужно посмотреть на соответствующие + или - значения A, B, чтобы найти нужный цвет. A и B часто предвзяты, так что все они положительны. Таким образом, вы должны смотреть на выше и ниже 50%.   -  person fmw42    schedule 08.11.2020
comment
Поэкспериментируйте с colormine.org/convert/rgb-to-lab.   -  person fmw42    schedule 08.11.2020
comment
Известно, что человеческий цвет легче сегментировать в цветовом пространстве HSV. Вы можете преобразовать LAB в HSV или найти диапазон в LAB, где вы можете получить аналогичные результаты.   -  person JoOkuma    schedule 08.11.2020
comment
@JoOkuma У вас есть ссылка на это?   -  person jtlz2    schedule 15.02.2021
comment
Некоторые из них можно найти здесь (scholar.google.com /)   -  person JoOkuma    schedule 16.02.2021


Ответы (1)


Я пробовал разные диапазоны, но это, кажется, работает для меня. Это было не так сложно :)

def Lab_Segmentation(image):
    lowerRange= np.array([0, 135, 135] , dtype="uint8")
    upperRange= np.array([255, 160, 195], dtype="uint8")
    mask = image[:].copy()

    imageLab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
    imageRange = cv2.inRange(imageLab,lowerRange, upperRange)
    
    mask[:,:,0] = imageRange
    mask[:,:,1] = imageRange
    mask[:,:,2] = imageRange
    
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
    faceLab = cv2.bitwise_and(image,mask)

    return faceLab
person gkvski    schedule 10.11.2020