目前是準備作一個美顏相機類的項目,這篇將介紹美顏濾鏡的一些思路。 代碼已上傳MagicCamera,你的star和fork是對我最好的支持和動力。git
流程圖github
GPUImage算法
GPUImage 是一個開源的基於GPU的圖片或視頻的處理框架,在這基礎上咱們能夠很方便的實現各類濾鏡效果。本文的主要實現繼承自GPUImageThreeInputFilter的三輸入:雙邊濾波、邊緣檢測、原圖框架
// 雙邊濾波
highp vec4 bilateral = texture2D(inputImageTexture, textureCoordinate);
// 邊緣檢測
highp vec4 canny = texture2D(inputImageTexture2, textureCoordinate2);
// 原圖
highp vec4 source = texture2D(inputImageTexture3,textureCoordinate3);
複製代碼
雙邊濾波:在高斯模糊的基礎上加了梯度份量來組成權重信息實現模糊平滑圖像,具備保留邊緣的功能。一樣也能夠採用高斯濾波。ui
經過高反差來獲得皮膚細節的MASK,根據MASK中細節區域,好比皮膚中的斑點區域位置,將原圖對應區域進行顏色減淡處理,以此來達到斑點弱化,美膚的目的,使得皮膚看起來比較光滑天然。 公式 = 原圖 - 高斯模糊圖,注:用雙邊代替高斯避免多一個輸入源spa
高反差保留算法.net
//高反差保留算法 (原圖 - 高斯模糊圖 注:雙邊代替高斯)
highp vec4 highPass = source - bilateral;
複製代碼
通過高反差之後,圖像比較暗淡,這裏進行一個強光操做code
// 強光處理 color = 2 * color1 * color2
mediump float intensity = 24.0; // 強光程度
highPass.r = clamp(2.0 * highPass.r * highPass.r * intensity,0.0,1.0);
highPass.g = clamp(2.0 * highPass.g * highPass.g * intensity,0.0,1.0);
highPass.b = clamp(2.0 * highPass.b * highPass.b * intensity,0.0,1.0);
複製代碼
// 融合 -> 磨皮
// 藍色通道
mediump float value = clamp((min(source.b, bilateral.b) - 0.2) * 5.0, 0.0, 1.0);
// RGB 的最大值
mediump float maxChannelColor = max(max(highPass.r, highPass.g), highPass.b);
// 磨皮程度
mediump float currentIntensity = (1.0 - maxChannelColor / (maxChannelColor + 0.2)) * value * buffingDegree;
// 混合
// mix = x⋅(1−a)+y⋅a
highp vec4 fuse = vec4(mix(source.rgb,bilateral.rgb,currentIntensity), 1.0);
複製代碼
//精準磨皮 膚色
lowp float r = source.r;
lowp float g = source.g;
lowp float b = source.b;
highp vec4 result;
if (canny.r < 0.2 && r > 0.3725 && g > 0.1568 && b > 0.0784 && r > b && (max(max(r, g), b) - min(min(r, g), b)) > 0.0588 && abs(r-g) > 0.0588) {
result = fuse;
} else {
result = source;
}
複製代碼
最後加上USM銳化、HSB加強邊沿細節、色調、飽和度、亮度等。cdn
參考視頻