EVGPUImage2 0.2.0

EVGPUImage2 0.2.0

测试已测试
语言语言 SwiftSwift
许可证 BSD
发布时间最后发布2018年10月
SPM支持 SPM

evermeer维护。



  • Brad Larson

GPUImage 2

Brad Larson

http://www.sunsetlakesoftware.com

@bradlarson

[email protected]

概述

GPUImage 2 是GPUImage 框架的第二个版本,这是一个开源项目,旨在在Mac、iOS和现在Linux上执行GPU加速的图像和视频处理。原始的GPUImage框架是用Objective-C编写的,针对Mac和iOS,但这个最新版本完全用Swift编写,也可以针对Linux和其他支持Swift代码的未来平台。

该框架的目标是将实时视频处理或机器视觉对图像或视频源的操作尽可能简单易行。通过依赖GPU来运行这些操作,可以比CPU密集型代码提高100倍或更多的性能。这在移动或嵌入式设备上尤为明显。在iPhone 4S上,该框架可以轻松处理60 FPS以上的1080p视频。在Raspberry Pi 3上,它可以以超过20 FPS的速度对实时720p视频执行Sobel边缘检测。

许可证

BSD风格的,完整的许可证可供在框架中的Licence.txt文件中找到。

技术要求

  • Swift 3
  • Mac或iOS上的Xcode 8.0
  • iOS: 8.0或更高(Swift在7.0上受支持,但不支持Mac风格的框架)
  • OSX: 10.9或更高
  • Linux:Swift代码可以编译的任何地方。目前,这是Ubuntu 14.04或更高版本,以及它已经移植到的大量其他地方。例如,我已经在最新的Raspbian上运行了这个版本。对于相机输入,需要安装Video4Linux。

总体架构

该框架依赖于处理管道的概念,其中图像源针对图像消费者,依此类推,直到图像输出到屏幕、图像文件、原始数据或记录的电影。相机、电影、静态图像和原始数据都可以作为该管道的输入。可以通过一系列较小操作的组合构建任意复杂的处理操作。

这是一个面向对象的框架,具有封装输入、处理操作和输出的类。处理操作使用OpenGL (ES)顶点和片段着色器在GPU上执行它们的图像操作。

下面展示了在常见应用程序中使用该框架的示例。

在 Mac 或 iOS 应用程序中使用 GPUImage

要将 GPUImage 框架添加到您的 iOS 应用程序中,您可以通过将 GPUImage-iOS.xcodeproj 项目拖入应用程序项目,或者通过“文件”|“添加文件到…”添加它。

然后,前往您的项目构建阶段,并将 GPUImage 添加为目标依赖项。将其添加到“链接二进制与库”阶段。添加一个新的“复制文件”构建阶段,将其目标设置为“框架”,并将 GPUImage.framework 添加到其中。最后一步将确保框架被部署到您的应用程序包中。

在任何引用 GPUImage 类的 Swift 文件中,只需添加

import GPUImage

您就应该可以开始使用了。

请注意,您可能需要构建一次项目来解析和构建 GPUImage 框架,以便 Xcode 停止警告框架及其类丢失。

在 Linux 应用程序中使用 GPUImage

最终,此项目将支持 Swift 包管理器,这使得与 Linux 项目一起使用变得非常简单。不幸的是,目前并非如此,因此为了让它在 Linux 项目中构建,可能需要做一些工作。

目前,框架目录中有两个构建脚本,一个名为 compile-LinuxGL.sh,另一个名为 compile-RPi.sh。前者使用 OpenGL 为 Linux 目标构建框架,后者为 Raspberry Pi 构建。我可以在测试新目标时添加其他目标,但我在桌面上 Ubuntu、Jetson TK1 开发板上的 Ubuntu 和 Raspbian 以及 Raspberry Pi 2 和 Pi 3 上的 Raspbian 上才使其运行。

在编译框架之前,您需要在您的系统上设置 Swift。对于桌面 Ubuntu 安装,您可以根据 Apple 的指南在 他们的下载页面 中进行操作。这些说明也适用于我在 Jetson TK1 开发板上的步骤。

对于像 Raspberry Pi 这样的 ARM Linux 设备,遵循 这些步骤 以安装可工作的 Swift 编译器。请密切关注安装 Clang-2.6 的步骤和使用 update-alternatives。这是我从原始 Raspbian 转到 Swift 安装的步骤。

我注意到 Swift 2.2 编译器快照(大约在 1 月 11 日之后)缺少 Foundation,这是框架所需要的,所以您可能会选择一个更早的快照。

安装 Video4Linux 以访问作为输入的标准 USB 网络摄像头后,您将需要 Swift。

sudo apt-get install libv4l-dev

在 Raspberry Pi 上,您需要确保已安装 Broadcom Videocore 头文件和库,以便进行 GPU 访问。

sudo apt-get install libraspberrypi-dev

对于桌面 Linux 和其他 OpenGL 设备(Jetson TK1),您需要确保已安装 GLUT 和 OpenGL 头文件。框架当前使用 GLUT 进行输出。GLUT 可以通过新的实验性 OpenGL 支持在 Raspberry Pi 上使用,但我觉得它比使用 OpenGL ES API 和 Pi 附带的 Videocore 接口慢得多。此外,如果您启用了 OpenGL 支持,您将无法使用 Videocore 接口。

