Android平臺Camera實時濾鏡實現方法探討(十一)--實時美顏濾鏡
阿新 • • 發佈:2017-07-21
.net 兩個 其它 強人 突出 pad eight 地址 模式
上一章完畢了對圖片的磨皮處理。經過簡單算法流程優化,能夠達到非常快的速度。可是不能用於實時美顏。經實驗,若採用僅僅處理Y信號的方案。半徑極限大約是5-10,超過10則明顯感受到卡頓。但對於1920X1080的預覽分辨率來說。取10為半徑非常難得到理想效果。即使將分辨率減少到1280X720也差強人意。所以非常難簡單的直接應用在移動端實時處理上。
還有一方面,人物的正常膚,色應該是偏紅。所以則會導致人物圖像的紅色通道偏亮,使紅色通道保留的細節成分較少,相比之下。綠色通道保留很多其它細節,所以。普通情況下我們也能夠僅僅採用過濾綠色通道來實現實時磨皮。以下對思路簡介:
1.取出綠色通道,對綠色通道進行模糊處理,比如高斯模糊。得到模糊後的值sampleColor:
在頂點著色器中創建長度為20~25的數組,作為片段著色器須要取數據的點
varying vec2 blurCoordinates[20];blurCoordinates[0] = inputTextureCoordinate.xy + singleStepOffset * vec2(0.0, -10.0); .... blurCoordinates[19] = inputTextureCoordinate.xy + singleStepOffset * vec2(4.0, -4.0);</span>在片段著色器依次取出這些點的綠色通道值,乘以權重。最後除以總權重。得到模糊後的綠色通道值
2.用原圖綠色通道值減去sampleColor。加上0.5(即128),1+2兩個步驟即PS中的高反差保留:
vec3 centralColor = texture2D(inputImageTexture, textureCoordinate).rgb; float highpass = centralColor.g - sampleColor + 0.5;
3.對上述結果值進行3-5次強光處理(見第七章的“疊加”混合模式)。此步驟能夠使得噪聲更加突出:
if(color <= 0.5){ color = color * color * 2.0; }else{ color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0); }經過1-3之後的圖:
4.計算原圖的灰度值,公式為0.299*R + 0.587*G + 0.114*B:
const highp vec3 W = vec3(0.299,0.587,0.114); float lumance = dot(centralColor, W);
得到灰度圖像:
5.將灰度值作為閾值,用來排除非皮膚部分。依據灰度值計算,將原圖與1-3後的結果圖合成:
float alpha = pow(lumance, 0.333333); vec3 smoothColor = centralColor + (centralColor-vec3(highpass))*alpha*0.1;</span>原圖rgb值與高反差後的結果相比,噪聲越大,兩者相減後的結果越大,在原結果基礎上加上一定值,來提高亮度,消除噪聲。
pow函數中第二個參數可調(1/3~1),值越小,alpha越大,磨皮效果越明顯。改動該值可作為美顏程度
6.對混合後結果添加亮度:
7.以灰度值作為透明度將原圖與混合後結果進行濾色、柔光等混合,並調節飽和度:
原圖與結果圖:
上面用圖片來舉樣例,剩下的就是打開攝像頭切換到前置自己看效果了~
代碼地址:(將在晚些時候上傳20160108日語)
下文地址中MagicCamera/MagicFilter/res/raw/文件夾下
beautify_fragment.glsl 與 beautify_vertex.glsl
另外:
----------------------------------------------------------------------------------------------------
MagicCamera地址
以GPUImage為基礎,採用OpenGL+JNI開發,並優化了GPUImage預覽圖像處理過程,去除格式轉換消耗的時間。提升效率
使用GLSL實現了40+種濾鏡和實時美顏功能
實現了照片磨皮與美白功能
歡迎打開鏈接點擊右上角Star
Android平臺Camera實時濾鏡實現方法探討(十一)--實時美顏濾鏡