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

本文介绍了GPUImage框架在直播美颜中的应用,包括美白和磨皮效果的实现,重点讨论了GPUImageBilateralFilter在去噪和保持边缘方面的优势。同时,提到了边缘检测的重要性以及如何通过GPUImageCombinationFilter和GPUImageHSBFilter进行图像处理和颜色过滤,以达到更好的美颜效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近直播比较火,作者也饶有兴趣的研究了一番,有句话说的好:

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

        

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


一. 何为美颜

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

图待上传……

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值