设置完成后,要构建框架,请转到 /framework 目录并运行适当的构建脚本来编译框架。这将编译和生成框架的 Swift 模块和共享库。将共享库复制到系统可访问的库路径,如 /usr/lib。

要构建任何示例应用程序,请转到该示例的 examples/ 子目录(示例是平台特定的)并运行 compile.sh 构建脚本以编译示例。必须在任何示例应用程序之前构建框架。

随着 Swift 被集成到更多平台,并且当我为 Swift 包管理器添加支持时,这些 Linux 构建步骤将变得更加容易。我的设置目前有点像是一种恶作剧。

执行常见任务

过滤实时视频

要从 Mac 或 iOS 摄像头过滤实时视频,您可以编写如下代码

do {
    camera = try Camera(sessionPreset:AVCaptureSessionPreset640x480)
    filter = SaturationAdjustment()
    camera --> filter --> renderView
    camera.startCapture()
} catch {
    fatalError("Could not initialize rendering pipeline: \(error)")
}

其中,renderView 是您在视图层次结构中放置的 RenderView 的一个实例。以下示例创建了一个 640x480 的摄像头实例,创建了一个饱和度滤镜,并将摄像头帧通过饱和度滤镜进行处理的路径发送到屏幕。startCapture() 启动了摄像头捕获过程。

“->”操作符将图像源链接到图像消费者,并且可以在同一行中链接多个。

捕获和过滤静态照片

功能尚未完成。

从视频中捕获图像

(目前不支持 Linux 系统。)

要从实时视频中捕获静态图像,您需要对下一帧视频处理进行回调设置。最简单的方法是使用便利扩展来捕获、编码并将文件保存到磁盘

filter.saveNextFrameToURL(url, format:.PNG)

在底层,这会创建一个 PictureOutput 实例,将其作为目标附加到您的过滤器上,将 PictureOutput 的 encodedImageFormat 设置为 PNG 文件,并将 encodedImageAvailableCallback 设置为接受过滤图像数据的闭包并将其保存到 URL。

您可以通过以下方式手动设置以获取编码图像数据(作为 NSData)

let pictureOutput = PictureOutput()
pictureOutput.encodedImageFormat = .JPEG
pictureOutput.encodedImageAvailableCallback = {imageData in
    // Do something with the NSData
}
filter --> pictureOutput

您还可以通过设置 imageAvailableCallback 在平台原生格式(NSImage、UIImage)中获取过滤图像

let pictureOutput = PictureOutput()
pictureOutput.encodedImageFormat = .JPEG
pictureOutput.imageAvailableCallback = {image in
    // Do something with the image
}
filter --> pictureOutput

处理静态图像

(目前不支持 Linux 系统。)

有多种方法可以处理图像过滤。最简单的是对 UIImage 或 NSImage 的便利扩展,它可以过滤该图像并返回一个 UIImage 或 NSImage

let testImage = UIImage(named:"WID-small.jpg")!
let toonFilter = SmoothToonFilter()
let filteredImage = testImage.filterWithOperation(toonFilter)

对于更复杂的流水线

let testImage = UIImage(named:"WID-small.jpg")!
let toonFilter = SmoothToonFilter()
let luminanceFilter = Luminance()
let filteredImage = testImage.filterWithPipeline{input, output in
    input --> toonFilter --> luminanceFilter --> output
}

注意:如果您想要在屏幕上显示图像或反复过滤图像,请不要使用这些方法。在 Core Graphics 之间进行转换会增加很多开销。相反,我建议手动设置流水线并将其指向用于显示的 RenderView,以让所有操作都在 GPU 上进行。

这两个便利方法封装了多个操作。要将图像输入到过滤器流水线中,您需要创建一个 PictureInput。要捕获流水线中的图像,您使用 PictureOutput。要手动设置图像处理,您可以使用以下类似的方法

let toonFilter = SmoothToonFilter()
let testImage = UIImage(named:"WID-small.jpg")!
let pictureInput = PictureInput(image:testImage)
let pictureOutput = PictureOutput()
pictureOutput.imageAvailableCallback = {image in
    // Do something with image
}
pictureInput --> toonFilter --> pictureOutput
pictureInput.processImage(synchronously:true)

在上面的代码中,imageAvailableCallback 将在 processImage() 行被触发。如果您想异步进行图像处理,请在上面的代码中省略 synchronously 参数。

过滤和重新编码电影

功能尚未完成。

编写自定义图像处理操作

该框架使用一系列协议来定义可以输出图像以供处理、接收图像以进行处理或两者兼备的类型。这些分别是 ImageSource、ImageConsumer 和 ImageProcessingOperation 协议。任何类型都可以遵守这些协议,但通常使用类来实现。

许多常见的滤镜和其他图像处理操作都可以描述为BasicOperation类的子类。BasicOperation提供从一个或多个输入中获取图像帧、使用指定的着色器程序从这些输入中渲染矩形图像(四方形),并将其提供给所有目标所需的大部分内部代码。BasicOperation的变体,如TextureSamplingOperation或TwoStageOperation,会向着色器程序提供可能需要的额外信息,以便执行某些类型的操作。

