1. 程式人生 > IOS開發 >iOS 基於GPUImage的實時美顏濾鏡

iOS 基於GPUImage的實時美顏濾鏡

前言

目前是準備做一個美顏相機類的專案,這篇將介紹美顏濾鏡的一些思路。 程式碼已上傳MagicCamera,你的star和fork是對我最好的支援和動力。

實現

流程圖

GPUImage

GPUImage 是一個開源的基於GPU的圖片或視訊的處理框架,在這基礎上我們可以很方便的實現各種濾鏡效果。本文的主要實現繼承自GPUImageThreeInputFilter的三輸入:雙邊濾波、邊緣檢測、原圖

     // 雙邊濾波
     highp vec4 bilateral = texture2D(inputImageTexture,textureCoordinate);
     // 邊緣檢測
highp vec4 canny = texture2D(inputImageTexture2,textureCoordinate2); // 原圖 highp vec4 source = texture2D(inputImageTexture3,textureCoordinate3); 複製程式碼

雙邊濾波:在高斯模糊的基礎上加了梯度分量來組成權重資訊實現模糊平滑影象,具有保留邊緣的功能。同樣也可以採用高斯濾波。

高反差保留演算法

通過高反差來得到面板細節的MASK,根據MASK中細節區域,比如面板中的斑點區域位置,將原圖對應區域進行顏色減淡處理,以此來達到斑點弱化,美膚的目的,使得面板看起來比較光滑自然。 公式 = 原圖 - 高斯模糊圖

,注:用雙邊代替高斯避免多一個輸入源

高反差保留演算法

//高反差保留演算法 (原圖 - 高斯模糊圖 注:雙邊代替高斯)
highp vec4 highPass = source - bilateral;
複製程式碼

經過高反差以後,影象比較暗淡,這裡進行一個強光操作

// 強光處理 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,1.0
); highPass.b = clamp(2.0 * highPass.b * highPass.b * intensity,1.0); 複製程式碼

融合

// 融合 -> 磨皮
// 藍色通道
mediump float value = clamp((min(source.b,bilateral.b) - 0.2) * 5.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,b)) > 0.0588 && abs(r-g) > 0.0588) {
 result = fuse;
} else {
 result = source;
}
複製程式碼

細節調整

最後加上USM銳化、HSB增強邊沿細節、色調、飽和度、亮度等。

效果圖

參考

blog.csdn.net/Trent1985/a…

www.jianshu.com/p/945fc806a…

www.jianshu.com/p/5f860f14f…