高斯混合模型的皮肤检测 [英] Skin Detection with Gaussian Mixture Models

查看:346
本文介绍了高斯混合模型的皮肤检测的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我根据这个做皮肤检测算法文章。第21页有两个模型:高斯皮肤和非皮肤颜色模型的混合。

I'm doing skin detection algorithm according to this article. There are two models at page 21: Mixture of Gaussian Skin and Non-skin Color Model.

皮肤检测的第一个模型是exellent。
有例子:

The first model for skin detection works exellent. There are examples:

1)原始图片:

2)护肤

但是非皮肤模型给出错误的结果:

But the non-skin model gives wrong results:

这是我的代码:

 ipl_image_wrapper NudityDetector::filterPixelsWithGMM(const float covarinceMatrix[][3], const float meanMatrix[][3], const float weightVector[], const float probValue) const
{   
    ipl_image_wrapper mask = cvCreateImage(cvGetSize(m_image.get()), IPL_DEPTH_8U, 1);

    double probability = 0.0;
    float x[3] = { 0, 0, 0};

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

                double cov_det = 0.0;
                double power = 0.0;

                double A1 = 0.0;
                double A2 = 0.0;
                double A3 = 0.0;

                probability = 0;

                for (int k = 0; k < 16; ++k)
                {
                    cov_det = covarinceMatrix[k][0] * covarinceMatrix[k][1] * covarinceMatrix[k][2];

                    A1 = covarinceMatrix[k][1] * covarinceMatrix[k][2];
                    A2 = covarinceMatrix[k][0] * covarinceMatrix[k][2];
                    A3 = covarinceMatrix[k][0] * covarinceMatrix[k][1];

                    power =(std::pow((x[0] - meanMatrix[k][0]), 2) * A1 +
                            std::pow((x[1] - meanMatrix[k][1]), 2) * A2 +
                            std::pow((x[2] - meanMatrix[k][2]), 2) * A3 ) / (2 * cov_det);

                     probability += 100 * weightVector[k] *std::exp(-power) / (std::pow(2 * M_PI, 3/2) * std::pow(cov_det, 1/2));
                }

                if ( probability < probValue)
                {
                    (reinterpret_cast<uchar*>(mask.get()->imageData + i * mask.get()->widthStep))[j] = 0;
                }
                else
                {
                    (reinterpret_cast<uchar*>(mask.get()->imageData + i * mask.get()->widthStep))[j] = 255;
                }
            }
        }
    }

    cvDilate(mask.get(), mask.get(), NULL, 2);
    cvErode(mask.get(), mask.get(), NULL, 1);

    return mask;
}

ipl_image_wrapper NudityDetector::detectSkinWithGMM(const float probValue) const
{
   //matrices are from article
    ipl_image_wrapper mask = filterPixelsWithGMM(COVARIANCE_SKIN_MATRIX, MEAN_SKIN_MATRIX, SKIN_WEIGHT_VECTOR, probValue);

    return mask;
 }

ipl_image_wrapper NudityDetector::detectNonSkinWithGMM(const float probValue) const
{
    //matrices are from article
   ipl_image_wrapper mask = filterPixelsWithGMM(COVARIANCE_NON_SKIN_MATRIX, MEAN_NON_SKIN_MATRIX, NON_SKIN_WEIGHT_VECTOR, probValue);

   return mask;
 }

我做错了什么?也许我误解了tre的意义吗?或者我在代码中翻译了公式错误?

What I'm doing wrong? Maybe I misunderstand the meaning of tre article? Or I translated formula wrong in the code?

提前谢谢!

推荐答案

事实上,结果似乎没有问题,非皮肤模型正确识别非皮肤区域为255和皮肤区域为0.您可能只需要将参数 probValue 调整为较低的值,以除去一些假阴性(小非皮肤区域)

In fact, there seems to be nothing wrong with the results, non-skin model correctly identifies non-skin regions as 255 and skin regions as 0. You may just need to tune parameter probValue to a lower value to get rid of some false negatives (small non-skin regions)

GMM可能不是皮肤检测的有效方法,您可以使用一些边缘强度信息作为正则化参数,使得检测到的区域不会被分段。

GMM may not be an effective approach for skin detection and you may employ some edge intensity information as a regularization parameter so that detected regions will not be fragmented.

这篇关于高斯混合模型的皮肤检测的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