人臉美妝之唇色檢測演算法研究,人臉美唇色演算法
人臉美妝之唇色檢測演算法研究
目前,隨著臉部偵測識別技術的日趨成熟,人臉美化技術的競爭也愈演愈烈,諸如行動裝置應用類中的美咖相機,美圖秀秀,Perfect 365,天天P圖等等,這些應用無疑都在給人們的感官生活帶來新的樂趣與新的體驗,今天,我在這裡給大家介紹一下,這些人臉美妝技術中一個必不可少的內容—-唇彩。
唇彩的實現分為以下幾個步驟:
嘴唇粗略檢測
嘴唇粗略檢測的方法包括兩種:
- 1. 手動標記
手動標記往往是讓使用者自己移動特徵點來定位嘴唇地區。這種方式略繁瑣。
- 2. 自動標籤
自動標籤往往是通過Face Service技術,擷取嘴唇的大概位置。Face Service的技術目前已經日趨成熟,市面上諸如Face++等等,我們可以直接調用。
一般而言,目前的美妝軟體中,首先使用自動標籤,得到嘴唇的大概位置,如果無法檢測到人臉,那麼,會進一步讓使用者手動標記,這樣給使用者一種友好的使用者體驗。
嘴唇精確檢測
嘴唇精確位置檢測,關係到唇彩的準確度,進而影響美妝的整體效果。這裡我介紹兩種簡單的嘴唇檢測演算法:
- 1. 基於YIQ色彩空間的唇色檢測演算法
-參考論文:基於膚色和唇色資訊的臉部偵測方法的研究
演算法原理:在YIQ色彩空間中,Y表示亮度訊號,I和Q表示色度訊號,Q分量代表的顏色變化正好覆蓋了嘴唇的色彩範圍,因此,通過對嘴唇樣本的分析,得到嘴唇地區在YIQ色彩空間中的分布範圍,以此來判斷唇色。YIQ色彩空間與RGB色彩空間對應關係如下: Y = 0.299 * r + 0.587 * g + 0.114 * b; I = 0.596 * r - 0.275 * g - 0.321 * b; Q = 0.212 * r - 0.523 * g + 0.311 * b;
唇色統計的分布結果:
分量 |
範圍 |
Y |
[80,220] |
I |
[12,78] |
Q |
[7,25] |
對於當前像素P(x,y),先轉換為YIQ,然後分辨判斷YIQ分量是否符合上述唇色分布結果,如果符合,則該像素為唇色像素。
-2. 基於R,G分量分析的唇色檢測演算法
-參考文獻:一種快速魯棒的唇部檢測方法
這個演算法主要是提出了一個唇色判斷公式:
logG(B0.391∗R0.609)<T
這個公式的由來,是作者根據另外一篇文獻TW Lewis.Lip feature extraction using ed exclusion.改進而來,至於原因什麼的我們不用關心,我們關心的是如何最簡單的理解與實現效果呵呵。
這篇論文中並沒有給出T的取值,這裡我給一個經驗值:T= - 0.15;
公式中的B,R自然就是RGB色彩空間的對應分量了,對應於某個像素P(x,y),如果符合這個公式,那麼,這個像素就是唇色像素了。
-3. 演算法效果
以上兩種演算法的效果如下所示:
以上兩種方法是基於色彩空間唇色統計的方法,具有速度快,計算簡單的特點,但是,由於統計的結果只代表大多數,並非全部,因此,這兩種像素都不可能完全判斷各種條件下的唇色像素,尤其是不同環境光線條件下,容易出現誤判。對於這個缺點,一般,我們會在Face Service後,得到嘴唇的大概位置,在這個大概位置中,使用這些演算法,這樣一般就可以檢測到相對準確的嘴唇地區了,後期在結合一些形態學運算元,就可以得到準確的嘴唇地區了,對於唇彩塗色,也就完成了關鍵的一步了。
嘴唇塗色
嘴唇塗色就是根據嘴唇檢測得到的準確地區,結合顏色Color的RGB值對其進行上色的過程。
嘴唇塗色一般使用YUV色彩空間,Y表示灰階值,UV表示顏色特徵。假設嘴唇地區某像素P(x,y),塗色值Color(R,G,B),我們先計算P的Y值,然後計算Color的UV值,這樣我們就得到了塗色之後的目標YUV,在將這個YUV映射到RGB即可。
主要代碼
這裡放上嘴唇檢測的代碼程式,供大家參考:
public Bitmap LipsDetectBmp(Bitmap src) { Bitmap a = new Bitmap(src); int w = a.Width; int h = a.Height; BitmapData srcData = a.LockBits(new Rectangle(0, 0, a.Width, a.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); byte* p = (byte*)srcData.Scan0; int r = 0, g = 0, b = 0, offset = srcData.Stride - w * 4; double Y = 0, I = 0, Q = 0; double k = 0; for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { b = p[0]; g = p[1]; r = p[2]; ////////////////Process image... //演算法1 Y = 0.299 * r + 0.587 * g + 0.114 * b; I = 0.596 * r - 0.275 * g - 0.321 * b; Q = 0.212 * r - 0.523 * g + 0.311 * b; if ((Y >= 80 && Y <= 220 && I >= 12 && I <= 78 && Q >= 7 && Q <= 25)) { p[0] = (byte)255; p[1] = 0; p[2] = (byte)255; } //演算法2 //k = Math.Log((double)g / (Math.Pow((double)b, 0.391) * Math.Pow((double)r, 0.609)));//使用演算法 ////2時把演算法1注釋掉即可 //if (k < -0.15) //{ // p[0] = (byte)255; // p[1] = 0; // p[2] = (byte)255; //} p += 4; } p += offset; } a.UnlockBits(srcData); return a; }
總結
以上就是美妝演算法中的唇彩演算法過程了,跟大家分享一下,共勉!有什麼不明白的可以給我留言或郵件dongtingyue@163.com
最後,分享一個專業的影像處理網站,裡面有很多原始碼下載:
http://www.zealpixel.com/portal.php
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。