使用高斯混合模型进行皮肤检测

2024-04-27

我正在根据以下进行皮肤检测算法本文 http://www.cc.gatech.edu/~rehg/Papers/SkinDetect-IJCV-lowres.pdf。第 21 页有两个模型:高斯皮肤混合模型和非皮肤颜色模型。

第一个皮肤检测模型效果很好。 有这样的例子:

1)原始图像:

2) 皮肤面膜

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

这是我的代码:

 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文章的含义?或者我在代码中翻译的公式错误?

先感谢您!


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用高斯混合模型进行皮肤检测 的相关文章

随机推荐

  • 使用负等式表达式进行 resharper 自定义模式替换

    我在 resharper 中有一条规则来查找对 Nullable HasValue 的调用 T foo if foo HasValue And it offers to replace with a comparison directly
  • 当所有子记录满足条件时仅选择父记录

    我有两个表 A 和 B 当所有子项 表 B 中 满足条件时 我只需要父项 A 的行 如果 B 中的一行不符合条件 那么我不需要父 A 的行 我想我需要在这里使用存在 但不展示如何使用 以下是数据表 Table A Primary Key L
  • Dao 和服务接口的需求

    我是Spring Mvc的新手 在很多教程中 我发现有一个像这样的Dao接口 public interface StudentDAO public List
  • 将 Selenium HTML 测试自动转换为 JUnit 的方法?

    我在 Mac 10 6 6 上使用 Selenium IDE 1 0 10 for Firefox 我们的 QA 部门已经为 Selenium 创建了一些 HTML 测试 我需要将其转换为 Junit 在 IDE 中 我可以通过转到 文件
  • 使用 javascript/jquery 仅选择特定元素后面的文本

    如下面的代码片段所示 我有多个文本 div 其中有粗体部分 然后是换行符 然后是一段文本 我可以 find 粗体部分 但如何使用 javascript jquery 只获取粗体部分后面换行符后面的文本部分 div class thecont
  • 如何为 Android 应用实施 Google Play 许可? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话
  • Hadoop:处理大型序列化对象

    我正在开发一个应用程序来使用 Hadoop 框架处理 和合并 几个大型 java 序列化对象 顺序 GB 大小 Hadoop 存储将文件块分布在不同的主机上 但由于反序列化需要所有块都存在于单个主机上 因此它会极大地影响性能 我该如何处理这
  • 如何解析 iPhone 中本地存储的 XML 文件?

    如何解析 iPhone 中本地存储的 XML 文件 请使用代码片段帮我解决这个问题 我已经使用了 NSXMLParser 并且实现了它 我的资源中有 r xml 文件 我刚刚解析标题并使用 NSXMLParser 显示 r xml
  • 如何使弹性盒与需要截断文本的嵌套子项一起使用?

    要让 flex child 截断带有省略号的文本 可以给父级一个 min with 0 在我的项目中 子组件嵌套在几乎 10 个不同的弹性容器中 我是否需要给所有父母一个 min width 0 或者有更好的解决方法吗 sandbox ht
  • 呈现模型与被动视图

    我想知道上述两种模式之间的区别 当您考虑到您需要在表示模型模式中同步代码并且该代码位于表示模型本身中时 那么我认为这些模式非常相似 两者都将事件委托给演示模型 演示者 演示模型和演示者命令域模型 并且也观察域模型 当发生更改时 它们都与视图
  • 推送通知不会弹出带有入门套件的react-native-firebase

    我已经克隆了React Native Firebase 启动器 https github com invertase react native firebase starter并进行了初始设置 然后根据文档重命名项目 然后添加google
  • Clojure/Java:用于声音频谱分析的 Java 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以接受大量音频数据并返回给定频带内随时间变化的平均幅度的库 我已经在 comp dsp
  • 如何将某些视图的自旋转限制为单一方向,同时允许其他视图的所有方向?

    这个问题是关于 iOS 设备旋转和 UINavigationController 中的多个受控视图 有些观点应该是仅限于纵向方向 有些应该自由自转 如果您尝试使用三个视图创建最简单的设置 您会注意到自动旋转行为有一些非常令人讨厌的怪癖 然而
  • 无法读取 null 和其他 null 变量的属性“appendChild”

    在开始之前 我想让您知道我对 Web 开发还很陌生 我还想保留这个 100 javascript 所以现在没有 jquery 或其他语言 以下代码源自该视频 https www youtube com watch v esa5hJegRfI
  • 验证 hh:mm:ss

    我是 C net 的新手 我想要验证仅采用 hh mm ss 格式的文本框 下面是我的代码及其工作原理 它给出的输出为 true 23 45 45 仅作为示例 对于 23 45 45 也为 true 仅作为示例 现在我想要验证 23 45
  • Groovy == 运算符

    到目前为止 我的理解是 是一个运算符重载 equals 然而我最近发现 new Integer 1 new Long 1 returns true whereas new Integer 1 equals new Long 1 return
  • 为什么我的 akka 日志记录不能在游戏中运行

    我的日志记录在我的播放代码中工作正常 但我的 akka 代码没有记录到文件 标准输出 class EmailActor extends Actor with ActorLogging import EmailActor log info e
  • 删除 PHP 中的标头

    为了允许缓存 PHP 生成的文件 我想确保 Pragma no cache 标头是not放 但是 如何删除可能已经设置的标头 这就对了could有可能 有人在代码中的某个地方写了header Pragma no cache 现在我想确保标头
  • 从 ISO8601 持续时间到时间以及从时间到 ISO8601 持续时间的转换

    我有 ISO8601 格式的持续时间值 并将其转换为整数秒数的时间值 如下所示 ISO8601 格式的持续时间值 P1Y duration ISO8601 Duration new params duration to seconds du
  • 使用高斯混合模型进行皮肤检测

    我正在根据以下进行皮肤检测算法本文 http www cc gatech edu rehg Papers SkinDetect IJCV lowres pdf 第 21 页有两个模型 高斯皮肤混合模型和非皮肤颜色模型 第一个皮肤检测模型效果