美文网首页VR开发
核心图像的基础知识介绍

核心图像的基础知识介绍

作者: Marc_Steven | 来源:发表于2016-04-21 18:56 被阅读178次

    核心图像是一个图像处理及分析的框架,使用于iOS和OS X。它提供了开发者一个简单的应用程序接口在基于一个互相协调到应用的效果更为宽广的范围。
    从图像编辑和目录生成到应用实时效果给游戏和实时的视频,核心图像有令人钦佩的幅度。自从iOS9之后,核心图像对于iOS已经达到用它的OS X同意义的贴近奇偶校验,这意味着iOS开发者现在可以进入完整的一套滤镜-多达170种滤镜并且可以用CIKernel去写自定义滤镜。此外自从iOS9后,许多iOS的滤镜超越了OS X上的有更多的优点。在OS X中它们通过Apple的metal性能阴影返回并且对于通常的图像处理任务有惊人的性能 例如模糊和回旋。
    核心图像滤镜
    或许核心图像的大多数及时的部分是图像处理滤镜的一套。从简单的模糊和通过技术颜色处理到合成的失真的颜色控制,这些滤镜能被独特的使用或链在一起去生成独特和令人吃惊的效果。
    从简单的链或许带一个蒙拉丽莎的图像,转换它到单色,然后用浅蓝色去着色,最后申请一个小插图。如图所示

    屏幕快照 2016-04-21 下午6.43.32.png

    链一起的滤镜尽力充分利用,用这样的方式-个别的滤镜的图像处理代码是链接一起去创建一个单一的程序。这意味着,无论哪里可能,都没有中间的缓冲区或使得合成滤镜集合的处理非常快的图片。
    核心图像滤镜是非常轻量级的对象,真实的滤镜工作是延迟的知道最后的结果被请求。核心图像隐藏了技术实现,因此无论一个滤镜是否执行在GPU或CPU上,并且一个基于滤镜的GPU使用Metal 或不会从开发者隐藏。
    人脸侦测和形状
    核心图像提供了能一直分析和移动图像,查询人脸和 长方形,文本区域和快速响应码的CIDetector对象的一个范围。人脸侦测在一个活动的视频内实时工作。
    1,核心图像基本原理
    对于渲染核心图像输出的基本原理的类是Core image Context,CIContext。它负责编译和运行这些滤镜然后描述画面的目的地要么是CPU 要么GPU
    一个核心的图像shang上下文能花时间去例示并且应该产生一次然后重用。一旦创建则是不可计算的。因此是线程安全的,因此相同的上下文能在不同的线程共用。
    在一个最简单的格式内,一个上下文能不带参数创建
    let context = CIContext()
    在这个事件中,我们创建了一个返回缓慢比基于上下文的GPU的基于上下文的CPU。这或许对于静态的图片是比较好的,但是对于处理带有快速变化的参数的活动的视频或滤镜,它不足够快。然而,基于上下文的CPU能在背景线程执行-或许会朝着节制它更缓慢的速度去提升。
    为了更好的提升性能,我们可以从一个EAGL 上下文去创建一个核心图像上下文的GPU。这保持所有的核心图片处理在GPU(通过使用GLKit),运行核心图像去直接绘制到根本没有包含CPU的一个视图的画面缓存区
    let eaglContext = EAGLContext(API:.OpenGLES2)
    let context = CIContext(EAGLContext:eaglContext)
    为了更长远的增加性能,我们能明显地关掉颜色管理-通过设置kCIContextWorkingColorSpace 为NULL在选项中
    let context = CIContext(EAGLContext:eaglContext,options:[kCIContextWorkingColorSpace:NSNull()])
    2,核心图像滤镜
    核心图像滤镜是CIFiter的实例,代表性要么申请可视化效果给图像要么生成一个图像(例如随机的噪点或着色的条纹),而不是子类化CIFilter进入多个滤镜类,滤镜通过名字创建:例如
    let blurFilter = CIFilter(name:”CIGaussianBlur”)!
    一旦滤镜创建,则它的属性用setValue()设置,在这里我们定义了模糊滤镜的输出图片作为CIImage名为ciImage,它的模糊半径为25像素
    blurFilter.setValue(ciImage,forKey:kCIInputImageKey)
    blurFilter.setValue(25,forKey:kCIInputRadiusKey)
    自从滤镜名和它的键是字符串并且它的属性的值是AnyObject?这创建滤镜和设置参数值缺少安全。为了帮助使其缓和,核心图像提供了一系列的函数去在变化的滤镜和它们的属性和类型之间询问。一个滤镜的数据能以二种方式存取。
    要么通过查询滤镜的输出图像的值要么他的输出图像属性
    let result = blurFilter.valueForKey(kCIOutputImageKey)
    这会返回一个AnyObject的类型的对象-代表性地被转换作为一个CIImage,存取输出图像的速记方式是输出图像属性
    let result = blurFilter.outputImage
    上面的方法会返回一个可选的CIImage。这没有什么因为直到返回的CIImage变为渲染的格式,否则查询滤镜结果是不执行这个滤镜。
    核心图像的强大来自于在前面的-当多个滤镜链接在一起。因此我们能携带那个模糊的输出并且设置它作为输出到子序列顺化调整。例如,宁愿设置它的属性用setValue,它们在滤镜的构造器内被设置
    let hueAdjust = CIFilter(name:”CIHueAdjust”,withInputParameters:[kCIInputAngleKey:3.14,kCIOutputImageKey:blurFilter.outputImage!])
    因为核心图像滤镜是计算的,因为它不是线程安全的。
    3,核心图像图像
    核心图像有它自己的图像数据格式 CIImage,然而一个CIImage不包含你所期望的位图,相当它对于如何创建一个图像包含秘诀
    核心图像滤镜接受核心图像图像作为输入输出,当输出转换为渲染格式时(UIImage,在此期间主要做上下文创建和执行滤镜)它是独一无二的。因此一个CIImage能被考虑为一个许诺。
    核心图像的图像能从其他格式创建例如UIImage 或从一个核心视频像素缓冲区。生成一个CIImage通过一个已经存在的UIImage然后init(image:)构造器被使用
    let uiImage = UIImage (name:”sunflower.jpg”)
    let ciImage = CIImage(image:uiImage!)
    以下是通过实时的视频供给去生成一个核心图像通过一个像素缓冲区,然后通过init构造器使用
    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
    let ciImage = CIImage(CVPixelBuffer:pixelBuffer!)
    相反地,核心图像的图像能被作为一个可显示的UIImage的资源
    let uiImage = UIImage(CIImage:ciImage)
    尽管我们明确的生成一个CIContext,核心图像生成了一个单一使用的上下文去实现它的转换并且那在性能上有一定的效果。
    我们生成一个CIImage包含一个可靠的颜色用init构造器
    let brownImage = CIImage(color:CIColor(red:0.7,green:0.4,blue:0.1))
    这值得提醒-一个用这个技术创建的CIImage有无穷大的空间。自从它对于如何创建一个图形而言是一个诀窍,无穷大并不意味着用尽内存的每一个可用的字节。上面的brownImage简单地包含了指令通知无论将渲染什么,它必须用一个棕色去填充每一个像素
    CIImage也有一个便利的方法集合去创建一个新的图像-通过申请滤镜但是速记法必须创建单独的滤镜
    let filter = CIFilter(name:”CISepiaTone”,withInputPrameters:[kCIInputImageKey:image ,kCIInputIntensityKey:0.5])])
    let filteredImage = filter?.outputImage
    然而有捷径去写上面的代码通过使用imageByApplyingFilter():
    let filterImage = image.imageByApplyingFilter(“CISepiaTone”,withInputParameters:[kCIInputIntensityKey:0.5])
    同样的方式,我们可以生成一个CICrop滤镜
    let rect = CGRect(x:0,y:0,width:640,height:480)
    let croppedImage = image.imageByCroppingToRect(rect)
    这也有一些捷径给组合的图像通过互相使用,保存和生成一个新的CISourceOverComposition滤镜,以下是通过背景图像去合成一个前景图像
    let result = foregroundImage.imageByCompositionOverImage(backgroundImage)
    5, 核心图像的核心
    一个核心代表程序,核心图像的背景语言-执行一个滤除的操作。所有的核心图像滤镜包含至少一个核心,一些或许包含二个或多个
    核心被分为三个主要的分类:
    5.1颜色核心-对于简单的更改独特的像素颜色要尽力最佳化使用,例如一个滤镜去控制图像的曝光就是基于这个核心
    5.2 弯曲核心-更改一个图像的几何学最佳化使用。例如放大和裁剪,圆形化镜头失真等高级滤镜
    5.3 通常的核心-取样多个像素在一个图像上,一些事颜色核心不能做。它们被用在滤镜中例如模糊和锐化滤镜

    相关文章

      网友评论

        本文标题:核心图像的基础知识介绍

        本文链接:https://www.haomeiwen.com/subject/pxwtrttx.html