要构建一个简单的单输入滤镜,你可能甚至不需要创建自己的子类。你需要做的就是提供一个片段着色器和在实例化BasicOperation时所需的输入数量。

let myFilter = BasicOperation(fragmentShaderFile:MyFilterFragmentShaderURL, numberOfInputs:1)

着色器程序由匹配的顶点和片段着色器组成,这些着色器被编译并链接成一个程序。默认情况下,该框架使用一系列基于传入操作的图像数量构建的库存顶点着色器。通常,你只需要提供一个用于执行筛选或其他处理的自定义片段着色器。

GPUImage使用的片段着色器看起来像这样

varying highp vec2 textureCoordinate;

uniform sampler2D inputImageTexture;
uniform lowp float gamma;

void main()
{
    lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);

    gl_FragColor = vec4(pow(textureColor.rgb, vec3(gamma)), textureColor.w);
}

纹理坐标的命名约定是:textureCoordinate、textureCoordinate2等作为从顶点着色器提供的插值变量提供。inputImageTexture、inputImageTexture2等是代表每个输入到着色器程序的图像的纹理。uniforms可以定义以控制运行中的任何着色器属性。你需要提供两个片段着色器,一个用于OpenGL ES,它具有精度限定符,另一个用于没有精度限定符的OpenGL。你需要为OpenGL ES提供两个片段着色器,一个用于OpenGL,一个用于OpenGL ES。

在框架内部,一个自定义脚本将这些着色器文件转换为内联字符串常量,以便将它们与编译的框架捆绑在一起。如果你向框架添加一个新操作,你需要运行

./ShaderConverter.sh *

在Operations/Shaders目录中以更新这些内联常量。

分组操作

如果你希望将一系列操作组合成一个单元进行传递,你可以创建一个OperationGroup的新实例。OperationGroup提供了一个configureGroup属性,该属性接受一个闭包,指定了组应该如何配置

let boxBlur = BoxBlur()
let contrast = ContrastAdjustment()

let myGroup = OperationGroup()

myGroup.configureGroup{input, output in
    input --> self.boxBlur --> self.contrast --> output
}

进入OperationGroup的帧在上面的闭包中表示为输入,整个组出去的帧表示为输出。在上面的设置之后,myGroup将显得像任何其他操作一样,尽管它由多个子操作组成。然后,这个组可以像单个操作一样传递或处理。

与OpenGL / OpenGL ES交互

GPUImage可以通过其TextureOutput和TextureInput类分别从OpenGL(ES)导出和导入纹理。这让你能够从渲染到具有绑定纹理的帧缓冲对象中的OpenGL场景录制影片,或者过滤视频或图像,然后将它们作为在场景中显示的纹理输入到OpenGL中。

对此方法的唯一注意事项是,在这些过程中使用的纹理必须通过共享组或其他方式在GPUImage的OpenGL(ES)上下文和任何其他上下文之间共享。

常见类型

该框架使用几个平台无关的类型来表示常见的值。通常,浮点输入被视为Floats。大小使用Size类型指定(通过初始化为宽度和高来构造)。颜色通过Color类型处理,你提供红色、绿色、蓝色的归一化到1.0的颜色值,以及可选的alpha成分。

坐标可以是二维和三维的。如果一个位置只指定了X和Y值,它将被视为二维点。如果还提供了一个可选的Z坐标,那么它将被作为三维点处理。

矩阵有Matrix3x3和Matrix4x4的类型。这些矩阵可以使用Floats的一行数组构建,或者在Mac和iOS上可以从CATransform3D或CGAffineTransform结构体初始化。

内置操作

框架中目前有超过100个内置操作,分为以下类别

图像生成器

  • SolidColorGenerator:输出具有纯色的生成的图像。您需要使用初始化定义图像大小。

    • 颜色:用于填充图像的颜色。

  • CircleGenerator:输出用于遮罩的圆形生成的图像。renderCircleOfRadius()方法允许您指定半径、中心、圆圈颜色和背景颜色。

  • CrosshairGenerator:输出用于遮罩的圆形生成的图像。renderCrosshairs()接收一系列归一化坐标,并在这些坐标处绘制十字线。

    • 十字线宽度:绘制的十字线的像素宽度。
    • 十字线颜色:十字线的颜色。

