最近直播比较火,作者也饶有兴趣的研究了一番,有句话说的好:
“每个光鲜亮丽的女主播后面,都有一个技术宅男!”,这里指的就是传说中的美颜相机。
随便找了两张图,作者也不知道是谁,大家先饱饱眼福吧。至于真实相貌是否比得上 凤姐,我们不得而知,这绝对取决于技术男的实力
一. 何为美颜
美颜1.0,即传统意义上美颜用到的技术 主要是:美白、磨皮。
美白 是指借助美白滤镜,将检测到对应图像的皮肤部分进行 图像处理,使肤色看上去更光滑、亮丽。
磨皮 主要采用 双边滤波器(Bilateral Filter) 对皮肤部分进行 平滑处理,消除 色斑、痣 等。
美颜1.0 只是对图像进行简单处理,不涉及形状和位置调整,与优秀的化妆师类似。
美颜2.0,是指借助于人脸检测技术,对眼睛、嘴巴、鼻子 等进行二次加工,可能改变其位置和形状,可以说算是 整容 了。
本节不涉及美颜2.0的内容。
二. 大杀器GPUImage
开源框架GPUImage 是当下流行的大杀器,下载地址:https://github.com/BradLarson/GPUImage
GPUImage 源自于IOS,通过GPU加速(openglES)来进行图像处理,配合Shader,可以支持多达上百种滤镜效果,并支持自定义滤镜。也有对应在安卓下的实现,下载地址:https://github.com/CyberAgent/android-gpuimage
(CoreImage目前应用的也不错,苹果公司 官方支持,大家可以了解下,这里不讲)
>编译 GPUImage
根据下载的文件解压,用 Xcode打开 GPUImage-master/framework 下的 GPUImage.xcodeproj 进行编译(for iOS),生成库文件 libGPUImage.a,这个就是我们将要在后面用到的静态库。
新建项目,将需要引用的头文件和lib库加入。
>代码测试
GPUImageBeautifyFilter是基于GPUImage的美颜滤镜,包括GPUImageBilateralFilter、GPUImageCannyEdgeDetectionFilter、GPUImageCombinationFilter和GPUImageHSBFilter。
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *inputImage = [UIImage imageNamed:@"k"];
// 使用美颜滤镜
GPUImageBeautifyFilter *pFilter = [[GPUImageBeautifyFilter alloc] init];
// 设置渲染区域
[pFilter forceProcessingAtSize:inputImage.size];
[pFilter useNextFrameForImageCapture];
// 获取数据源
GPUImagePicture *srcImage = [[GPUImagePicture alloc]initWithImage:inputImage];
// 添加滤镜
[srcImage addTarget:pFilter];
// 渲染
[srcImage processImage];
// 获取渲染后的图片
UIImage *outImage = [pFilter imageFromCurrentFramebuffer];
// 加载出来
UIImageView *imageView = [[UIImageView alloc] initWithImage:outImage];
imageView.frame = CGRectMake(50,50,inputImage.size.width ,inputImage.size.height);
[self.view addSubview:imageView];
}
初始化加载时即进行图像处理。
>双边滤波(Bilateral Filter)
对于磨皮 来讲,这里面最重要的就是前面讲到的 双边滤波(Bilateral Filter) ,对应实现为 GPUImageBilateralFilter。
双边滤波 特点在于不仅考虑空间距离(满足高斯分布),同时也考虑了像素的差异(差异越小,权重越大),因此 双边滤波器在 去噪的同时 能够比较好的保持边缘。
>边缘检测
实际上,这里面有一个问题,我们希望不处理边缘、头发等信息,因此不应该作用于整图,那样会丢失很多细节(失真比较严重)。基于此,通常的做法是 基于原始图像、边缘、滤波图像 三个输入进行合并,得到最终的输出。
>合并滤波器、颜色过滤器
当然 基于皮肤检测结果、边缘、滤波 能得到更好的效果,仅处理检测到的皮肤部分,这里大家可以调研一下并自己扩展。
GPUImageCombinationFilter 实现纹理合并,GPUImageHSBFilter实现最终的颜色过滤,看一下效果:
图待上传……