основне виявлення шкіри hsb, неонове освітлення


14

Я сподіваюся, що це правильне запитання. в іншому випадку вибачте за мою помилку і просимо порадити кращий сайт.

Я намагаюся реалізувати надзвичайно простий детектор шкіри, використовуючи деякий діапазон зображень hsb. Я використовую підхід, описаний тут і тут .

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

чому?

Я використовую алгоритм, описаний у другому джерелі :

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

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

Відповіді:


10

Це фактично може працювати краще, використовуючи просту генеративну модель в RGB, а не HSV.

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

nnPmmmPQQC=QQC дорівнює 3 х 3.

Edit2: Значення, які ви отримуєте, здаються занадто великими. Для отримання максимальної коваріації створіть таку матрицю:

255 255 255
 0   0   0

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


У мене є проблеми в розумінні того, як отримати коваріаційну матрицю 3x3 з opencv від зображення .. Ви можете дати мені деяку посилання?
nkint

@nkint, дивіться відредаговану відповідь.
Діма

ОК здорово. у 5 рядках ти дав мені зрозуміти, що таке коваріація. Спасибі. це працює. але у мене проблеми зі зберіганням результатів. якщо у мене пікселі від 0-255, які цифри я повинен очікувати відстані махаланобіса? якщо я зберігаю їх у 8-унтовій, це займе лише частину шкіри, якщо я зберігаю їх у 32-поплавковому
плані,

так, я думаю, я роблю щось не так, оскільки моя матриця коваріації: [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 відтінок: OpenCV представляє відтінок від 0 до 179, коли майже все інше використовує перевагу підвісного біта, щоб зберегти більше інформації, w / 0-255.
  • Інша відмінність: вимірювання насиченості інвертується порівняно з нормою. Отже, насиченість 255 означає яскравий у opencv, а не білий (зауважте, ми повернулися до 255 - лише відтінок 0-180, можливо, через представлення "колеса"?)

Напевно, пізно вам допомогти, але це було цікаве питання, і хтось інший може зіткнутися з тим же питанням.


-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.