颜色调整

  • 亮度调整:调整图像的亮度

    • 亮度:调整的亮度(-1.0 - 1.0,默认为0.0)

  • 曝光调整:调整图像的曝光

    • 曝光:调整的曝光(-10.0 - 10.0,默认为0.0)

  • 对比度调整:调整图像的对比度

    • 对比度:调整的对比度(0.0 - 4.0,默认为1.0)

  • 饱和度调整:调整图像的饱和度

    • 饱和度:应用于图像的饱和度或去饱和度程度(0.0 - 2.0,默认为1.0)

  • 伽玛调整:调整图像的伽玛

    • 伽玛:应用的伽玛调整(0.0 - 3.0,默认为1.0)

  • 级别调整:类似Photoshop的级别调整。最小值、中间值、最大值、输出最小值和输出最大值参数是[0, 1]范围中的浮点数。如果您有来自Photoshop的[0, 255]范围内的参数,您必须首先将它们转换为[0, 1]。伽玛/中间值参数是一个大于等于0的浮点数。这与Photoshop中的值相匹配。如果您想将级别应用于RGB以及单个通道,您需要使用此过滤器两次——首先用于单个通道,然后用于所有通道。

  • 颜色矩阵过滤器:通过将这些颜色应用于矩阵来转换图像的颜色

    • 颜色矩阵:用于转换图像中每个颜色的4x4矩阵
    • 强度:新转换的颜色的程度替换了每个像素的原始颜色

  • RGB调整:调整图像的单独RGB通道

    • 红色:通过每个颜色通道乘以的规范化值。范围是从0.0到无穷大,默认为1.0。
    • 绿色:
    • 蓝色:

  • 色调调整:调整图像的色调

    • 色调:色调角度,以度为单位。默认为90度

  • 白平衡:调整图像的白平衡。

    • 温度:调整图像的温度,单位为K。4000是非常冷却,7000是非常温暖。默认值为5000。注意,4000和5000之间的视觉显著度几乎与5000和7000之间的视觉显著度一样。
    • 色调:调整图像的色调。值为-200是非常绿色,200是非常粉红色。默认值为0。

  • 高光与阴影:调整图像的高光和阴影

    • 阴影:增加以使阴影变亮,范围从 0.0 到 1.0,默认值为 0.0。
    • 高光:减少以使高光变暗,范围从 1.0 到 0.0,默认值为 1.0。

  • 查找滤镜:使用 RGB 颜色查找图像来重新映射图像中的颜色。首先,使用您喜欢的照片编辑应用程序将框架/操作/查找图像中的 lookup.png 应用为过滤器。为此必须做到每个像素颜色不能依赖于其他像素(例如,模糊将不会起作用)。如果您需要更复杂的过滤器,可以创建所需的任意数量的查找表。准备就绪后,将新的 lookup.png 文件用作 PictureInput 的基础,您为此属性提供了查找图像。

    • 强度:应用效果的强度,从 0.0(原始图像)到 1.0(完全应用的效果)。
    • 查找图像:用作查找参考的图像,形式为 PictureInput。

  • Amatorka 过滤器:基于 Amatorka 的 Photoshop 动作的照片滤镜:http://amatorka.deviantart.com/art/Amatorka-Action-2-121069631 。如果您想使用此效果,必须将 GPUImage 框架/操作/查找图像文件夹中的 lookup_amatorka.png 添加到您的应用程序包中。

  • MissEtikate 过滤器:基于 Miss Etikate 的 Photoshop 动作的照片滤镜:http://miss-etikate.deviantart.com/art/Photoshop-Action-15-120151961 。如果您想使用此效果,必须将 GPUImage 框架/操作/查找图像文件夹中的 lookup_miss_etikate.png 添加到您的应用程序包中。

  • SoftElegance:另一个基于查找的颜色重新映射过滤器。如果您要使用此效果,必须将 GPUImage 框架/操作/查找图像文件夹中的 lookup_soft_elegance_1.png 和 lookup_soft_elegance_2.png 添加到您的应用程序包中。

  • 颜色反转:反转图像中的颜色

  • 亮度:将图像减少为其亮度(灰度)。

  • 单色滤镜:根据每个像素的亮度将图像转换为单色版本

    • 强度:特定颜色替换正常图像颜色的程度(0.0 - 1.0,默认为 1.0)
    • 颜色:用作效果基础的颜色,默认为 (0.6, 0.45, 0.3, 1.0)。

  • 伪彩色:使用图像的亮度在两个用户指定的颜色之间混合

    • 第一颜色:第一和第二种颜色分别指定了替代图像暗部和亮部的颜色。默认值分别为 (0.0, 0.0, 0.5) 和 (1.0, 0.0, 0.0)。
    • secondColor:

  • 雾霾:用于添加或去除雾霾(类似于 UV 滤镜)

    • 距离:应用颜色的强度。默认值 0。最佳值在 -0.3 和 0.3 之间。
    • 斜率:颜色变化的量。默认值 0。最佳值在 -0.3 和 0.3 之间。

  • 棕褐色滤镜:简单的棕褐色滤镜

    • 强度:棕褐色取代正常图像颜色的程度(0.0 - 1.0,默认为 1.0)

  • 不透明度调整:调整传入图像的 alpha 通道

    • 不透明度:将每个像素的传入 alpha 通道乘以的值(0.0 - 1.0,默认为 1.0)

  • 亮度阈值:亮度高于阈值的像素将显示为白色,低于阈值的像素将显示为黑色

    • 阈值:亮度阈值,范围从 0.0 到 1.0,默认值为 0.5

  • 自适应阈值:确定像素周围的局部亮度,如果像素亮度低于该局部亮度,则将该像素变为黑色,如果高于,则变为白色。这在选择非均匀照明条件下的文本时可能很有用。

    • 模糊半径(像素):背景平均模糊半径的像素乘数,默认值为 4。

  • 平均亮度阈值:对此应用阈值操作,阈值根据场景的平均亮度不断调整。

    • 阈值乘数:这是一个因素,平均亮度将会乘以以达到最终要使用的阈值。默认情况下,这个值为1.0。

  • 平均颜色提取器:这个处理输入图像,并通过平均图像中每个像素的RGBA组件来确定场景的平均颜色。使用一个降低过程在GPU上逐步下采样原始图像,然后在一个CPU上进行简答的平均计算。从这个过滤器输出的结果是没有意义的,但你需要设置colorAverageProcessingFinishedBlock属性到一个接收四个颜色组件和一个帧时间的块,并对其执行某些操作。

  • 平均亮度提取器:和平均颜色提取器类似,这个将图像降低到其平均亮度。你需要设置luminosityProcessingFinishedBlock来处理这个过滤器的输出,它仅仅返回一个亮度和一个帧时间。

  • 色键:对于图像中的指定颜色,将alpha通道设置为0.这与色键混合类似,只是不为匹配的颜色融合第二张图像,而是直接将该颜色设置为透明的。

    • 阈值灵敏度:颜色匹配需要与目标颜色多接近才能替换(默认为0.4)
    • 平滑度:颜色匹配的混合平滑度(默认为0.1)

  • 饱和度:调整图像的饱和度

    • 饱和度:应用于饱和度的调整,默认为0.0,建议的最小/最大值为大约-1.2和1.2。

  • 亮部阴影色调:允许您使用颜色和强度独立地调整图像的阴影和亮部色调

    • 阴影色调:阴影色调RGB颜色(GPUVector4)。默认值:{1.0f, 0.0f, 0.0f, 1.0f}(红色)。
    • 亮部色调:亮部色调RGB颜色(GPUVector4)。默认值:{0.0f, 0.0f, 1.0f, 1.0f}(蓝色)。
    • 阴影色调强度:阴影色调强度,从0.0到1.0。默认值:0.0
    • 亮部色调强度:亮部色调强度,从0.0到1.0,默认值为0.0。

