Это на самом деле может работать лучше, если использовать простую генеративную модель в RGB, а не в HSV.
- Получите тренировочный образ или несколько тренировочных образов с некоторой кожей.
- Вручную выберите пиксели скина (например, создав двоичную маску)
- Вычислите среднее значение и ковариацию тона кожи в RGB (каждый должен быть вектором с 3 элементами)
- Для неизвестного пикселя вычислите его расстояние Махаланобиса от среднего значения, используя ковариацию.
- Классифицируйте его как скин, если расстояние меньше порога.
- Настройте порог для лучшей производительности.
Редактировать:
я не знаю, есть ли в OpenCV функция для вычисления ковариации, но я могу рассказать вам, как это сделать самостоятельно. Допустим, у вас есть пикселей RGB. Вы кладете их в х 3 матрицы, давайте назовем его . Затем вычислите , который представляет собой средний вектор RGB, вычислив среднее значение по столбцам. будет 1 х 3 вектор. Вычитание от каждой строки и вызвать полученную матрицу . Теперь, чтобы вычислить ковариацию, все, что вам нужно сделать, это умножить на транспонирование самого себя: . Убедитесь, что 3 х 3.NNпмммпQQС= Q'QС
Edit2:
значения, которые вы получаете, кажутся слишком большими. Для получения максимальной ковариации создайте следующую матрицу:
255 255 255
0 0 0
и вычислить ковариацию этого. Вы должны получить матрицу, в которой каждое значение приблизительно равно 32513. Поэтому убедитесь, что значения ваших пикселов находятся в диапазоне от 0 до 255, и убедитесь, что вы копируете их в числа с плавающей точкой или двойные значения. Расстояние Махаланобиса находится в единицах дисперсии, поэтому для этого числа должны быть небольшими. Ваш порог для классификации кожи, вероятно, должен быть меньше 4.
Примите во внимание различные значения, полученные в цвете HSV, когда применяется неоновый свет: пример его отклонения здесь . Попробуйте адаптировать свой алгоритм так, чтобы он адаптировался к этим значениям.
Здесь есть еще один алгоритм для определения кожи, и для определения условий освещения вы можете использовать этот .
Другой алгоритм, связанный с обнаружением кожи, но не слишком много связано с неоновой световых эффектов, это это одна .
источник
Ответы, которые вы получили до сих пор, указывают на хорошие альтернативные методы, но если вы заинтересованы в использовании чего-то вроде вашего исходного алгоритма, это, вероятно, не сложно исправить. Вам просто нужно приспособиться к особенностям HSV в OpenCV. Учитывая странные результаты, я предполагаю, что вы, вероятно, использовали одно из наиболее распространенных числовых представлений HSV при выборе ваших пороговых значений и / или при преобразовании пикселей?
OpenCV представляет HSV иначе, чем большинство других источников, которые вы могли найти:
Возможно, слишком поздно, чтобы помочь вам, но это был интересный вопрос, и кто-то еще может столкнуться с той же проблемой.
источник
источник