机器学习实践系列之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。
初始化加载时即进行图像处理。
>双边滤波(Bilateral Filter)
对于磨皮 来讲,这里面最重要的就是前面讲到的 双边滤波(Bilateral Filter) ,对应实现为 GPUImageBilateralFilter。
双边滤波 特点在于不仅考虑空间距离(满足高斯分布),同时也考虑了像素的差异(差异越小,权重越大),因此 双边滤波器在 去噪的同时 能够比较好的保持边缘。
>边缘检测
实际上,这里面有一个问题,我们希望不处理边缘、头发等信息,因此不应该作用于整图,那样会丢失很多细节(失真比较严重)。基于此,通常的做法是 基于原始图像、边缘、滤波图像 三个输入进行合并,得到最终的输出。
>合并滤波器、颜色过滤器
当然 基于皮肤检测结果、边缘、滤波 能得到更好的效果,仅处理检测到的皮肤部分,这里大家可以调研一下并自己扩展。
GPUImageCombinationFilter 实现纹理合并,GPUImageHSBFilter实现最终的颜色过滤,看一下效果:
图待上传……
“每个光鲜亮丽的女主播后面,都有一个技术宅男!”,这里指的就是传说中的美颜相机。
随便找了两张图,作者也不知道是谁,大家先饱饱眼福吧。至于真实相貌是否比得上 凤姐,我们不得而知,这绝对取决于技术男的实力
一. 何为美颜
美颜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实现最终的颜色过滤,看一下效果:
图待上传……
相关文章推荐
- 机器学习实践系列之4 - 人脸对齐(下)
- 机器学习实践系列之6 - OpenCV实战光流
- 机器学习实践系列之1 - dlib
- 机器学习实践系列(三)LASSO回归
- 机器学习实践系列(二)岭回归(Ridge Regression)
- 机器学习实践系列之7 - 车辆检测
- 机器学习实践系列之15 - OpenCV之MSER
- 机器学习实践系列之14 - OpenCV之傅里叶变换
- 使用腾讯云 GPU 学习深度学习系列之一:传统机器学习的回顾
- 机器学习实践系列之5 - 目标跟踪
- 机器学习实践系列之13 - OpenCV之图像去雾
- 机器学习实践系列之5 - 目标跟踪
- 机器学习实践系列(一)普通线性回归
- 机器学习实践系列之9 - 视频结构化
- 机器学习实践系列 1 线性代数计算的python实现
- 机器学习实践系列之3 - 人脸对齐(上)
- 机器学习实践系列之8 - 人眼定位
- 机器学习三人行(系列七)----支持向量机实践指南(附代码)
- 机器学习实践系列之16 - OpenCV之手写体识别
- 极限编程系列4-开发实践-计划