图像处理

  • 变换操作:这个为图像应用任意2D或3D变换

    • 变换:这个接受Matrix4x4行主顺序的值,指定变换。Matrix4x4值可以从Mac和iOS上的CATransform3D(用于3D操作)和CGAffineTransform(用于2D)结构体初始化,或者可以使用其他方法生成矩阵。

  • 裁剪:这个裁剪图像到特定区域,然后将该区域传递到过滤器中下一阶段的处理

    • 裁剪尺寸(像素):要从中裁剪的区域的像素尺寸。
    • 裁剪位置(像素):裁剪区域的左上角。如果没有指定,裁剪将在图像中居中。

  • Lanczos重采样:这个让用户通过Lanczos重采样上或下采样图像,这比标准的线性或三线性插值有明显的质量提升。只需使用overriddenOutputSize属性来设置过滤器的目标输出分辨率,然后图像将被重采样到该新大小。

  • 锐化:锐化图像

    • 锐度:要应用的锐度调整(-4.0 - 4.0,默认为0.0)

  • 锐化蒙版:应用锐化蒙版

    • 模糊半径(像素):底层高斯模糊的模糊半径。默认为4.0。
    • 强度:锐化强度,从0.0开始,默认为1.0

  • 高斯模糊:一个硬件优化的、可变半径的高斯模糊

    • 模糊半径(像素):使用模糊的像素半径,默认为2.0。这调整高斯分布函数中的sigma变量。

  • 盒式模糊:一个硬件优化的、可变半径的盒式模糊

    • blurRadiusInPixels:用于模糊的像素半径,默认值为2.0,用于调整模糊函数的矩形半径。

  • SingleComponentGaussianBlur:对高斯模糊的扩展,仅对红色组件进行操作。

    • 模糊半径(像素):使用模糊的像素半径,默认为2.0。这调整高斯分布函数中的sigma变量。

  • iOSBlur:尝试在模拟iOS 7控制中心等位置的背景模糊。

    • blurRadiusInPixels:用于模糊的像素半径,默认值为48.0,调整高斯分布函数中的sigma变量。
    • saturation:饱和度从0.0(完全未饱和)到2.0(饱和度最大),正常水平为0.8。
    • rangeReductionFactor:降低图像亮度范围,默认值为0.6。

  • MedianFilter:在3x3区域内取三个颜色组件的中值。

  • BilateralBlur:双边模糊,尝试模糊相似颜色值的同时保护锐边。

    • distanceNormalizationFactor:中央颜色与采样颜色之间距离的归一化因素,默认值为8.0。

  • TiltShift:模拟倾斜移轴镜头效果。

    • blurRadiusInPixels:底层模糊的半径,默认为7.0像素。
    • topFocusLevel:图像中焦点区域的顶部所在位置的归一化值,该值应小于bottomFocusLevel,默认为0.4。
    • bottomFocusLevel:图像中焦点区域的底部所在位置的归一化值,该值应大于topFocusLevel,默认为0.6。
    • focusFallOffRate:图像远离焦点区域的模糊速度,默认为0.2。

  • Convolution3x3:使用3x3卷积内核对图像进行处理。

    • convolutionKernel:卷积内核是一个3x3矩阵,应用于像素及其8个周围像素。矩阵以行主序指定,左上角的像素为m11,右下角的像素为m33。如果矩阵中的值不总和为1.0,图像可能会变亮或变暗。

  • SobelEdgeDetection:索贝尔边缘检测,边缘以白色突出显示。

    • edgeStrength:调整滤波器的动态范围。较高的值会产生更强烈的边缘,但可能饱和强度颜色空间。默认值为1.0。

  • PrewittEdgeDetection:普里维特边缘检测,边缘以白色突出显示。

    • edgeStrength:调整滤波器的动态范围。较高的值会产生更强烈的边缘,但可能饱和强度颜色空间。默认值为1.0。

  • ThresholdSobelEdgeDetection:执行索贝尔边缘检测,但使用阈值替代渐进强度值。

    • edgeStrength:调整滤波器的动态范围。较高的值会产生更强烈的边缘,但可能饱和强度颜色空间。默认值为1.0。
    • threshold:任何高于此阈值的边缘将被视为黑色,任何低于此阈值的值将被视为白色。范围从0.0到1.0,默认值为0.8。

  • Histogram:分析输入图像,并创建一个输出直方图,显示每个颜色值发生的频次。该滤波器的输出是一个3像素高、256像素宽的图像,其中中心(垂直)像素包含与各种颜色值发生频次对应的像素。每个颜色值占用256个宽度位置中的一个,从左边的0开始到右边的255结束。此直方图可以为单个颜色通道(.Red、.Green、.Blue)生成,也可以为图像的亮度(.Luminance)生成,或一次性为三个颜色通道(.RGB)生成。

    • downsamplingFactor:而不是对每个像素进行采样,这指定了图像采样的分数。默认值为16,最小值为1。这是防止直方图饱和所需的,因为直方图只能记录每个颜色值256个像素,否则会变得过载。

  • 直方图显示: 这是一个特殊的过滤器,主要用于与直方图一起使用。它生成了Histogram生成的颜色直方图的可视化输出表示,但可以重新用于显示其他类型的值。它接受一个图像,并查看中心(垂直)像素。然后,它在输出纹理中以分离的彩色图表中绘制RGB分量的数值。您可能需要强制设置此过滤器的尺寸,以便能够显示其输出。

  • 直方图均衡化: 这将图像的直方图进行分析,并根据该直方图均衡化输出图像。

    • 下采样因子: 与采样每个像素不同,这指定了用于直方图的图像的分数。默认情况下为16,最小值为1。这是必需的,以防止直方图饱和,因为直方图在超载之前只能记录每个颜色值的前256个像素。

  • Canny边缘检测: 这使用完整的Canny过程来突出显示单像素宽的边缘。

    • 模糊半径(以像素为单位): 高斯模糊的基本模糊半径。默认值为2.0。
    • 上限阈值: 任何梯度幅度高于此阈值的边缘都将通过并显示在最终结果中。默认值为0.4。
    • 下限阈值: 任何梯度幅度低于此阈值的边缘将失败并被从最终结果中移除。默认值为0.1。

  • Harris角检测器: 在输入图像上运行Harris角检测算法,并生成带有白点角点的图像,其余部分为黑色。可以设置cornersDetectedCallback,您将在回调中接收到一个角点数组(在归一化0..1位置内),以便进行您想要的任何附加操作。

    • 模糊半径(以像素为单位): 高斯模糊的半径。默认是2.0。
    • 灵敏度: 在过滤器中生成的角点密度图动态范围内应用内部缩放因子来调整。默认是5.0。
    • 阈值: 将点检测为角点的阈值。这可以基于大小、光照条件和iOS设备相机类型而有很大差异,因此可能需要一些实验才能适应您的情况。默认是0.20。

  • Noble角检测器: 在Harris角检测器上运行Noble变体。它表现出与Harris检测器类似的特性。

    • 模糊半径(以像素为单位): 高斯模糊的半径。默认是2.0。
    • 灵敏度: 在过滤器中生成的角点密度图动态范围内应用内部缩放因子来调整。默认是5.0。
    • 阈值: 将点检测为角点的阈值。这可以基于大小、光照条件和iOS设备相机类型而有很大差异,因此可能需要一些实验才能适应您的情况。默认是0.2。

  • Shi-Tomasi角检测器: 运行Shi-Tomasi特征检测器。它表现出与Harris检测器类似的特性。

    • 模糊半径(以像素为单位): 高斯模糊的半径。默认是2.0。
    • 灵敏度: 在过滤器中生成的角点密度图动态范围内应用内部缩放因子来调整。默认是1.5。
    • 阈值: 将点检测为角点的阈值。这可以基于大小、光照条件和iOS设备相机类型而有很大差异,因此可能需要一些实验才能适应您的情况。默认是0.2。

  • 膨胀: 这执行图像膨胀操作,使用矩形邻域中颜色通道的最大强度作为此像素的强度。在初始化时指定矩形区域的半径,范围在1-4像素之间。这适用于灰度图像,并扩展亮区域。

  • 腐蚀: 这执行图像腐蚀操作,使用矩形邻域中颜色通道的最小强度作为此像素的强度。在初始化时指定矩形区域的半径,范围在1-4像素之间。这适用于灰度图像,并扩展暗区域。

  • OpeningFilter:此算法对图像的颜色通道进行腐蚀操作,然后再进行相同半径的膨胀操作。半径在初始化时设置,范围为1-4个像素。此过滤器将过滤掉较小的明亮区域。

  • ClosingFilter:此算法对图像的颜色通道进行膨胀操作,然后再进行相同半径的腐蚀操作。半径在初始化时设置,范围为1-4个像素。此过滤器将过滤掉较小的暗色区域。

  • LocalBinaryPattern:此算法比较中心像素和它周围的8个像素的红色通道的亮度,并将比较结果编码成一个位串,该串成为该像素的亮度。最低有效位是右上角的比较,顺时针至右的比较是最高有效位。

  • ColorLocalBinaryPattern:此算法比较中心像素和它周围的8个像素的所有颜色通道的亮度,并将比较结果编码成一个位串,该串成为该像素的每一种颜色通道的亮度。最低有效位是右上角的比较,顺时针至右的比较是最高有效位。

  • LowPassFilter:此算法对视频帧应用低通过滤器。这基本是将过去帧加权移动平均累计和当前帧汇总。这可以用于去噪视频、添加运动模糊或用于创建高通滤波器。

    • strength:此控件控制与前一次累积帧混合的程度。范围从0.0到1.0,默认为0.5。

  • HighPassFilter:此算法对视频帧应用高通过滤器。这是低通滤波器的逆过程,显示当前帧与过去加权移动平均之间的差异。这主要用于运动检测。

    • strength:此控件控制与前一次累积帧混合并从当前帧中减去的程度。范围从0.0到1.0,默认为0.5。

  • MotionDetector:这是一个基于高通滤波器的运动检测器。你设置motionDetectedCallback,在每一帧输入时,它会给出场景中检测到的任何运动的质心(在归一化X,Y坐标中)以及场景的运动强度。

    • lowPassStrength:此控件控制用于建立与输入帧进行比较的基线的后台低通滤波器的强度。范围从0.0到1.0,默认为0.5。

  • MotionBlur:在图像上应用方向性运动模糊。

    • blurSize:模糊大小的倍数,范围从0.0以上,默认为1.0。
    • blurAngle:模糊角度,单位是度。默认为0度。

  • ZoomBlur:在图像上应用方向性运动模糊。

    • blurSize:模糊大小的倍数,范围从0.0以上,默认为1.0。
    • blurCenter:模糊的中心点坐标,是一个归一化值。(0.5, 0.5) 为默认值。

  • ColourFASTFeatureDetection:提取图像的ColorFAST特征描述符。

    • blurRadiusInPixels:箱型模糊的底层模糊半径。默认是3.0。

