Как выполнить подбор тона кожи

лицо http://oi44.tinypic.com/2s7771l.jpg ( лицо )

тело http://oi40.tinypic.com/15wewpw.jpg (тело)

Привет, я новичок в обработке изображений и openCV C / C ++. Мне интересно, можно ли извлечь тон кожи из первого изображения (лица). А потом наносится второе изображение (тело).

Другими словами, пользователь загружает свое изображение лица, и программа извлекает оттенок кожи из этого изображения и наносит его на тело.

Спасибо,

Aisha

Ответы на вопрос(2)

Для нахождения кожи вы можете использовать одну из следующих формул:

1) С нормированным RGB-пространством:

for(int i = 0; i < m_image->height; ++i)
{
    for(int j = 0; j < m_image->width; ++j)
    {
        if (m_image->nChannels == 3)
        {
            int valueR = (reinterpret_cast(m_image->imageData + i * m_image->widthStep))[j * 3 + 2];
            int valueG = (reinterpret_cast(m_image->imageData + i * m_image->widthStep))[j * 3 + 1];
            int valueB = (reinterpret_cast(m_image->imageData + i * m_image->widthStep))[j * 3];

            float normR = static_cast(valueR) / static_cast(valueR + valueG + valueB);
            float normG = static_cast(valueG) / static_cast(valueR + valueG + valueB);
            float normB = static_cast(valueB) / static_cast(valueR + valueG + valueB);

            if ((normB / normG < 1.249) &&
                (( normR + normG + normB ) / ( 3 * normR ) > 0.696 ) &&
                ( 1/3.0 - normB/( normR + normG + normB ) > 0.014 ) &&
                (normG/(3* (normR + normG + normB)) < 0.108 ))
            {
              //pixel is skin
            }
        }
 }

2) в пространстве RGB:

for(size_t i = 0; i < m_image->height; ++i)
{
    for(size_t j = 0; j < m_image->width; ++j)
    {
        if (m_image->nChannels == 3)
        {
            int R = (reinterpret_cast(m_image->imageData + i * m_image->widthStep))[j * 3 + 2];
            int G = (reinterpret_cast(m_image->imageData + i * m_image->widthStep))[j * 3 + 1];
            int B = (reinterpret_cast(m_image->imageData + i * m_image->widthStep))[j * 3];

            if (( R > 95) && ( G > 40 ) && ( B > 20 ) &&
                (std::max(R, std::max( G, B) ) - std::min(R, std::min(G, B) ) > 15) &&
                (std::abs(R - G) > 15) && (R > G) && (R > B))
            {
                //skin pixel
            }

        }
    }

3) в пространстве YCrCb:

for(size_t i = 0; i < m_image->height; ++i)
{
    for(size_t j = 0; j < m_image->width; ++j)
    {
        if (m_image->nChannels == 3)
        {
            int Cr = (reinterpret_cast(image->imageData + i * image->widthStep))[j * 3 + 2];
            int Cb = (reinterpret_cast(image->imageData + i * image->widthStep))[j * 3 + 1];
            int Y = (reinterpret_cast(image->imageData + i * image->widthStep))[j * 3];

            if (( Y > 80 ) && ( Cb > 85 ) && ( Cb < 135 ) &&
                (Cr > 135) && (Cr < 180))
            {
              //skin pixel
            }           
        }
    }
}
 Aisha Jamil26 июн. 2013 г., 11:48
я извлек изображение кожи из изображения лица ... после получения значений YCrCb из него я пытаюсь установить эти значения для изображения тела ... так, чтобы оно могло соответствовать цвету кожи .. я не знаю, где я ошибаюсь, мой код не работает :(
 Aisha Jamil26 июн. 2013 г., 11:47
int main() { Mat ycrcb; Mat ycrcb1; Mat inputImage = imread("Skin image",1); Mat Image = imread("body image",1); cvtColor(inputImage,ycrcb,CV_BGR2YCrCb); cvtColor(Image,ycrcb1,CV_BGR2YCrCb); vector channels; split(ycrcb,channels); vector channels1; split(ycrcb1,channels1); channels1[0] = channels[0]; channels1[1] = channels[1]; channels1[2] = channels[2]; Mat result; merge(channels1,ycrcb1); cvtColor(ycrcb1,result,CV_YCrCb2BGR); imshow("new body image",result); return 0; }

Это сложная проблема, особенно с учетом изменения цвета в зависимости от освещения и отражения. Ранее я работал над поиском скина на изображениях, и, как правило, компонент Cr (цветность красного цвета) цветового пространства YCbCr заметно выделяется на коже. Вы можете использовать эту информацию для поиска областей кожи.

Вот пара статей, в которых делается попытка использовать цвет для определения местоположения кожи человека: 1.Взаимодействие между руками и носимыми камерами 2.Безмаркерная проверка объектов дополненной реальности

Ваш ответ на вопрос