<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為了給女朋友獨(dú)特的七夕驚喜,我學(xué)會(huì)了人像美膚算法!

          共 9689字,需瀏覽 20分鐘

           ·

          2020-08-25 10:50


          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)



          文末送大家免費(fèi)包郵書籍,小白第一次使用留言方式送書,歡迎大家踴躍參與!



          在人像美顏中,美膚是一個(gè)非常重要的組成部分,健康的膚色,可以凸顯一個(gè)人整體的氣質(zhì)。搞定一套人像美膚算法,從根源解決你不會(huì)P圖的煩惱,從此的你指哪磨哪,讓女票對(duì)你刮目相看!你看,奪好


          人像美膚的簡(jiǎn)單定義就是對(duì)人像中的皮膚區(qū)域進(jìn)行調(diào)色,它的一般流程如下圖所示。?

          人像美膚流程示意圖
          ?在上圖中,上半部分跟通用磨皮流程一致,都需要計(jì)算得出皮膚區(qū)域或者膚色概率圖MASK,可見 MASK 對(duì)于美顏是至關(guān)重要的。在美膚中,我們先對(duì)全圖進(jìn)行美膚調(diào)色或者美白調(diào)色,然后結(jié)合 MASK 和原圖做混合,即可得到美膚效果圖。
          本文介紹的人像美膚算法包括兩個(gè)部分:
          • 皮膚美白算法

          • 皮膚調(diào)色算法


          皮膚美白算法實(shí)際上也是一種特殊的皮膚調(diào)色,這里之所以單獨(dú)講解,是因?yàn)樵诿李佀惴ㄩ_發(fā)中,可以沒有皮膚調(diào)色,但是不能沒有皮膚美白。而對(duì)于美白算法,又可以有多種方式實(shí)現(xiàn),這一點(diǎn)與皮膚調(diào)色不同。
          本文選自《圖像視頻濾鏡與人像美顏美妝算法詳解》一書,讀完本文,你將學(xué)會(huì)在磨皮的基礎(chǔ)上進(jìn)行膚色調(diào)節(jié),進(jìn)一步改善磨皮效果。?

          皮膚美白算法


          在市面上流行的人像美顏 App 中,一般有兩種皮膚美白方式,一種是不考慮皮膚區(qū)域,全圖美白,另一種是結(jié)合皮膚區(qū)域的局部美白。個(gè)人認(rèn)為,第二種比較科學(xué)嚴(yán)謹(jǐn),在效果上也比較自然,而第一種實(shí)際上就是一種簡(jiǎn)化,沒有太大意義。
          皮膚美白算法有多種,歸納起來有兩大類:LUT 調(diào)色法和圖層混合法。
          ▊?LUT調(diào)色法
          該方法是指通過類似 PS 等軟件中調(diào)節(jié)亮度/對(duì)比度、曲線、色彩平衡等方式,或者通過某種亮度調(diào)節(jié)曲線的方式,來生成對(duì)應(yīng)的 LUT,以 LUT 濾鏡方式實(shí)現(xiàn)皮膚美白。它的優(yōu)點(diǎn)是使用顏色濾鏡 LUT,速度快,便于實(shí)時(shí)處理。?
          這里以曲線調(diào)節(jié)為例,給出一組 PS 曲線調(diào)節(jié)參數(shù)以及對(duì)應(yīng)效果,如下圖所示。?

          PS 中的曲線調(diào)節(jié)
          在上圖中,我們通過曲線調(diào)節(jié)的方式,將原圖(a)進(jìn)行了皮膚提亮,得到了對(duì)應(yīng)的效果圖(c)。下面我們使用這組參數(shù)生成一張經(jīng)典的 LUT,如下圖所示。

          皮膚美白 LUT
          上面的 LUT 是針對(duì)全圖的調(diào)色,我們根據(jù)圖中所述的流程,結(jié)合膚色概率檢測(cè),得到最后的美白效果以及磨皮美白效果如下圖所示?
          從圖中可以看出,與原圖相比,效果圖中人像的皮膚更加光滑,膚色更加白皙通透,這就是磨皮美白的效果。
          上述是一種使用 PS 工具的 LUT 調(diào)色美白方法。在實(shí)際使用中,不單單局限于 PS,可以使用任何圖像編輯軟件來調(diào)節(jié)皮膚顏色,直到滿意為止,最后生成經(jīng)典 LUT 即可。

          LUT 調(diào)色美白效果圖
          除此之外,還可以通過算法來生成這樣的曲線 LUT,比如亮度/對(duì)比度增強(qiáng)曲線:
          其中,w(x, y) 是原圖像素 (x, y) 的亮度,v(x, y) 是增強(qiáng)之后的亮度, β 是調(diào)節(jié)系數(shù),值越大,增強(qiáng)程度越強(qiáng)。?
          我們使用上述亮度/對(duì)比度增強(qiáng)曲線來測(cè)試磨皮美白效果,如下圖所示,對(duì)比原圖,效果圖中人物皮膚區(qū)域光滑白皙,美顏效果躍然紙上。

          曲線美白效果圖
          ?▊?圖層混合法
          所謂圖層混合法美白,是指通過使用 PS 中的圖層混合模式,來達(dá)到美白效果的方法。該方法比較簡(jiǎn)單,是使用 PS 修圖時(shí)常用的一種人像美白方法。該算法的思想是:將原圖中的皮膚區(qū)域的像素與純白色像素進(jìn)行“柔光”圖層混合,然后調(diào)節(jié)不透明度,以達(dá)到皮膚美白的目的。
          PS 中“柔光”圖層混合算法的計(jì)算公式如下:
          我們使用圖層混合法對(duì)測(cè)試圖進(jìn)行皮膚美白,效果如下圖所示。?

          圖層混合法美白效果圖
          本節(jié)講述了幾種皮膚美白的方法,效果上大同小異。在實(shí)際應(yīng)用中,美白的算法千變?nèi)f化,從傳統(tǒng)圖像算法到人工智能算法,層出不窮,但關(guān)鍵在于舉一反三和靈活運(yùn)用,這樣才能創(chuàng)造出更好的算法,得到更驚艷的效果。
          下面我們給出 C 語(yǔ)言實(shí)現(xiàn)上述三種美白算法的核心代碼:
          #include?#include#include#include#include"Commen.h"#include"f_LUTFilter.h"#include"f_SkinPDF.h"#include"f_GaussFilter.h"#include"f_SkinWhite.h"/**************************************************************************函數(shù): 膚色美白*參數(shù):*srcData:32BGRA 位圖像數(shù)據(jù)*width: 圖像寬度*height: 圖像高度*stride: 圖像 Stride*skinMask: 皮膚蒙版*lutData: 32BGRA LUT 圖像數(shù)據(jù)*ratio: 美白程度,范圍[0,100]*返回值: 0-成功,其他失敗**************************************************************************/int f_SkinWhite(unsigned char* srcData, int width, int height, int stride, unsigned char* lutData, int ratio) {     int ret = 0;     int length = height * stride;     unsigned char* tempData = (unsigned char*)malloc(sizeof(unsigned char) * length);     memcpy(tempData, srcData, sizeof(unsigned char) * length);     unsigned char* skinPDF = (unsigned char*)malloc(sizeof(unsigned char) * length);     memcpy(skinPDF, srcData, sizeof(unsigned char) * length);     ret = f_SkinPDF(skinPDF, width, height, stride);     int maskSmoothRadius = 3;     ret = f_FastGaussFilter(skinPDF, width, height, stride, maskSmoothRadius);     ret = f_LUTFilter(tempData, width, height, stride, lutData);     unsigned char* pSrc = srcData;     unsigned char* pLut = tempData;     unsigned char* pSkin = skinPDF;     for(int j = 0; j < height; j++)     {         for(int i = 0; i < width; i++)         {             int r, g, b, a;             b = CLIP3((pSrc[0] * (100 - ratio) + pLut[0] * ratio) / 100, 0, 255);             g = CLIP3((pSrc[1] * (100 - ratio) + pLut[1] * ratio) / 100, 0, 255);             r = CLIP3((pSrc[2] * (100 - ratio) + pLut[2] * ratio) / 100, 0, 255);             a = (pSkin[0] + pSkin[1] + pSkin[2]) / 3;             pSrc[0] = CLIP3((b * a + pSrc[0] * (255 - a)) / 255, 0, 255);             pSrc[1] = CLIP3((g * a + pSrc[1] * (255 - a)) / 255, 0, 255);             pSrc[2] = CLIP3((r * a + pSrc[2] * (255 - a)) / 255, 0, 255);             pSrc += 4;             pLut += 4;             pSkin += 4;         }     }     free(tempData);     free(skinPDF);     return ret; }; /************************************************************************* *函數(shù): 膚色美白曲線法  *參數(shù): *srcData:32BGRA 圖像數(shù)據(jù) *width:  圖像寬度 *height: 圖像高度 *stride: 圖像 Stride *belta: 曲線參數(shù) belta,范圍[2,10],默認(rèn):2 *ratio: 磨皮程度,范圍 [0,100] *返回值: 0-成功,其他失敗 *參考資料: "A Two-Stage Contrast Enhancement Algorithm for Digital Images" **************************************************************************/ int f_SkinWhiteCurve(unsigned char* srcData, int width, int height, int stride, int belta, int ratio) {     int ret = 0;     int length = height * stride;     unsigned char* skinPDF = (unsigned char*)malloc(sizeof(unsigned char) * length);     memcpy(skinPDF, srcData, sizeof(unsigned char) * length);     ret = f_SkinPDF(skinPDF, width, height, stride);     int maskSmoothRadius = 3;     ret = f_FastGaussFilter(skinPDF, width, height, stride, maskSmoothRadius);     unsigned char* pSrc = srcData;     unsigned char* pSkin = skinPDF;     for(int j = 0; j < height; j++)     {         for(int i = 0; i < width; i++)         {             int r, g, b, a;             //skin white curve             b = CLIP3(log((float)pSrc[0] * (belta - 1) / 255.0f + 1) / log((float)belta) * 255.0f, 0, 255);             g = CLIP3(log((float)pSrc[1] * (belta - 1) / 255.0f + 1) / log((float)belta) * 255.0f, 0, 255);             r = CLIP3(log((float)pSrc[2] * (belta - 1) / 255.0f + 1) / log((float)belta) * 255.0f, 0, 255);             b = CLIP3((b * ratio + pSrc[0] * (100 - ratio)) / 100, 0, 255);             g = CLIP3((g * ratio + pSrc[1] * (100 - ratio)) / 100, 0, 255);             r = CLIP3((r * ratio + pSrc[2] * (100 - ratio)) / 100, 0, 255);             //skin pdf             a = (pSkin[0] + pSkin[1] + pSkin[2]) / 3;             pSrc[0] = CLIP3((b * a + pSrc[0] * (255 - a)) / 255, 0, 255);             pSrc[1] = CLIP3((g * a + pSrc[1] * (255 - a)) / 255, 0, 255);             pSrc[2] = CLIP3((r * a + pSrc[2] * (255 - a)) / 255, 0, 255);             pSrc += 4;             pSkin += 4;         }     }     free(skinPDF);     return ret; }  inline int ModeSmoothLight(int basePixel,int mixPixel) {   int res = 0;   res = mixPixel > 128 ? ((int)((float)basePixel+((float)mixPixel+(float)mixPixel-255.0f)*((sqrt((float)basePixel/255.0f) )*255.0f-(float)basePixel)/255.0f)):         ((int)((float)basePixel+((float)mixPixel+(float)mixPixel-255.0f)*((float)basePixel-(float)basePixel*(float)basePixel/255.0f)/255.0f));   return CLIP3(res, 0, 255); };  /************************************************************************* *函數(shù): PS 圖層法膚色美白 *參數(shù): *srcData:32BGRA 圖像數(shù)據(jù) *width:  圖像寬度 *height: 圖像高度 *stride: 圖像 Stride *ratio: 磨皮程度,范圍 [0,100] *返回值: 0-成功,其他失敗 **************************************************************************/ int f_SkinWhitePS(unsigned char* srcData, int width, int height, int stride, int ratio) {     int ret = 0;     int length = height * stride;     unsigned char* skinPDF = (unsigned char*)malloc(sizeof(unsigned char) * length);     memcpy(skinPDF, srcData, sizeof(unsigned char) * length);     ret = f_SkinPDF(skinPDF, width, height, stride);     int maskSmoothRadius = 3;     ret = f_FastGaussFilter(skinPDF, width, height, stride, maskSmoothRadius);     unsigned char* pSrc = srcData;     unsigned char* pSkin = skinPDF;     for(int j = 0; j < height; j++)            {         for(int i = 0; i < width; i++)         {             int r, g, b, a;             //skin white using smoothlight of ps             b = ModeSmoothLight(pSrc[0], 255);             g = ModeSmoothLight(pSrc[1], 255);             r = ModeSmoothLight(pSrc[2], 255);             b = CLIP3((b * ratio + pSrc[0] * (100 - ratio)) / 100, 0, 255);             g = CLIP3((g * ratio + pSrc[1] * (100 - ratio)) / 100, 0, 255);             r = CLIP3((r * ratio + pSrc[2] * (100 - ratio)) / 100, 0, 255);             //skin pdf             a = (pSkin[0] + pSkin[1] + pSkin[2]) / 3;             pSrc[0] = CLIP3((b * a + pSrc[0] * (255 - a)) / 255, 0, 255);             pSrc[1] = CLIP3((g * a + pSrc[1] * (255 - a)) / 255, 0, 255);             pSrc[2] = CLIP3((r * a + pSrc[2] * (255 - a)) / 255, 0, 255);             pSrc += 4;             pSkin += 4;         }     }     free(skinPDF);     return ret; }

          皮膚調(diào)色算法



          皮膚調(diào)色算法也叫膚色調(diào)節(jié)算法,它的定義就是通過算法來實(shí)現(xiàn)皮膚顏色的變換。上節(jié)中介紹的美白算法,實(shí)際上就是膚色調(diào)節(jié)的一種特例,將皮膚顏色調(diào)白即是美白。目前膚色調(diào)節(jié)在美顏相機(jī)中有較多使用,通過膚色調(diào)節(jié),美顏相機(jī)中給出了各種濾鏡特效,讓人的皮膚呈現(xiàn)白里透紅、粉嫩淡雅、健康小麥色等。
          膚色調(diào)節(jié)算法的流程如下:
          ①使用 Photoshop、Gimp 等圖像編輯軟件對(duì)樣例圖調(diào)出所需膚色。
          ②根據(jù)步驟①,調(diào)出經(jīng)典 LUT。
          ③將查找表應(yīng)用于人像照片的皮膚區(qū)域。
          根據(jù)上述流程,我們給出一組糖果色膚色的效果測(cè)試,如下圖所示。

          糖果色效果調(diào)色
          在上圖中,使用 PS 中的“可選顏色”與“曲線”功能調(diào)配了一種糖果膚色的效果,并對(duì)應(yīng)生成了 LUT。使用這個(gè) LUT 結(jié)合皮膚區(qū)域檢測(cè)得到最后的膚色調(diào)節(jié)效果,如下圖所示。從圖中可以看到,除了皮膚區(qū)域,其他區(qū)域基本沒有調(diào)色,這樣就達(dá)到了調(diào)至糖果色皮膚的目的。

          糖果色膚色調(diào)色(LUT+膚色概率模型)
          膚色調(diào)節(jié)算法與 LUT 美白算法非常類似,代碼可以通用,唯一不同之處在于 LUT 的不同,我們給出 C 語(yǔ)言實(shí)現(xiàn)的代碼,如下:
          #include??#include?#include?#include?#include"Commen.h"?#include"f_LUTFilter.h"?#include"f_SkinPDF.h"?#include"f_GaussFilter.h"?#include"f_SkinColor.h"?/**************************************************************************函數(shù):?膚色調(diào)節(jié)?*參數(shù): *srcData:32BGRA 圖像數(shù)據(jù) *width:  圖像寬度 *height: 圖像高度 *stride: 圖像 Stride *skinMask: 皮膚蒙版 *lutData: 32BGRA LUT 圖像數(shù)據(jù) *ratio: 膚色程度,范圍 [0,100] *返回值: 0-成功,其他失敗 **************************************************************************/ int?f_SkinColor(unsigned?char*?srcData,?int?width,?int?height,?int?stride,?unsigned char* lutData, int ratio){?    int?ret?=?0;?    int length = height * stride;     unsigned char* tempData = (unsigned char*)malloc(sizeof(unsigned char) * length);     memcpy(tempData, srcData, sizeof(unsigned char) * length);     unsigned char* skinPDF = (unsigned char*)malloc(sizeof(unsigned char) * length);     memcpy(skinPDF, srcData, sizeof(unsigned char) * length);     ret = f_SkinPDF(skinPDF, width, height, stride);     int maskSmoothRadius = 3;     ret = f_FastGaussFilter(skinPDF, width, height, stride, maskSmoothRadius);     ret = f_LUTFilter(tempData, width, height, stride, lutData);     unsigned char* pSrc = srcData;     unsigned char* pLut = tempData;     unsigned char* pSkin = skinPDF;     for(int j = 0; j < height; j++) ????{???? ???for(int?i?=?0;?i?width;?i++)?        {             int r, g, b, a;             b = CLIP3((pSrc[0] * (100 - ratio) + pLut[0] * ratio) / 100, 0, 255);             g = CLIP3((pSrc[1] * (100 - ratio) + pLut[1] * ratio) / 100, 0, 255);             r = CLIP3((pSrc[2] * (100 - ratio) + pLut[2] * ratio) / 100, 0, 255);             a = (pSkin[0] + pSkin[1] + pSkin[2]) / 3;             pSrc[0] = CLIP3((b * a + pSrc[0] * (255 - a)) / 255, 0, 255);             pSrc[1] = CLIP3((g * a + pSrc[1] * (255 - a)) / 255, 0, 255);             pSrc[2] = CLIP3((r * a + pSrc[2] * (255 - a)) / 255, 0, 255);             pSrc += 4;             pLut += 4;             pSkin += 4;         }     }     free(tempData);     free(skinPDF);     return ret; };
          (完)

          圖書推薦
          《圖像視頻濾鏡與人像美顏美妝算法詳解》

          胡耀武 譚娟 李云夕 著

          從Photoshop到“美圖秀秀”,從“化妝師”到“美妝相機(jī)”,從卡片機(jī)拍照到如今的智能AI美顏相機(jī),人像美顏美妝算法已經(jīng)成為移動(dòng)端圖像和視頻處理的核心競(jìng)爭(zhēng)點(diǎn)。
          美顏美妝算法行業(yè),也成了圖像處理和計(jì)算機(jī)視覺方面一個(gè)眾人追捧的職業(yè)方向。然而,如何快速進(jìn)入這個(gè)行業(yè),以及需要掌握哪些算法知識(shí)與該怎么學(xué)等,這些問題正在困擾著無(wú)數(shù)的初學(xué)者。
          這本書應(yīng)運(yùn)而生
          1.本書由業(yè)內(nèi)專家賈志剛、周平、姜霄棠聯(lián)袂力薦。
          2 本書作者多年專注于圖像濾鏡、人像美顏美妝、動(dòng)漫手繪等相關(guān)圖像特效算法的研究,曾負(fù)責(zé)多款億級(jí)用戶量App的圖像算法研發(fā)工作,在人像美化特效方面有著深厚的積累和經(jīng)驗(yàn)。

          3 本書系統(tǒng)、全面地介紹了與圖像視頻濾鏡和人像美顏美妝特效相關(guān)的算法基礎(chǔ)知識(shí)與方法思路,涵蓋了市面上流行的美顏美妝App的特效功能,包括傳統(tǒng)方法和基于深度學(xué)習(xí)的AI濾鏡和美顏算法。


          (掃碼了解本書詳情)



          好了,現(xiàn)在技術(shù)你已經(jīng)掌握了
          距離天下無(wú)敵,就差一個(gè)留言獲取贈(zèng)書了





          抽獎(jiǎng)方式
          在下方回答中留下小伙伴學(xué)習(xí)圖像處理的感受,在8約25日晚8:00之前點(diǎn)贊數(shù)目最多的留言便會(huì)獲得圖像視頻濾鏡與人像美顏美妝算法詳解》一本

          點(diǎn)擊閱讀原文,了解本書詳情~
          瀏覽 25
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一级一片免费播放 | 男女AV狠狠撸 | 免费国产黄色视频网站 | 精品福利一区 | 国产中文在线视频 |