混合模式

  • ChromaKeyBlend:选择性地将第一张图像中的颜色替换为第二张图像。

    • 阈值灵敏度:颜色匹配需要与目标颜色多接近才能替换(默认为0.4)
    • 平滑度:颜色匹配的混合平滑度(默认为0.1)

  • DissolveBlend:应用两个图像的溶解融合。

    • mix:第二张图像覆盖第一张图像的程度(0.0 - 1.0,默认为0.5)。

  • MultiplyBlend:应用两个图像的乘法混合。

  • AddBlend:应用两个图像的加法混合。

  • SubtractBlend:应用两个图像的减法混合。

  • DivideBlend:应用两个图像的除法混合。

  • OverlayBlend:应用两个图像的叠加混合。

  • DarkenBlend:通过取两个图像之间颜色分量之间的最小值来混合两个图像。

  • LightenBlend:通过取图像之间每个颜色成分的最大值混合两个图像

  • ColorBurnBlend:应用两个图像的色彩烧蚀混合效果

  • ColorDodgeBlend:应用两个图像的色彩稀释混合效果

  • ScreenBlend:应用两个图像的叠加混合效果

  • ExclusionBlend:应用两个图像的排除混合效果

  • DifferenceBlend:应用两个图像的差异混合效果

  • HardLightBlend:应用两个图像的硬光混合效果

  • SoftLightBlend:应用两个图像的柔光混合效果

  • AlphaBlend:根据第二图像的透明度通道将第二个图像混合在第一个图像上方

    • mix:第二图像覆盖第一个图像的程度(0.0 - 1.0,默认为1.0)

  • SourceOverBlend:应用两个图像的源混合效果

  • ColorBurnBlend:应用两个图像的色彩烧蚀混合效果

  • ColorDodgeBlend:应用两个图像的色彩稀释混合效果

  • NormalBlend:应用两个图像的正常混合效果

  • ColorBlend:应用两个图像的色彩混合效果

  • HueBlend:应用两个图像的色调混合效果

  • SaturationBlend:应用两个图像的饱和度混合效果

  • LuminosityBlend:应用两个图像的亮度混合效果

  • LinearBurnBlend:应用两个图像的线性烧蚀混合效果

