膚色檢測演算法 – 基於不同色彩空間簡單地區劃分的皮膚檢測演算法

來源:互聯網
上載者:User

      由於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  轉載請保留本行資訊*************************

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.