# 人臉美妝之唇色檢測算法研究
目前,隨著人臉檢測識別技術的日趨成熟,人臉美化技術的競爭也愈演愈烈,諸如移動設備應用類中的美咖相機,美圖秀秀,Perfect 365,天天P圖等等,這些應用無疑都在給人們的感官生活帶來新的樂趣與新的體驗,今天,我在這里給大家介紹一下,這些人臉美妝技術中一個必不可少的內容—-唇彩。
# 唇彩的實現分為以下幾個步驟:
* **嘴唇粗略檢測**
* **嘴唇精確檢測**
* **嘴唇涂色**
* * *
##嘴唇粗略檢測
嘴唇粗略檢測的方法包括兩種:?
- 1\. 手動標記?
手動標記往往是讓用戶自己移動特征點來定位嘴唇區域。這種方式略繁瑣。?
- 2\. 自動標記?
自動標記往往是通過人臉識別技術,獲取嘴唇的大概位置。人臉識別的技術目前已經日趨成熟,市面上諸如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\. 算法效果?
以上兩種算法的效果如下所示:?
?
以上兩種方法是基于顏色空間唇色統計的方法,具有速度快,計算簡單的特點,但是,由于統計的結果只代表大多數,并非全部,因此,這兩種像素都不可能完全判斷各種條件下的唇色像素,尤其是不同環境光條件下,容易出現誤判。對于這個缺點,一般,我們會在人臉識別后,得到嘴唇的大概位置,在這個大概位置中,使用這些算法,這樣一般就可以檢測到相對準確的嘴唇區域了,后期在結合一些形態學算子,就可以得到準確的嘴唇區域了,對于唇彩涂色,也就完成了關鍵的一步了。
##嘴唇涂色
嘴唇涂色就是根據嘴唇檢測得到的準確區域,結合顏色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](http://www.zealpixel.com/portal.php)