视觉效果

  • Pixellate:对图像或视频应用像素化效果

    • fractionalWidthOfAPixel:像素大小相对于图像宽高的比例(0.0 - 1.0,默认为0.05)

  • PolarPixellate:基于极坐标而不是笛卡尔坐标对图像或视频应用像素化效果

    • center:应用像素化的中心点,默认为(0.5, 0.5)
    • pixelSize:像素大小的分数,分为宽度和高度组件。默认为(0.05, 0.05)

  • PolkaDot:将图像分解为规则网格内的彩色点

    • fractionalWidthOfAPixel:点相对于图像宽高的比例(0.0 - 1.0,默认为0.05)
    • dotScaling:每个网格空间被点占据的分数,0.0到1.0之间,默认为0.9。

  • Halftone:将图像应用于类似新闻打印的半色调效果

    • fractionalWidthOfAPixel:半色调点的相对于图像宽高的比例(0.0 - 1.0,默认为0.05)

  • Crosshatch:将图像转换为黑白交叉图案

    • crossHatchSpacing:用于交叉图案间距的图像宽度分数。默认为0.03。
    • lineWidth:交叉线条的相对宽度。默认为0.003。

  • SketchFilter:将视频转换为草图效果。这仅仅是使用颜色反转的索贝尔边缘检测过滤器

    • edgeStrength:调整滤波器的动态范围。较高的值会产生更强烈的边缘,但可能饱和强度颜色空间。默认值为1.0。

  • ThresholdSketchFilter:与草图过滤器相同,只是边缘被阈值化而不是转为灰度

    • edgeStrength:调整滤波器的动态范围。较高的值会产生更强烈的边缘,但可能饱和强度颜色空间。默认值为1.0。
    • threshold:任何高于此阈值的边缘将被视为黑色,任何低于此阈值的值将被视为白色。范围从0.0到1.0,默认值为0.8。

  • ToonFilter:这使用索贝尔边缘检测在对象周围放置黑色边框,然后将图像中的颜色量化以给图像带来卡通般的质感

    • threshold:边缘检测的灵敏度,低值更敏感。范围从0.0到1.0,默认为0.2
    • quantizationLevels:在最终图像中表示的颜色级别数量。默认为10.0

  • SmoothToonFilter:这使用与ToonFilter类似的过程,只是在卡通效果之前使用高斯模糊来平滑噪声。

    • 模糊半径(以像素为单位): 高斯模糊的半径。默认是2.0。
    • threshold:边缘检测的灵敏度,低值更敏感。范围从0.0到1.0,默认为0.2
    • quantizationLevels:在最终图像中表示的颜色级别数量。默认为10.0

  • EmbossFilter:在图像上应用浮雕效果

    • 强度:压印的强度,从0.0到4.0,以1.0为标准水平。

  • 分色:这减少了颜色动态范围至指定的步骤数,导致图像呈现卡通般的简单阴影。

    • colorLevels:将图像空间减少到多少颜色层级。范围从1到256,默认为10。

  • 漩涡扭曲:在图像上创建漩涡扭曲。

    • radius:应用扭曲的中心半径,默认为0.5。
    • center:扭曲中心,图像的坐标(从0到1.0的正常化坐标),默认为(0.5,0.5)。
    • angle:应用于图像的扭曲程度,默认为1.0。

  • 膨胀扭曲:在图像上创建膨胀扭曲。

    • radius:应用扭曲的中心半径,默认为0.25。
    • center:扭曲中心,图像的坐标(从0到1.0的正常化坐标),默认为(0.5,0.5)。
    • scale:应用的扭曲程度,从-1.0到1.0,默认为0.5。

  • 压扁扭曲:创建图像的压扁扭曲。

    • radius:应用扭曲的中心半径,默认为1.0。
    • center:扭曲中心,图像的坐标(从0到1.0的正常化坐标),默认为(0.5,0.5)。
    • scale:应用的扭曲程度,从-2.0到2.0,默认为1.0。

  • 拉伸扭曲:创建图像的拉伸扭曲。

    • center:扭曲中心,图像的坐标(从0到1.0的正常化坐标),默认为(0.5,0.5)。

  • 球面折射:模拟通过玻璃球体折射。

    • center:应用扭曲的中心,默认为(0.5,0.5)。
    • radius:扭曲半径,范围为0.0到1.0,默认为0.25。
    • refractiveIndex:球体的折射率,默认为0.71。

  • 玻璃球折射:与球面折射相同,但图像不会反转,玻璃边缘略有雾状。

    • center:应用扭曲的中心,默认为(0.5,0.5)。
    • radius:扭曲半径,范围为0.0到1.0,默认为0.25。
    • refractiveIndex:球体的折射率,默认为0.71。

  • 深色晕影:执行深色晕影效果,逐渐减弱图像边缘。

    • center:晕影中心的纹理坐标(CGPoint),默认为0.5,0.5。
    • color:用于晕影的颜色(GPUVector3),默认为黑色。
    • start:晕影效果开始时的规范化距离,从中心开始,默认为0.5。
    • end:晕影效果结束时的规范化距离,从中心结束,默认为0.75。

  • 谷原滤波器:基于Kyuwhara图像抽象,由Kyprianidis等人在其出版物《GPU上的各向异性Kyuwhara滤波》中推出,该滤波器产生类似油画的效果,但它非常耗计算量,所以在一个iPad 2上渲染一帧可能需要数秒钟。这或许最适合用于静态图像。

    • radius:在整数上指定在应用滤波器时从中心像素向外测试的像素数,默认为4。更大的值将创建更抽象的图像,但代价是更长的处理时间。

  • 谷原半径3滤波器:对谷原滤波器的一种修改版本,优化为仅工作于三个像素的半径内。

  • CGA颜色空间:模拟CGA监视器的颜色空间。

  • 曝光处理:应用曝光效果。

    • 阈值:亮度高于阈值的像素将反转颜色。范围从0.0到1.0,默认为0.5。