美顏實(shí)現(xiàn)原理

五官調(diào)整

五官調(diào)整包括如下效果

wuguan.jpg

最常見的大眼瘦臉效果實(shí)現(xiàn)方法有很多,包括局部調(diào)整算法,圖片變形算法和基于深度學(xué)習(xí)的妝容遷移算法

局部平移算法

瘦臉及眼睛放大的前提是需要檢測到人臉,提取特征點(diǎn)后進(jìn)行相應(yīng)的圖像變形處理得到最終效果


image.png

由拉伸中心向某一點(diǎn)拉伸,以上圖為例,點(diǎn)位18和點(diǎn)位25向點(diǎn)位30收縮,可以達(dá)到瘦臉效果,點(diǎn)位21和點(diǎn)位23向點(diǎn)位57收縮可以達(dá)到瘦下巴的效果

vec2 stretchFun(vec2 textureCoord, vec2 originPosition, vec2 targetPosition, float delta) {
            vec2 offset = vec2(0.0);
            vec2 result = vec2(0.0);
            vec2 direction = (targetPosition - originPosition) * delta;
            float radius = distance(vec2(targetPosition.x, targetPosition.y / aspectRatio), vec2(originPosition.x, originPosition.y / aspectRatio));
            float ratio = distance(vec2(textureCoord.x, textureCoord.y / aspectRatio), vec2(originPosition.x, originPosition.y / aspectRatio)) / radius;
            ratio = 1.0 - ratio;
            ratio = clamp(ratio, 0.0, 1.0);
            offset = direction * ratio;
            result = textureCoord - offset;
            return result;
 }

最終實(shí)現(xiàn)效果


image (1).png

局部縮放算法

眼睛.jpg

眼睛放大的時候只有圓形區(qū)域內(nèi)的圖像才進(jìn)行變形,越靠近圓形,變形越大,反之變形越小,這樣保證不改變臉部的整體信息


image (2).png

假設(shè)當(dāng)前點(diǎn)為(x,y),手動指定變形區(qū)域的中心點(diǎn)為C(cx,cy),變形區(qū)域半徑為r,手動調(diào)整變形終點(diǎn)(從中心點(diǎn)到某個位置M)為M(mx,my),變形程度為strength,當(dāng)前點(diǎn)對應(yīng)變形后的目標(biāo)位置為U。
1、只有圓形選區(qū)內(nèi)的圖像才進(jìn)行變形
2、越靠近圓心,變形越大,越靠近邊緣的變形越小,邊界處無變形
3、圓外像素不發(fā)生偏移

vec2 warpPositionToUse(vec2 centerPostion, vec2 currentPosition,
                       float radiusEye, float scaleRatio, float aspectRatio) {
    vec2 positionToUse = currentPosition;
    vec2 currentPositionToUse = vec2(currentPosition.x,
                                     currentPosition.y * aspectRatio + 0.5 - 0.5 * aspectRatio);
    vec2 centerPostionToUse = vec2(centerPostion.x,
                                   centerPostion.y * aspectRatio + 0.5 - 0.5 * aspectRatio);
    
    float r = distance(currentPositionToUse, centerPostionToUse);
    if (r < radiusEye) {
        /// r 越大則 alpha 越接近于 1 (基本不變)
        /// r 越小,則放大效果越明顯(顯示中心處的顏色)
        float alpha = 1.0 - scaleRatio * pow(r / radiusEye - 1.0, 2.0);
        positionToUse = centerPostion + alpha * (currentPosition - centerPostion);
    }
    return positionToUse;
}

最終效果


image (3).png

美膚效果

美白

美白方式一般分為兩種,一種是不考慮皮膚區(qū)域,全圖美白,一種是僅針對皮膚區(qū)域美白
美白算法有多種,總結(jié)來分為兩種,LUT調(diào)色法和圖層混合法

LUT法

通過類似PS軟件中調(diào)節(jié)亮度,對比度,曲線,色彩平衡等方式生成LUT表,優(yōu)點(diǎn)是使用顏色濾鏡LUT速度快

圖層混合法

通過使用PS中的圖層混合模式達(dá)到美白效果,具體思想是:將原圖中的皮膚區(qū)域像素與純白色像素進(jìn)行“柔光”圖層混合,然后調(diào)節(jié)不透明度達(dá)到美白效果

磨皮

圖像保邊濾波算法

磨皮算法,實(shí)際上就是平滑皮膚區(qū)域,將人像皮膚區(qū)域中一些皺紋,斑點(diǎn)以及痘痘等平滑掉,讓皮膚看起來更光滑。要達(dá)到這種效果,需要一種濾波器,他既能對平坦的皮膚區(qū)域進(jìn)行一定的平滑,又能較好的保留邊緣信息,這種濾波器就是保邊濾波器

保邊濾波器算法,包括雙邊濾波、表面模糊、導(dǎo)向?yàn)V波等

膚色檢測

待補(bǔ)充。。。

image (4).png

磨皮算法

磨皮算法劃分了多種算法:
● 通用磨皮算法
● 通道磨皮算法
● 高反差磨皮算法
● 細(xì)節(jié)疊加算法
● 其他算法
通用磨皮算法

  1. 輸入原圖S
  2. 對S進(jìn)行膚色檢測得到Mask
  3. 對Mask進(jìn)行高斯濾波得到平滑的Mask A
  4. 對S進(jìn)行保邊濾波得到T,T是丟失了部分細(xì)節(jié)的平滑圖像
  5. 計算效果圖,D = S x (1 - A) + T x A

細(xì)節(jié)疊加磨皮算法

  1. 對原圖S進(jìn)行較大半徑的保邊濾波,得到濾波圖A
  2. 對原圖S進(jìn)行較小半徑的保邊濾波,得到濾波圖B
  3. 對B進(jìn)行膚色檢測得到膚色Mask圖C
  4. 根據(jù)原圖和圖A得到細(xì)節(jié),E = S - A
  5. 根據(jù)圖B和圖A技術(shù)細(xì)節(jié),F(xiàn) = A - B
  6. 根據(jù)可調(diào)程度R, 細(xì)節(jié)控制參數(shù)K技術(shù)磨皮效果
    K0 = C x R
    D = A + K0 x F + (1 - K0 x K) x E

最終實(shí)現(xiàn)效果


image.png

image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容