zoukankan      html  css  js  c++  java
  • 肤色检测算法

          由于CSDN博客和博客园的编辑方面有不一致的地方,导致文中部分图片错位,为不影响浏览效果,建议点击打开链接 

          由于能力有限,算法层面的东西自己去创新的很少,很多都是从现有的论文中学习,然后实践的。

          本文涉及的很多算法,在网络上也有不少同类型的文章,但是肯定的一点就是,很多都是不配代码的,或者所附带的代码都是象征性的,速度慢,不优雅,不具有实用价值,本文努力解决这些问题。

          文中各算法出现的顺序并不代表算法的优越性,仅仅是作者随机排布的而已。

          2、基于RGB颜色空间的简单阈值肤色识别

           在human skin color clustering for face detection一文中提出如下简单的判别算式:

    R>95 And G>40 And B>20 And R>G And R>B And Max(R,G,B)-Min(R,G,B)>15 And Abs(R-G)>15 

      算法非常之简单,同样主要把复杂的判断条件放到后面去判断,能有效的降低程序的执行时间,参考代码:

    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Scan0 + Y * Stride;
        SkinP = SkinScan0 + Y * SkinStride;
        for (X = 0; X < Width; X++)
        {
            Blue = *Pointer; Green = *(Pointer + 1); Red = *(Pointer + 2);
            if (Red > 95 && Green > 40 && Blue > 20 && Red > Blue && Red > Green && Math.Abs(Red - Green) > 15)
            {
                if (Blue >= Green)     
                {
                    Max = Blue;
                    Min = Green;
                }
                else
                {
                    Max = Green;
                    Min = Blue;
                }
                if (Red > Max)
                    Max = Red;
                else if (Red < Min)
                    Min = Red;
                if (Max - Min > 15) *SkinP = 255;
            }
            Pointer += 3;
            SkinP++;
        }

      算法效果:

           

                          

    原图         识别结果图                                                   原图     识别结果图

         由上述结果似乎该算法得到了过多的皮肤区域,然后就是算法更喜欢美女一些(^_^)。

         3、基于YCbCr颜色空间的简单阈值肤色识别

    该算法则更为简单,将图像转换到YCbCr颜色空间,然后按下述计算式判断是否属于皮肤区域:

    (Cb > 77 And Cb < 127)  And (Cr > 133 And Cr < 173)

          关于RGB和YCbCr颜色空间的转换的优化算法,可参考本博客相关文章。

          由于当初写这方面的时候没有注明该算法的出处,现在也没从提起了。

          代码参考:

    for (Y = 0; Y < Height; Y++)
    {
        Pointer = Scan0 + Y * Stride;
        SkinP = SkinScan0 + Y * SkinStride;
        for (X = 0; X < Width; X++)
        {
            Blue = *Pointer; Green = *(Pointer + 1); Red = *(Pointer + 2);
            Cb = (-176933 * Red - 347355 * Green + 524288 * Blue + 134217728) >> 20;
            if (Cb > 77 && Cb < 127)
            {
                Cr = (524288 * Red - 439026 * Green - 85262 * Blue + 134217728) >> 20;
                if (Cr > 133 && Cr < 173) *SkinP = 255;
            }
            Pointer += 3;
            SkinP++;
        }
    }
    

         

                             

                  原图             识别结果图                                                   原图     识别结果图

         误判的区域还是很大的。

         还有一种是基于YUV颜色空间进行的肤色识别,似乎也不太准确,可参考http://www.doc88.com/p-97381067005.html

    *****************************基本上我不提供源代码,但是我会尽量用文字把对应的算法描述清楚或提供参考文档**************************

    *******************************因为靠自己的努力和实践写出来的效果才真正是自己的东西,人一定要靠自己****************************

    ***************************作者: laviewpbt   时间: 2013.8.17   联系QQ:  33184777  转载请保留本行信息*************************

  • 相关阅读:
    注意 定义类的时候 不要null 别忘了new 实例化 否则报错
    如果通过key获取dictionary里面的value
    C#邮箱身份验证
    时间选择器 可以选择日期和时间
    C#的Timer解析
    使用微软的组件发邮件
    将html代码写入临时文件夹下面的 然后发来给webbrowser使用
    c#中DataGridView 如何设置 才能选中一行 设置鼠标事件
    lumisoft 获取邮件的方法
    C# 动态添加CheckedListBox的选项,并设置选项为 选中? 怎么做?
  • 原文地址:https://www.cnblogs.com/james1207/p/3265383.html
Copyright © 2011-2022 走看看