您的位置:首页 > 产品设计 > UI/UE

机器学习实践系列之2 - GPUImage

2017-02-16 20:43 351 查看
最近直播比较火,作者也饶有兴趣的研究了一番,有句话说的好:

“每个光鲜亮丽的女主播后面,都有一个技术宅男!”,这里指的就是传说中的美颜相机。





随便找了两张图,作者也不知道是谁,大家先饱饱眼福吧。至于真实相貌是否比得上 凤姐,我们不得而知,这绝对取决于技术男的实力


一. 何为美颜

美颜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实现最终的颜色过滤,看一下效果:

图待上传……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息