膚色檢測算法 - 基于二次多項式混合模型的膚色檢測。

由于CSDN博客和博客園的編輯方面有不一致的地方,導致文中部分圖片錯位,為不影響瀏覽效果,建議點擊打開鏈接?

????? 由于能力有限,算法層面的東西自己去創新的很少,很多都是從現有的論文中學習,然后實踐的。

????? 本文涉及的很多算法,在網絡上也有不少同類型的文章,但是肯定的一點就是,很多都是不配代碼的,或者所附帶的代碼都是象征性的,速度慢,不優雅,不具有實用價值,本文努力解決這些問題。

????? 文中各算法出現的順序并不代表算法的優越性,僅僅是作者隨機排布的而已。

????? 1、二次多項式混合模型

?????????? 二次多項式混合模型首先有SORIANO提出,此后CHIANG對此進行了改進。改進后的模型由兩個R-G平面的二次多項式和一個圓方程構成:

在以上三個方程的基礎上,膚色區域可以通過一下規則實現:

???????????????

?????上述算法的參考論文:Adaptive skin color modeling using the skin locus.pdf??

?A novel method for detecting lips,eyes and faces in real time

以及百度文庫相關文章:基于混合膚色模型的快速人臉檢測算法?

?????上式中,小寫r,g,b(未涉及)為對R/G/B(byte類型的數據,0-255)進行歸一化后的數據,即:

?????????????

?????如上所示,算法中涉及到了不少的浮點運算,以及大量的乘法,如果按照源汁原味的來編寫代碼,程序的效率可想而知。因此,我們著手于算法的優化。

?????首先,我們來看四個判斷條件,由于判斷條件是不分先后,需要同時滿足的地方才是區域,因此應該把簡單的判斷條件放在最前面判斷。

?????首先看如果符合了判斷條件R4,條件R3中的R>G肯定是已經成立的,則只需要判斷G是否大于B,這是優化手段1。 ?

???? 然后我們來看R2的優化,為方便表達,我們這里令Sum=R+G+B,將判斷條件R2展開:

???????????? ? ? ????

?????上式子最后一步同時乘以156, 理論上說156×0.33=51.48,不應該取52的,不過這個0.33本來就是個經驗數據,誰說不能是1/3呢。

?????到此,我們看到在式子的最右側還有個浮點數0.0624,如果不消除該數據,算法速度依舊會有大的影響,常常研究移位的朋友肯定對0.0625這個數字很熟悉,1/16=0.0625,不是嗎,懂了嗎,還不懂,看代碼吧(這里的式子很多都是經驗公式,因此,稍微修改一些參數對結果基本無影響)。

???? 上述這樣做的目的,無非是將浮點數的運算全部轉換為整數的運算。

最后來看式R1的優化,R1實際上也是兩個條件,把他分開來,分別稱為R11及R12,對于R11,同樣展開:

??????? ???? ??

?????現在大部分的PC都還是32位的系統,因此,使用32位的整數類數據類型速度是最快的,因此,如果上述放大系數的取奪就必須主要使得計算式兩邊的值都在int.MinValue和 int.MaxValue之間,比如上式,>號左側算式的肯能最大取值為10000×255×765,是小于int.MaxValue所能表達的范圍的,因此放大系數是合理的。

???? 對于R12的展開我想應該不需要我在去貼出來了吧。

???? 算法部分參考代碼:

