Core Image框架详细解析(十) —— 子类化CIFilter:自定义效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)

版本记录

版本号 时间
V1.0 2018.01.28

前言

Core Image是IOS5中新加入的一个框架,里面提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。还提供了很多强大的滤镜,可以实现你想要的效果,下面我们就一起解析一下这个框架。感兴趣的可以参考上面几篇。
1. Core Image框架详细解析(一) —— 基本概览
2. Core Image框架详细解析(二) —— Core Image滤波器参考
3. Core Image框架详细解析(三) —— 关于Core Image
4. Core Image框架详细解析(四) —— Processing Images处理图像(一)
5. Core Image框架详细解析(五) —— Processing Images处理图像(二)
6. Core Image框架详细解析(六) —— 图像中的面部识别Detecting Faces in an Image(一)
7. Core Image框架详细解析(七) —— 自动增强图像 Auto Enhancing Images
8. Core Image框架详细解析(八) —— 查询系统中的过滤器 Querying the System for Filters
9. Core Image框架详细解析(九) —— 子类化CIFilter:自定义效果的配方 Subclassing CIFilter: Recipes for Custom Effects(一)

Anonymous Faces Filter Recipe - 让面孔无法识别过滤Recipe

在图像中查找面部并对它们进行像素化,使其无法识别。

Core Image框架详细解析(十) —— 子类化CIFilter:自定义效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)_第1张图片
Figure 5-4 The Anonymous Faces filter processing chain

要创建一个匿名面孔过滤器:

  • 创建图像的像素化版本。
  • 使用在图像中检测到的脸部构建遮罩。
  • 使用蒙版将像素化图像与原始图像混合。

以下部分显示如何执行每个步骤。

1. Create a Pixellated version of the image - 创建图像的像素化版本

设置CIPixellate过滤器的输入参数如下:

  • inputImage设置为包含面部的图像。
  • inputScale设置为max(width, height)/60或其他看起来令人愉快的值,其中宽度和高度是指图像的宽度和高度。

2. Build a Mask From the Faces Detected in the Image - 从图像中检测到的脸部构建遮罩

使用CIDetector类来查找图像中的面部。 对于每一张脸:

  • 使用CIRadialGradient过滤器来创建围绕脸部的圆。
  • 使用CISourceOverCompositing过滤器将渐变添加到遮罩。
// Listing 5-5  Building a mask for the faces detected in an image

CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace
                                          context:nil
                                          options:nil];
NSArray *faceArray = [detector featuresInImage:image options:nil];
 
// Create a green circle to cover the rects that are returned.
 
CIImage *maskImage = nil;
for (CIFeature *f in faceArray) {
    CGFloat centerX = f.bounds.origin.x + f.bounds.size.width / 2.0;
    CGFloat centerY = f.bounds.origin.y + f.bounds.size.height / 2.0;
    CGFloat radius = MIN(f.bounds.size.width, f.bounds.size.height) / 1.5);
    CIFilter *radialGradient = [CIFilter filterWithName:@"CIRadialGradient" withInputParameters:@{
        @"inputRadius0": @(radius),
        @"inputRadius1": @(radius + 1.0f),
        @"inputColor0": [CIColor colorWithRed:0.0 green:1.0 blue:0.0 alpha:1.0],
        @"inputColor1": [CIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0],
        kCIInputCenterKey: [CIVector vectorWithX:centerX Y:centerY],
        }];
    CIImage *circleImage = [radialGradient valueForKey:kCIOutputImageKey];
    if (nil == maskImage)
        maskImage = circleImage;
    else
        maskImage = [[CIFilter filterWithName:@"CISourceOverCompositing" withInputParameters:@{
            kCIInputImageKey: circleImage,
            kCIInputBackgroundImageKey: maskImage,
        }] valueForKey:kCIOutputImageKey];
}

3. Blend the Pixellated Image, the Mask, and the Original Image - 混合像素化图像,蒙版和原始图像

CIBlendWithMask过滤器的输入参数设置为以下内容:

  • inputImage设置为图像的像素化版本。
  • inputBackgroundImage设置为原始图像。
  • inputMaskImage设置为合成的绿色圆圈。

Pixellate Transition Filter Recipe - Pixellate过渡过滤器Recipe

通过像素化每个图像从一个图像转换到另一个图像。

