Это на самом деле может работать лучше, если использовать простую генеративную модель в 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.