базовое определение кожи hsb, неоновая подсветка


14

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

Я пытаюсь реализовать супер простой детектор кожи, используя некоторый диапазон изображений HSB. Я использую подход, описанный здесь и здесь .

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

Почему?

Я использую алгоритм, описанный во втором источнике :

  1. преобразовать изображение ho HSV цветовое пространство
  2. поставить белый на диапазон 0 <H <38
  3. расширенный фильтр
  4. эродированный фильтр
  5. фильтр размытия

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

Ответы:


10

Это на самом деле может работать лучше, если использовать простую генеративную модель в RGB, а не в HSV.

  1. Получите тренировочный образ или несколько тренировочных образов с некоторой кожей.
  2. Вручную выберите пиксели скина (например, создав двоичную маску)
  3. Вычислите среднее значение и ковариацию тона кожи в RGB (каждый должен быть вектором с 3 элементами)
  4. Для неизвестного пикселя вычислите его расстояние Махаланобиса от среднего значения, используя ковариацию.
  5. Классифицируйте его как скин, если расстояние меньше порога.
  6. Настройте порог для лучшей производительности.

Редактировать: я не знаю, есть ли в OpenCV функция для вычисления ковариации, но я могу рассказать вам, как это сделать самостоятельно. Допустим, у вас есть пикселей RGB. Вы кладете их в х 3 матрицы, давайте назовем его . Затем вычислите , который представляет собой средний вектор RGB, вычислив среднее значение по столбцам. будет 1 х 3 вектор. Вычитание от каждой строки и вызвать полученную матрицу . Теперь, чтобы вычислить ковариацию, все, что вам нужно сделать, это умножить на транспонирование самого себя: . Убедитесь, что 3 х 3.NNпмммпQQСзнак равноQ'QС

Edit2: значения, которые вы получаете, кажутся слишком большими. Для получения максимальной ковариации создайте следующую матрицу:

255 255 255
 0   0   0

и вычислить ковариацию этого. Вы должны получить матрицу, в которой каждое значение приблизительно равно 32513. Поэтому убедитесь, что значения ваших пикселов находятся в диапазоне от 0 до 255, и убедитесь, что вы копируете их в числа с плавающей точкой или двойные значения. Расстояние Махаланобиса находится в единицах дисперсии, поэтому для этого числа должны быть небольшими. Ваш порог для классификации кожи, вероятно, должен быть меньше 4.


У меня есть проблема в понимании, как получить 3x3 ковариационную матрицу с OpenCV из изображения .. Можете ли вы дать мне ссылку?
nkint

@nkint, пожалуйста, смотрите отредактированный ответ.
Дима

Ок, отлично. в 5 строках вы дали мне понять, что такое ковариация. Благодарю. оно работает. но у меня проблема с сохранением результатов. если у меня есть пиксели от 0 до 255, какие цифры следует ожидать от расстояния Махаланобиса? если я храню их в 8-ю унитазе, это займет лишь небольшую часть скина, если я сохраню их в 32-поплавковом, я получу странный белый шум
nkint

да, я думаю, что делаю что-то не так, потому что моя ковариационная матрица: [10913058.00000000, 7046611.50000000, 3290781.50000000; 7046611.50000000, 4811646.00000000, 2225078.00000000; 3290781.50000000, 2225078.00000000, 1387631.87500000]
nkint

1
Вы можете думать о ковариации как об определении эллипсоида в 3D. Вы можете визуализировать это в Matlab, но это, вероятно, будет много работы. Кроме того, вы можете попытаться посмотреть на 2D-проекции эллипсоида, но это также потребует некоторой работы.
Дима

4

Примите во внимание различные значения, полученные в цвете HSV, когда применяется неоновый свет: пример его отклонения здесь . Попробуйте адаптировать свой алгоритм так, чтобы он адаптировался к этим значениям.

Здесь есть еще один алгоритм для определения кожи, и для определения условий освещения вы можете использовать этот .

Другой алгоритм, связанный с обнаружением кожи, но не слишком много связано с неоновой световых эффектов, это это одна .


2

Ответы, которые вы получили до сих пор, указывают на хорошие альтернативные методы, но если вы заинтересованы в использовании чего-то вроде вашего исходного алгоритма, это, вероятно, не сложно исправить. Вам просто нужно приспособиться к особенностям HSV в OpenCV. Учитывая странные результаты, я предполагаю, что вы, вероятно, использовали одно из наиболее распространенных числовых представлений HSV при выборе ваших пороговых значений и / или при преобразовании пикселей?

OpenCV представляет HSV иначе, чем большинство других источников, которые вы могли найти:

  • Самое большое различие для вас будет w / r / t hue: OpenCV представляет оттенок в диапазоне от 0 до 179, когда почти все остальное использует бит зависания для сохранения дополнительной информации, w / 0-255.
  • Другое отличие: измерение насыщенности инвертировано по сравнению с нормой. Таким образом, насыщение 255 означает яркое в opencv вместо белого (обратите внимание, мы вернулись к 255 - только оттенок 0-180, возможно, из-за представления 'wheel'?)

Возможно, слишком поздно, чтобы помочь вам, но это был интересный вопрос, и кто-то еще может столкнуться с той же проблемой.


-1
import sys
import numpy
import cv2

cap = cv2.VideoCapture(0)
while(1):
    _, im = cap.read()

    im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB)

    skin_ycrcb_mint = numpy.array((0, 133, 77))
    skin_ycrcb_maxt = numpy.array((255, 173, 127))
    skin_ycrcb = cv2.inRange(im_ycrcb, skin_ycrcb_mint, skin_ycrcb_maxt)

    cv2.imshow("Second Image", skin_ycrcb) # Second image
    contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, 
        cv2.CHAIN_APPROX_SIMPLE)
    for i, c in enumerate(contours):
        area = cv2.contourArea(c)
            if area > 1000:
                cv2.drawContours(im, contours, i, (255, 0, 0), 3)
    cv2.imshow("Final Image", im)         # Final image
    cv2.waitKey(1)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.