Core Image框架详细解析(十) —— 子类化CIFilter:自定义效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)_第2张图片
Figure 5-5 The Pixellate Transition filter processing chain

要创建一个像素转换滤镜:

  • 使用CIDissolveTransition在源图像和目标图像之间切换。
  • Pixellate转换过滤器的结果。

以下部分显示如何执行每个步骤。

1. Create a Dissolve Transition - 创建一个Dissolve转换

设置CIDissolveTransition过滤器的输入参数如下:

  • inputImage设置为要转换的图像。
  • inputTagetImage设置为要转换的图像。
  • inputTime设置为类似于min(max(2 *(time-0.25),0),1)的值,这是一个斜率函数,它夹在两个值之间。

2. Pixellate the Result of the Transition - 过渡的结果像素化

设置CIPixellate过滤器,通过将其输入参数设置如下,达到随着时间的推移改变像素的比例的效果。

  • inputImage设置为CIDissolveTransition过滤器的输出图像。
  • 设置inputScale通过提供三角函数的值随时间变化:90 *(1-2 * abs(时间-0.5))
  • 使用inputCenter的默认值。

Old Film Filter Recipe - 怀旧过滤Recipe

降低视频图像的质量,使其看起来像一个旧的,磨损的模拟电影。

Core Image框架详细解析(十) —— 子类化CIFilter:自定义效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)_第3张图片
Figure 5-6 The Old Film filter processing chain

要创建一个怀旧效果old-film的过滤器:

  • CISepiaTone过滤器应用于原始视频图像。
  • 创建随机变化的白色斑点。
  • 创建随机变化的黑暗划痕。
  • 将斑点和划痕复合到棕褐色调的图像上。

以下部分显示如何执行每个步骤。

1. Apply Sepia to the Video Image - 将棕褐色应用于视频图像

设置CISepiaTone的输入参数如下:

  • inputImage设置为效果要应用的视频图像。
  • inputIntensity设置为1.0。

2. Create Randomly Varying White Specks - 创造随机变化的白色斑点

使用产生彩色噪音的CIRandomGenerator过滤器。 它没有任何输入参数。

要处理噪点,以便只得到白色斑点,请使用CIColorMatrix滤镜,输入参数设置如下:

  • inputImage设置为由随机生成器生成的输出。
  • inputRVector,inputGVectorinputBVector设置为(0,1,0,0)
  • inputBiasVector设置为(0,0,0,0)

通过如下设置的过滤器的输入参数,使用CISourceOverCompositing过滤器将斑点与视频图像混合:

  • inputImage设置为由CIColorMatrix过滤器生成的白色斑点图像。
  • inputBackgroundImage设置为由CISepiaTone过滤器生成的图像。

3. Create Randomly Varying Dark Scratches - 创造随机变黑暗的划痕

再次使用CIRandomGenerator过滤器生成彩色噪音。 然后使用带有这些输入参数的CIAffineTransform过滤器处理其输出:

  • inputImage设置为由CIRandomGenerator过滤器生成的噪声。
  • inputTransform设置为scale将x缩放1.5,将y缩放25,这会使像素变粗而长,但它们仍将被着色。

使用CIAffineTransform的替代方法是使用imageByApplyingTransform:方法来转换噪声。

要使像素变暗,请按如下所示设置CIColorMatrix滤镜的输入参数:

  • inputImage设置为转换的视频图像。
  • inputRVector设置为(4,0,0,0)
  • inputGVector,inputBVector和inputAVector设置为(0,0,0,0)
  • inputBiasVector设置为(0,1,1,1)

这导致青色的划痕。

要使划痕变暗,请将CIMinimumComponent过滤器应用于青色划痕。 此滤镜使用r,g,b值的最小值生成灰度图像。

4. Composite the Specks and Scratches to the Sepia Video Image - 将斑点和划痕复合到棕褐色视频图像

设置CIMultiplyCompositing过滤器的输入参数如下:

  • 设置inputBackgroundImage为处理的视频图像(棕褐色调,白色斑点)。
  • 设置inputImage为黑色划痕,即来自CIMinimumComponent过滤器的输出

后记

本篇已结束,后面更精彩~~~

Core Image框架详细解析(十) —— 子类化CIFilter:自定义效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二)_第4张图片

你可能感兴趣的:(Core Image框架详细解析(十) —— 子类化CIFilter:自定义效果的配方 Subclassing CIFilter: Recipes for Custom Effects(二))