核心图像的基础知识介绍

核心图像是一个图像处理及分析的框架,使用于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 通常的核心-取样多个像素在一个图像上,一些事颜色核心不能做。它们被用在滤镜中例如模糊和锐化滤镜

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容