大白話磨皮美顏原理

大白話磨皮美顏原理

在這裏插入圖片描述
談到磨皮美顏,大家可能認爲是一個很高深難懂的事情,網上搜索關於美顏的文章,一般都是搬出許多算法,看得讓你頭暈目眩的。本篇文章將用大白話來讓你快速認識磨皮美顏原理,輕鬆get到她的點!只要你耐着性子讀完本篇文章,你會發現美顏原理其實也是一件很好理解的事情

磨皮美顏概念


認清目的


講磨皮美顏之前,先講講我們的人臉,認清磨皮美顏的目的;通常,我們的人臉上或許有許多痘痘和一些暗色粗糙皮膚,美顏的目的就是儘可能使痘痘消失,暗色皮膚變白,使粗糙變細膩,達到美顏效果,從上訴的分析可以得出我們需要做的事情如下:

  1. 尋找臉上的特徵點,如痘痘、暗色粗糙皮膚
  2. 對痘痘、粗糙皮膚加以處理,完成美化

特徵點分析


我們通常看到痘痘和暗色皮膚,仔細觀察,會發現這些特徵點和周圍正常皮膚在膚色上有一個差別;如果拍照拍下來,用灰度值查看這個圖片,你會發現特徵點灰度值較低,而正常白色皮膚灰度值較高,這是一個凸變的過程,正常皮膚到特徵點,灰度值從高點陡然下跌;我們可以用這個現象來把特徵點提取出來,如何提取請繼續往下看;

另一個是局部粗糙皮膚,其局部灰度值,也需要儘可能將其數字磨平,讓它和正常皮膚一樣,和上面痘痘一樣,也會有一個灰度值陡然下降的過程

特徵點提取


這裏需要一種濾波算法,可以是均值化濾波、高斯濾波、雙邊濾波和導向濾波等算法,考慮到手機CPU性能,我們一般選擇高斯濾波,加權求平均的算法;試想一下,一張二維灰度值人臉圖片,特徵點灰度值低,正常皮膚灰度值高,濾波算法過後,正常皮膚變化不大,特徵點因爲周圍正常皮膚灰度值較高的原因,普遍灰度值會有一個變大的效果,這個時候我們用原圖灰度值減去濾波後的灰度值,那麼特徵點的灰度值是小於0位負的,正常皮膚灰度值爲正的,這樣我們就得到整張人臉圖片的特徵點了

= 特徵點 = 原圖 - 濾波後的圖

我們歸一化灰度值,也就是將灰度值0-255歸一化爲0-1的取值,按照上面的步驟,得到特徵點後,給他統一加0.5,也就是

=+0.5 特徵點 = 原圖 - 濾波後的圖 + 0.5

這樣,我們的特徵點小於0.5,正常皮膚的是大於0.5的

特徵點加強

爲了使我們的特徵點更明顯,我們對特徵點加強,主要是使特徵更加明顯,後續好處理;得到一個高度反差的圖像,如下圖:
在這裏插入圖片描述
如上圖,手上有皺紋以及關節處黑色比較明顯,得到了特徵點加強圖片

源碼:

float features = primaryColor - filterColor + 0.5;
for(int i = 0; i < 5; i++){
	strength(features);
}

float strength(int color){
	if(color <= 0.5)
        color = color * color * 2.0;
    else
        color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
    return color;
}

注意: 濾波越細膩,磨皮效果越好

特徵點處理


經過上一步,特徵點已經處理了,那特徵點如何處理了,處理的原則又是什麼呢?
那就是對特徵點亮化處理,增加其灰度值大小,使其儘可能比原色更白,和正常膚色一樣,那如何才能達成這一效果?
請看以下算法:

//點積 luminance爲原圖計算後的灰度值
float luminance = dot(primaryColor, W);
//luminance的params次冪 第二個參數越小,alpha越小,後一步原圖與高反差的減後值越大,加上原圖後值更大,亮度更好,也就是美顏越好
float alpha = pow(luminance, 0.1);
//原圖減去高反差higPass,高反差小於0.5的變得更小,原圖減去更小的黑色高反差,會是正值,保留的是正值加上原圖,黑色像素部分能量更大,如痘印黑色皮膚,能量大顯示就偏白,美白效果
//而大於0.5的白色,高反差highPass更大,原圖減去後則是負值,原圖加負值則能量變小,白色就偏暗
vec3 smoothColor = primaryColor + (primaryColor-vec3(features))*alpha*0.1;

算法解釋都在代碼註釋裏面了,主要還是看第三句代碼:

primaryColor-vec3(features):
原圖減去特徵點,暗色的特徵點很小,減法後值更大;正常皮膚特徵點大,減法後值越小;最後在加上原圖,原圖特徵點值變大了,就會顯得亮度更亮,實現了我們要的效果

細節補償


進過上面的圖像處理時,會有一定的圖像細節丟失,我們需要將原始圖像和處理圖像融合進行細節補償,達到細節補償效果;

gl_FragColor = vec4(mix(smoothColor.rgb, max(smoothColor, primaryColor), alpha), 1.0);

先用max選擇亮度較高的灰度值,最後在與處理圖融合;
這裏爲什麼要用max函數來處理一遍呢,因爲在特徵點處理步驟,正常圖片做減法後的加法,其灰度值可能比原圖更低,所以這裏這麼處理,最後我們得到的圖片效果;

在這裏插入圖片描述

美顏擴展

以上就是磨皮美顏的常規處理,最終效果上看確實達到了美顏的效果;

美顏不僅僅是美膚,還有瘦臉、大眼睛等,這些纔是美顏的進階!

更多精彩博文,微信看下圖!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章