for (Y = 0; Y < Height; Y++)
{Pointer = Scan0 + Y * Stride;SkinP = SkinScan0 + Y * SkinStride;for (X = 0; X < Width; X++){*SkinP = 0;                                 // 非皮膚區域為黑色Blue = *Pointer; Green = *(Pointer + 1); Red = *(Pointer + 2);if (Red - Green >= 45)                                              //  符合條件R4
        {if (Green > Blue)                                               //   符合條件R3
            {Sum = Red + Green + Blue;T1 = 156 * Red - 52 * Sum;                                 T2 = 156 * Green - 52 * Sum;if (T1 * T1 + T2 * T2 >= (Sum * Sum) >> 4)                    // 符合條件R2,在32位系統要盡量避免用long類型數據,
                   {T1 = 10000 * Green * Sum;Lower = - 7760 * Red * Red + 5601 * Red * Sum + 1766 * Sum * Sum;         // 把這里的公用的乘法提取出來基本沒啥優化的效果if (T1 > Lower)                                         // 符合條件R11
                    {Upper = - 13767 * Red * Red + 10743 * Red * Sum + 1452 * Sum * Sum ;if (T1 < Upper)                                     //  符合條件R12
                        {*SkinP = 255;}}}}}Pointer += 3;SkinP++;}

本人特喜歡優化,特別是代碼層面的優化,比如上述的?Lower = 5601 * Red * Sum + 1766 * Sum * Sum 這句,偶爾我寫成Lower =- Red * Red * 7760+ 5601 * Red * Sum + 1766 * Sum * Sum 這樣,然后沒事的時候我反匯編了兩種寫法有什么不同,結果如下:

 Lower =-7760 * Red * Red+ 5601 * Red * Sum + 1766 * Sum * Sum ;         // 把這里的公用的乘法提取出來基本沒啥優化的效果
00000118  imul        ebx,ecx,0FFFFE1B0h 
0000011e  imul        ebx,ecx 
00000121  imul        eax,ecx,15E1h 
00000127  imul        eax,esi 
0000012a  add         ebx,eax 
0000012c  imul        eax,esi,6E6h 
00000132  imul        eax,esi 
00000135  add         ebx,eax 

?

 Lower = -Red * Red * 7760 * +5601 * Red * Sum + 1766 * Sum * Sum;         // 把這里的公用的乘法提取出來基本沒啥優化的效果
00000118  mov         ebx,ecx 
0000011a  neg         ebx 
0000011c  imul        ebx,ecx 
0000011f  imul        ebx,ebx,1E50h 
00000125  imul        ebx,ebx,15E1h 
0000012b  imul        ebx,ecx 
0000012e  imul        ebx,esi 
00000131  imul        eax,esi,6E6h 
00000137  imul        eax,esi 
0000013a  add         ebx,eax 

???? 可見多了兩條匯編語句的。可能這個優化舉在這里不合適,因為有個系數-7760,一般誰都不會像上面寫,但是如果系數是-1,那就比一定了,比如如果是-Red+Blue 和Blue-Red那就有著截然不同的意義了。

????? 這個算法的皮膚檢測效果還是很不錯的,那原文中的圖像來舉例如下:

? ? ? ?????

? ????? 原圖???????????????????????????????????????????????????????????夢版圖????????????????????????????????????????????????????? 合成圖

?然后貼一張別人博客上的照片的例子(一群帥哥和美女):

?檢測結果:

? 由于是有選擇性的執行,因此程序執行的速度其實和圖像的內容有關,同樣一副大小的圖像,如果皮膚部分站的比例越大,執行的時間可能就會越長,就上述這幅800*600的圖像來說,在我I3的筆記本上僅用了4ms就得到了結果,因此速度是相當的快的。

????? 測試工程隨后附上。

?????

*****************************基本上我不提供源代碼,但是我會盡量用文字把對應的算法描述清楚或提供參考文檔**************************

*******************************因為靠自己的努力和實踐寫出來的效果才真正是自己的東西,人一定要靠自己****************************

***************************作者: laviewpbt ? 時間: 2013.8.17???聯系QQ: ?33184777 ?轉載請保留本行信息*************************

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388607.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388607.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388607.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle解析儒略日,利用to_char獲取當前日期準確的周數!

總的來說周數的算法有兩種&#xff1a;算法一&#xff1a;iw算法&#xff0c;每周為星期一到星期日算一周&#xff0c;且每年的第一個星期一為第一周&#xff0c;就拿2014年來說&#xff0c;2014-01-01是星期三&#xff0c;但還是算為今年的第一周&#xff0c;可以簡單的用sql函…

密碼機

樹狀數組1 #include<bits/stdc.h>2 using namespace std;3 int x,y,c[200005];4 char str[20];5 int inline read(){6 int x0,f1;7 char chgetchar();8 while(ch<0||ch>9)9 chgetchar(); 10 while(ch>0&&ch<9){ 11 …

js有默認參數的函數加參數_函數參數:默認,關鍵字和任意

js有默認參數的函數加參數PYTHON開發人員的提示 (TIPS FOR PYTHON DEVELOPERS) Think that you are writing a function that accepts multiple parameters, and there is often a common value for some of these parameters. For instance, you would like to be able to cal…

sql management studio 附加mdf文件出錯的解決辦法

將mdf文件所在文件夾的權限改為everyone.&#xff0c;完全控制即可。

oracle raise_application_error,RAISE_ APPLICATION_ ERROR--之異常處理

平時用來測試的異常處理我們都是通過dbms_output.put_line來輸出異常信息&#xff0c;但是在實際的應用中&#xff0c;需要把異常信息返回給調用的客戶端。其實 RAISE_APPLICATION_ERROR 是將應用程序專有的錯誤從服務器端轉達到客戶端應用程序(其他機器上的SQLPLUS或者其他前臺…

金融信息交換協議

隨著網絡的使用&#xff0c;目前所有大型的金融機構都已經實現了自動化和數字化。當中肯定少不了互聯網的加入&#xff0c;那么在這當中&#xff0c;我們主要介紹一下FIX協議。它是由國際FIX協會組織提供的一個開放式協議&#xff0c;目的是推動國際貿易電子化的進程&#xff0…

2018大數據學習路線從入門到精通

最近很多人問小編現在學習大數據這么多&#xff0c;他們都是如何學習的呢。很多初學者在萌生向大數據方向發展的想法之后&#xff0c;不免產生一些疑問&#xff0c;應該怎樣入門&#xff1f;應該學習哪些技術&#xff1f;學習路線又是什么&#xff1f;今天小編特意為大家整理了…

相似鄰里算法_紐約市-鄰里之戰

相似鄰里算法IBM Data Science Capstone ProjectIBM Data Science Capstone項目 分析和可視化與服裝店投資者的要求有關的紐約市結構 (Analyzing and visualizing the structure of New York City in relation to the requirements of a Clothing Store Investor) 介紹 (Introd…

一、面向對象

第一節&#xff1a;面向對象編程1.面向對象三大原則&#xff1a;封裝&#xff1a;就是把客觀事物封裝成抽象的類&#xff0c;并且類可以把自己的數據和方法只讓可信的類或者對象操作&#xff0c;對不可信的進行信息隱藏。繼承&#xff1a;繼承&#xff0c;指可以讓某個類型的對…

[poj 1364]King[差分約束詳解(續篇)][超級源點][SPFA][Bellman-Ford]

題意 有n個數的序列, 下標為[1.. N ], 限制條件為: 下標從 si 到 sini 的項求和 < 或 > ki. 一共有m個限制條件. 問是否存在滿足條件的序列. 思路 轉化為差分約束, 就是 即 Si 為第 i 項的前綴和, 特別的 So 為0. 轉化不等式(連續子段和變為前綴和之差 > < 變為 &g…

linux質控命令,Linux下microRNA質控-cutadapt安裝

如果Linux系統已安裝pip或conda&#xff0c;cutadapt的安裝相對簡便一些&#xff0c;示例如下&#xff1a;1.pip安裝pip install --user --upgrade cutadapt添加環境變量echo export PATH$PATH:/your path/cutadapt-1.10/bin >> ~/.bashrc2.conda安裝conda install -c b…

采用多播傳送FIX行情數據的推薦方案

理由FIX協議由一個會話層協議&#xff0c;一個應用層協議和一套域數據字典組成。后兩者不依賴于FIX會話。而且&#xff0c;由于FIX會話作為Point-to-point&#xff08;點-對-點&#xff09;通信&#xff0c;并不適合于發布/訂閱模式&#xff08;如為大量接收者提供市場數據&…

AJAX 異步加載技術

AJAX 異步 JavaScript 和 XML。 AJAX 是一種用于創建快速動態網頁的技術。 通過在后臺與服務器進行少量數據交換&#xff0c;AJAX 可以使網頁實現異步更新。這意味著可以在不重新加載整個網頁的情況下&#xff0c;對網頁的某部分進行更新。 傳統的網頁&#xff08;不使用 AJAX…

linux分辨率和用戶有關嗎,Linux系統在高分屏非正常分辨率顯示

問題描述&#xff1a;win10重裝為Ubuntu16.04&#xff0c;在1920x1080的顯示屏上&#xff0c;linux系統分辨率只有800x600xrandr # 查看當前顯示分辨率#輸出&#xff1a;[Screen 0: minimum 800 x 600, current 800 x 600, maximum 800 x 600]可以看出顯示屏最小為800x600&…

數據透視表和數據交叉表_數據透視表的數據提取

數據透視表和數據交叉表Consider the data of healthcare drugs as provided in the excel sheet. The concept of pivot tables in python allows you to extract the significance from a large detailed dataset. A pivot table helps in tracking only the required inform…

金融信息交換協議(FIX)v5.0

1. 什么是FIXFinancial Information eXchange(FIX)金融信息交換協議的制定是由多個致力于提升其相互間交易流程效率的金融機構和經紀商于1992年共同發起。這些企業把他們及他們的行業視為一個整體&#xff0c;認為能夠從對交易指示&#xff0c;交易指令及交易執行的高效電子數…

觀光公交

【問題描述】 風景迷人的小城 Y 市&#xff0c;擁有 n 個美麗的景點。由于慕名而來的游客越來越多&#xff0c;Y 市特意安排了一輛觀光公交車&#xff0c;為游客提供更便捷的交通服務。觀光公交車在第 0 分鐘出現在 1 號景點&#xff0c;隨后依次前往 2、3、4……n 號景點。從…

linux行命令測網速,Linux命令行測試網速的方法

最近給服務器調整了互聯網帶寬的限速策略&#xff0c;調到100M讓自己網站也爽一下。一般在windows上我喜歡用speedtest.net來測試&#xff0c;測速結果也被大家認可。在linux上speedtest.net提供了一個命令行工具speedtest-cli&#xff0c;用起來很方便&#xff0c;這里分享一下…

Delphi XE2獲取漢字拼音首字母

function CnPYIndex(const CnString: string): string;{ 返回中文的拼音首字母}const ChinaCode: array[0..25, 0..1] of Integer ((1601, 1636), (1637, 1832), (1833, 2077), (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000), …

圖像處理傅里葉變換圖像變化_傅里葉變換和圖像床單視圖。

圖像處理傅里葉變換圖像變化What do Fourier Transforms do? What do the Fourier modes represent? Why are Fourier Transforms notoriously popular for data compression? These are the questions this article aims to address using an interesting analogy to repre…