Brad Larson
http://www.sunsetlakesoftware.com
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文件中找到。
该框架依赖于处理管道的概念,其中图像源针对图像消费者,依此类推,直到图像输出到屏幕、图像文件、原始数据或记录的电影。相机、电影、静态图像和原始数据都可以作为该管道的输入。可以通过一系列较小操作的组合构建任意复杂的处理操作。
这是一个面向对象的框架,具有封装输入、处理操作和输出的类。处理操作使用OpenGL (ES)顶点和片段着色器在GPU上执行它们的图像操作。
下面展示了在常见应用程序中使用该框架的示例。
要将 GPUImage 框架添加到您的 iOS 应用程序中,您可以通过将 GPUImage-iOS.xcodeproj 项目拖入应用程序项目,或者通过“文件”|“添加文件到…”添加它。
然后,前往您的项目构建阶段,并将 GPUImage 添加为目标依赖项。将其添加到“链接二进制与库”阶段。添加一个新的“复制文件”构建阶段,将其目标设置为“框架”,并将 GPUImage.framework 添加到其中。最后一步将确保框架被部署到您的应用程序包中。
在任何引用 GPUImage 类的 Swift 文件中,只需添加
import GPUImage
您就应该可以开始使用了。
请注意,您可能需要构建一次项目来解析和构建 GPUImage 框架,以便 Xcode 停止警告框架及其类丢失。
最终,此项目将支持 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将显得像任何其他操作一样,尽管它由多个子操作组成。然后,这个组可以像单个操作一样传递或处理。
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()接收一系列归一化坐标,并在这些坐标处绘制十字线。
亮度调整:调整图像的亮度
曝光调整:调整图像的曝光
对比度调整:调整图像的对比度
饱和度调整:调整图像的饱和度
伽玛调整:调整图像的伽玛
级别调整:类似Photoshop的级别调整。最小值、中间值、最大值、输出最小值和输出最大值参数是[0, 1]范围中的浮点数。如果您有来自Photoshop的[0, 255]范围内的参数,您必须首先将它们转换为[0, 1]。伽玛/中间值参数是一个大于等于0的浮点数。这与Photoshop中的值相匹配。如果您想将级别应用于RGB以及单个通道,您需要使用此过滤器两次——首先用于单个通道,然后用于所有通道。
颜色矩阵过滤器:通过将这些颜色应用于矩阵来转换图像的颜色
RGB调整:调整图像的单独RGB通道
色调调整:调整图像的色调
白平衡:调整图像的白平衡。
高光与阴影:调整图像的高光和阴影
查找滤镜:使用 RGB 颜色查找图像来重新映射图像中的颜色。首先,使用您喜欢的照片编辑应用程序将框架/操作/查找图像中的 lookup.png 应用为过滤器。为此必须做到每个像素颜色不能依赖于其他像素(例如,模糊将不会起作用)。如果您需要更复杂的过滤器,可以创建所需的任意数量的查找表。准备就绪后,将新的 lookup.png 文件用作 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 添加到您的应用程序包中。
颜色反转:反转图像中的颜色
亮度:将图像减少为其亮度(灰度)。
单色滤镜:根据每个像素的亮度将图像转换为单色版本
伪彩色:使用图像的亮度在两个用户指定的颜色之间混合
雾霾:用于添加或去除雾霾(类似于 UV 滤镜)
棕褐色滤镜:简单的棕褐色滤镜
不透明度调整:调整传入图像的 alpha 通道
亮度阈值:亮度高于阈值的像素将显示为白色,低于阈值的像素将显示为黑色
自适应阈值:确定像素周围的局部亮度,如果像素亮度低于该局部亮度,则将该像素变为黑色,如果高于,则变为白色。这在选择非均匀照明条件下的文本时可能很有用。
平均亮度阈值:对此应用阈值操作,阈值根据场景的平均亮度不断调整。
平均颜色提取器:这个处理输入图像,并通过平均图像中每个像素的RGBA组件来确定场景的平均颜色。使用一个降低过程在GPU上逐步下采样原始图像,然后在一个CPU上进行简答的平均计算。从这个过滤器输出的结果是没有意义的,但你需要设置colorAverageProcessingFinishedBlock属性到一个接收四个颜色组件和一个帧时间的块,并对其执行某些操作。
平均亮度提取器:和平均颜色提取器类似,这个将图像降低到其平均亮度。你需要设置luminosityProcessingFinishedBlock来处理这个过滤器的输出,它仅仅返回一个亮度和一个帧时间。
色键:对于图像中的指定颜色,将alpha通道设置为0.这与色键混合类似,只是不为匹配的颜色融合第二张图像,而是直接将该颜色设置为透明的。
饱和度:调整图像的饱和度
亮部阴影色调:允许您使用颜色和强度独立地调整图像的阴影和亮部色调
{1.0f, 0.0f, 0.0f, 1.0f}
(红色)。{0.0f, 0.0f, 1.0f, 1.0f}
(蓝色)。变换操作:这个为图像应用任意2D或3D变换
裁剪:这个裁剪图像到特定区域,然后将该区域传递到过滤器中下一阶段的处理
Lanczos重采样:这个让用户通过Lanczos重采样上或下采样图像,这比标准的线性或三线性插值有明显的质量提升。只需使用overriddenOutputSize属性来设置过滤器的目标输出分辨率,然后图像将被重采样到该新大小。
锐化:锐化图像
锐化蒙版:应用锐化蒙版
高斯模糊:一个硬件优化的、可变半径的高斯模糊
盒式模糊:一个硬件优化的、可变半径的盒式模糊
SingleComponentGaussianBlur:对高斯模糊的扩展,仅对红色组件进行操作。
iOSBlur:尝试在模拟iOS 7控制中心等位置的背景模糊。
MedianFilter:在3x3区域内取三个颜色组件的中值。
BilateralBlur:双边模糊,尝试模糊相似颜色值的同时保护锐边。
TiltShift:模拟倾斜移轴镜头效果。
Convolution3x3:使用3x3卷积内核对图像进行处理。
SobelEdgeDetection:索贝尔边缘检测,边缘以白色突出显示。
PrewittEdgeDetection:普里维特边缘检测,边缘以白色突出显示。
ThresholdSobelEdgeDetection:执行索贝尔边缘检测,但使用阈值替代渐进强度值。
Histogram:分析输入图像,并创建一个输出直方图,显示每个颜色值发生的频次。该滤波器的输出是一个3像素高、256像素宽的图像,其中中心(垂直)像素包含与各种颜色值发生频次对应的像素。每个颜色值占用256个宽度位置中的一个,从左边的0开始到右边的255结束。此直方图可以为单个颜色通道(.Red、.Green、.Blue)生成,也可以为图像的亮度(.Luminance)生成,或一次性为三个颜色通道(.RGB)生成。
直方图显示: 这是一个特殊的过滤器,主要用于与直方图一起使用。它生成了Histogram生成的颜色直方图的可视化输出表示,但可以重新用于显示其他类型的值。它接受一个图像,并查看中心(垂直)像素。然后,它在输出纹理中以分离的彩色图表中绘制RGB分量的数值。您可能需要强制设置此过滤器的尺寸,以便能够显示其输出。
直方图均衡化: 这将图像的直方图进行分析,并根据该直方图均衡化输出图像。
Canny边缘检测: 这使用完整的Canny过程来突出显示单像素宽的边缘。
Harris角检测器: 在输入图像上运行Harris角检测算法,并生成带有白点角点的图像,其余部分为黑色。可以设置cornersDetectedCallback,您将在回调中接收到一个角点数组(在归一化0..1位置内),以便进行您想要的任何附加操作。
Noble角检测器: 在Harris角检测器上运行Noble变体。它表现出与Harris检测器类似的特性。
Shi-Tomasi角检测器: 运行Shi-Tomasi特征检测器。它表现出与Harris检测器类似的特性。
膨胀: 这执行图像膨胀操作,使用矩形邻域中颜色通道的最大强度作为此像素的强度。在初始化时指定矩形区域的半径,范围在1-4像素之间。这适用于灰度图像,并扩展亮区域。
腐蚀: 这执行图像腐蚀操作,使用矩形邻域中颜色通道的最小强度作为此像素的强度。在初始化时指定矩形区域的半径,范围在1-4像素之间。这适用于灰度图像,并扩展暗区域。
OpeningFilter:此算法对图像的颜色通道进行腐蚀操作,然后再进行相同半径的膨胀操作。半径在初始化时设置,范围为1-4个像素。此过滤器将过滤掉较小的明亮区域。
ClosingFilter:此算法对图像的颜色通道进行膨胀操作,然后再进行相同半径的腐蚀操作。半径在初始化时设置,范围为1-4个像素。此过滤器将过滤掉较小的暗色区域。
LocalBinaryPattern:此算法比较中心像素和它周围的8个像素的红色通道的亮度,并将比较结果编码成一个位串,该串成为该像素的亮度。最低有效位是右上角的比较,顺时针至右的比较是最高有效位。
ColorLocalBinaryPattern:此算法比较中心像素和它周围的8个像素的所有颜色通道的亮度,并将比较结果编码成一个位串,该串成为该像素的每一种颜色通道的亮度。最低有效位是右上角的比较,顺时针至右的比较是最高有效位。
LowPassFilter:此算法对视频帧应用低通过滤器。这基本是将过去帧加权移动平均累计和当前帧汇总。这可以用于去噪视频、添加运动模糊或用于创建高通滤波器。
HighPassFilter:此算法对视频帧应用高通过滤器。这是低通滤波器的逆过程,显示当前帧与过去加权移动平均之间的差异。这主要用于运动检测。
MotionDetector:这是一个基于高通滤波器的运动检测器。你设置motionDetectedCallback,在每一帧输入时,它会给出场景中检测到的任何运动的质心(在归一化X,Y坐标中)以及场景的运动强度。
MotionBlur:在图像上应用方向性运动模糊。
ZoomBlur:在图像上应用方向性运动模糊。
ColourFASTFeatureDetection:提取图像的ColorFAST特征描述符。
ChromaKeyBlend:选择性地将第一张图像中的颜色替换为第二张图像。
DissolveBlend:应用两个图像的溶解融合。
MultiplyBlend:应用两个图像的乘法混合。
AddBlend:应用两个图像的加法混合。
SubtractBlend:应用两个图像的减法混合。
DivideBlend:应用两个图像的除法混合。
OverlayBlend:应用两个图像的叠加混合。
DarkenBlend:通过取两个图像之间颜色分量之间的最小值来混合两个图像。
LightenBlend:通过取图像之间每个颜色成分的最大值混合两个图像
ColorBurnBlend:应用两个图像的色彩烧蚀混合效果
ColorDodgeBlend:应用两个图像的色彩稀释混合效果
ScreenBlend:应用两个图像的叠加混合效果
ExclusionBlend:应用两个图像的排除混合效果
DifferenceBlend:应用两个图像的差异混合效果
HardLightBlend:应用两个图像的硬光混合效果
SoftLightBlend:应用两个图像的柔光混合效果
AlphaBlend:根据第二图像的透明度通道将第二个图像混合在第一个图像上方
SourceOverBlend:应用两个图像的源混合效果
ColorBurnBlend:应用两个图像的色彩烧蚀混合效果
ColorDodgeBlend:应用两个图像的色彩稀释混合效果
NormalBlend:应用两个图像的正常混合效果
ColorBlend:应用两个图像的色彩混合效果
HueBlend:应用两个图像的色调混合效果
SaturationBlend:应用两个图像的饱和度混合效果
LuminosityBlend:应用两个图像的亮度混合效果
LinearBurnBlend:应用两个图像的线性烧蚀混合效果
Pixellate:对图像或视频应用像素化效果
PolarPixellate:基于极坐标而不是笛卡尔坐标对图像或视频应用像素化效果
PolkaDot:将图像分解为规则网格内的彩色点
Halftone:将图像应用于类似新闻打印的半色调效果
Crosshatch:将图像转换为黑白交叉图案
SketchFilter:将视频转换为草图效果。这仅仅是使用颜色反转的索贝尔边缘检测过滤器
ThresholdSketchFilter:与草图过滤器相同,只是边缘被阈值化而不是转为灰度
ToonFilter:这使用索贝尔边缘检测在对象周围放置黑色边框,然后将图像中的颜色量化以给图像带来卡通般的质感
SmoothToonFilter:这使用与ToonFilter类似的过程,只是在卡通效果之前使用高斯模糊来平滑噪声。
EmbossFilter:在图像上应用浮雕效果
分色:这减少了颜色动态范围至指定的步骤数,导致图像呈现卡通般的简单阴影。
漩涡扭曲:在图像上创建漩涡扭曲。
膨胀扭曲:在图像上创建膨胀扭曲。
压扁扭曲:创建图像的压扁扭曲。
拉伸扭曲:创建图像的拉伸扭曲。
球面折射:模拟通过玻璃球体折射。
玻璃球折射:与球面折射相同,但图像不会反转,玻璃边缘略有雾状。
深色晕影:执行深色晕影效果,逐渐减弱图像边缘。
谷原滤波器:基于Kyuwhara图像抽象,由Kyprianidis等人在其出版物《GPU上的各向异性Kyuwhara滤波》中推出,该滤波器产生类似油画的效果,但它非常耗计算量,所以在一个iPad 2上渲染一帧可能需要数秒钟。这或许最适合用于静态图像。
谷原半径3滤波器:对谷原滤波器的一种修改版本,优化为仅工作于三个像素的半径内。
CGA颜色空间:模拟CGA监视器的颜色空间。
曝光处理:应用曝光效果。