精华内容
下载资源
问答
  • 图像处理框架

    2019-01-11 20:59:26
    图像处理框架 Picasso.get().load(网址).into(); Picasso.get() .load(url) .placeholder(R.drawable.user_placeholder) .error(R.drawable.user_placeholder_error) .into(imageView) load(String path):...

    图像处理框架
    Picasso.get().load(网址).into();
    Picasso.get()
    .load(url)
    .placeholder(R.drawable.user_placeholder)
    .error(R.drawable.user_placeholder_error)
    .into(imageView)

    load(String path):用于下载图片,必须
    resize(int width,int height):用于设置图片的宽高,不必须
    Glide (可以绘制圆形图片)
    Glide.with(this(上下文)).load(网址).into(iv);
    ImageLoader 可以监听下载进度
    
    展开全文
  • 数字图像处理框架 MFCImgTest.rar
  • Mfc图像处理框架 VC编程 图像显示与处理Cimage显示OPencv处理
  • MetalPetal 一个基于Metal的图像处理框架
  • iOS之CoreImage图像处理框架

    千次阅读 2016-05-25 01:48:49
    CoreImage图像处理框架

     

    iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer(触摸UI层)、MediaLayer(媒体层)、Core Services Layer(核心服务层)、Core OS Layer(核心OS层)。

     

     

     

     

     

     

     

     

    ========================================

     

    CoreImage是一个图像框架,它基于OpenGL顶层创建,底层则用着色器来处理图像,这意味着它利用了GPU基于硬件加速来处理图像。CoreImage中有很多滤镜,它们能够一次给予一张图像或者视频帧多种视觉效果。而且滤镜可以连接起来组成一个滤镜链,把滤镜效果叠加起来处理图像。CoreImage框架最早出现于iOS5,iOS6也对这个框架进行了扩展,可以实现人脸识别。

    Core Image 是苹果官方提供的图像处理框架,通过丰富的 built-in(内置)或自定义 Filter(过滤器)高效处理静态图片、动态图片或视频。开发者还可以通过构造 Filter 链或自定义 Core Image Kernel 来实现更丰富的效果。
    在 WWDC20 中,苹果官方针对 Core Image 技术在以下三方面做了优化:Core Image 对视频 / 动图的支持、基于 Metal 构建 Core Image (CI) Kernel 以及 Core Image 的 Debug 支持。

     

    CoreImage图像处理框架

     

     

    主要分为三部分:

    1)定义部分:CoreImage 何CoreImageDefines。见名思义,代表了CoreImage 这个框架和它的定义。

    2)操作部分:

    滤镜(CIFliter):CIFilter 产生一个CIImage。典型的,接受一到多的图片作为输入,经过一些过滤操作,产生指定输出的图片。

    检测(CIDetector):CIDetector 检测处理图片的特性,如使用来检测图片中人脸的眼睛、嘴巴、等等。

    特征(CIFeature):CIFeature 代表由 detector处理后产生的特征。 

    3)图像部分:

    画布(CIContext):画布类可被用与处理Quartz 2D 或者   OpenGL。可以用它来关联CoreImage类。如滤镜、颜色等渲染处理。

    上下文类,如CoreGraphics以及CoreData中的上下文用于处理绘制渲染以及处理托管对象一样,CoreImage的上下文也是实现对图像处理的具体对象。

    这里需要注意的是在Context创建的时候,我们需要给它设定为是基于GPU还是CPU。(这里使用GPU)

    基于GPU的话,处理速度更快,因为利用了GPU硬件的并行优势。但是GPU受限于硬件纹理尺寸,而且如果你的程序在后台继续处理和保存图片的话,那么需要使用CPU,因为当app切换到后台状态时GPU处理会被打断。

     

    颜色(CIColor):   图片的关联与画布、图片像素颜色的处理。

    向量(CIVector): 图片的坐标向量等几何方法处理。

    图片(CIImage): 代表一个图像,可代表关联后输出的图像。 

     

     

    查看所有内置滤镜

    -(void)showAllFilters{  

    NSArray *filterNames=[CIFilter filterNamesInCategory:kCICategoryBuiltIn]; 

      for (NSString *filterName in filterNames) {     

      CIFilter *filter=[CIFilter filterWithName:filterName];      

    NSLog(@"\rfilter:%@\rattributes:%@",filterName,[filter attributes]); 

      }}

    调用[CIFilter attributes]会返回filter详细信息,

     

    ***使用Core Image框架创建滤镜效果一般分为以下几步:

     

    1.创建图像上下文CIContext

    //创建基于CPU的图像上下文

    //    NSNumber *number=[NSNumber numberWithBool:YES];

    //    NSDictionary *option=[NSDictionary dictionaryWithObject:number forKey:kCIContextUseSoftwareRenderer];

    //    _context=[CIContext contextWithOptions:option];

    //使用GPU渲染,推荐,但注意GPU的CIContext无法跨应用访问,例如直接在UIImagePickerController的完成方法中调用上下文处理就会自动降级为CPU渲染,所以推荐现在完成方法中保存图像,然后在主程序中调用

    _context=[CIContext contextWithOptions:nil];

    //    EAGLContext *eaglContext=[[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];

    //    _context=[CIContext contextWithEAGLContext:eaglContext];//OpenGL优化过的图像上下文

     

    2.创建滤镜CIFilter

    CIFilter用来表示CoreImage提供的各种滤镜。滤镜使用键-值来设置输入值,一旦这些值设置好,CIFilter就可以用来生成新的CIImage输出图像了。记住,这里的输出的图像不会进行实际的图像渲染,他只包含一个对输入图像的引用以及需要应用与数据上的滤镜链。IOS永远在最佳的时间选择渲染图像。

    1. CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"];   //设置滤镜
    2. [filter setValue:inputImage forKey:@"inputImage"];  //设置从输入的图片
    3. [filter setValue:[NSNumber numberWithFloat:0.8] forKey:@"inputIntensity"];  //设置滤镜参数

    3.创建过滤原图片CIImage

             CIImage是CoreImage框架中最基本代表图像的对象,他不仅包含元图像数据,还包含作用在原图像上的滤镜链。这里我想特别强调的是CIImage和其他图像是不同的,在CIImage被CIContext渲染出来之前,他是依赖于滤镜链的,滤镜是不会更改CIImage中的图像数据。这个需要正确理解,不然会给你的程序造成错误。说到了CIImage的不同,就必须得提一下如何创建CIImage了,CIImage是不能直接有UIImage转化而来的,有以下几种创建CIImage的类方法:

     
     
    1. 1.CIImage*image=[CIImage imageWithContentsOfURL:myURL];  
    2. 2.CIImage*image=[CIImage imageWithData:myData];  
    3. 3.CIImage*image=[CIImage imageWithCGImage:myCgimage];  
    4. 4.CIImage*image=[CIImage imageWithCVPixelBuffer:CVBuffer]

     

    4.调用CIFilter的setValue: forKey:方法为滤镜指定源图片

    5.设置滤镜参数【可选】

    6.取得输出图片显示或保存

    1. CIContext *context = [CIContext context];  
    2.   
    3. // Get outputImage from the last filter in chain  
    4.   CIImage *ciimage = [filter outputImage];  
    5.   
    6. // Render the CIImage into a CGImageRef  
    7.   CGImageRef cgimg = [context createCGImage:ciimage fromRect:[ciimage extent]];  
    8.   
    9. // Create a UIImage from the CGImageRef  
    10. UIImage *uiimage = [UIImage imageWithCGImage:cgimg scale:1.0f  
    11. orientation:ui_orientation([ciimage properties])];  
    12. CGImageRelease(cgimg);  
    13. // Use the UIImage in an UIImageView  
    14. imageView.image = uiimage;  

     

    7.CIDetector和CIFeature

             CIDetector用来分析CIImage,得到CIFeature。每个CIDetector都要用一个探测器来初始化,这个类型高数探测器要在图像中寻找什么特征。

             当一个CIDetector分析一张图片时,返回一个探测到的CIFeature的数组,如果CIDetector 被初始化为寻找面孔,那么返回的数组会被填上CIFaceFeature对象,每个CIFaceFeature都包含一个面部的CGrect引用(按照图像的坐标系),以及检测到的面孔的左眼,右眼,嘴部位置的CGPoint;

     
    1. CIDetector *faceDetector = [CIDetector   
    2.                                     detectorOfType:CIDetectorTypeFace  
    3.                                     context:self.imageContext   
    4.                                     options:options];                
    5. NSArray *faces = [faceDetector featuresInImage:coreImage  
    6.                                                options:nil];  
    7. for(CIFaceFeature *face in faces){  
    8.             coreImage = [CIFilter filterWithName:@"CISourceOverCompositing"  
    9.                                    keysAndValues:kCIInputImageKey, [self makeBoxForFace:face],  
    10.                          kCIInputBackgroundImageKey, coreImage, nil].outputImage;  
    11.         }  
    12.  

    ======================

    大家都知道在美图秀秀中有一个“增强”功能,利用它可以调整照片的饱和度、亮度、对比度,其实在Core Image中也有这样一款滤镜

     

    1.

    //创建基于CPU的图像上下文

    //    NSNumber *number=[NSNumber numberWithBool:YES];

    //    NSDictionary *option=[NSDictionary dictionaryWithObject:number forKey:kCIContextUseSoftwareRenderer];

    //    _context=[CIContext contextWithOptions:option];

    //使用GPU渲染,推荐,但注意GPU的CIContext无法跨应用访问,例如直接在UIImagePickerController的完成方法中调用上下文处理就会自动降级为CPU渲染,所以推荐现在完成方法中保存图像,然后在主程序中调用

    _context=[CIContext contextWithOptions:nil];

    //    EAGLContext *eaglContext=[[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES1];

    //    _context=[CIContext contextWithEAGLContext:eaglContext];//OpenGL优化过的图像上下文

     

    2._colorControlsFilter=[CIFilter filterWithName:@"CIColorControls"];//设置滤镜
    3.[_colorControlsFilter setValue:_image forKey:@"inputImage"];//设置滤镜的输入图片

    4.[_colorControlsFilter setValue:[NSNumber numberWithFloat:slider.value] forKey:@"inputSaturation"];//设置滤镜参数(饱和度)

    [_colorControlsFilter setValue:[NSNumber numberWithFloat:slider.value] forKey:@"inputBrightness"];//设置滤镜参数(明度)

    [_colorControlsFilter setValue:[NSNumber numberWithFloat:slider.value] forKey:@"inputContrast"];//设置滤镜参数(对比度)

    5.

    CIImage *outputImage= [_colorControlsFilter outputImage];//取得输出图像

    CGImageRef temp=[_context createCGImage:outputImage fromRect:[outputImage extent]];

    self.imgView.image=[UIImage imageWithCGImage:temp];//转化为CGImage显示在界面中

    CGImageRelease(temp);//释放CGImage对象

    ===============================

     

    下面是一个简单的棕色滤镜的使用:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    NSURL *url = [NSURL fileURLWithPath:path];
    CIImage *coreImage = [CIImage imageWithContentsOfURL:url];
     
    CIFilter *sepiaFilter = [CIFilter filterWithName:kSepiaFilterName];
    [sepiaFilter setValue:coreImage forKey:kCIInputImageKey];
    [sepiaFilter setValue:@(intensity) forKey:@"inputIntensity"];
     
    CIImage *output = [sepiaFilter outputImage];
     
    CGImageRef cgimg = [_context createCGImage:output fromRect:[output extent]];
     
    UIImage *image = [UIImage imageWithCGImage:cgimg];
     
    CGImageRelease(cgimg);

     

    =============================

    使用中的注意事项:

    1.为了防止阻塞主线程,用GCD异步执行滤镜与渲染操作,在获取渲染后的照片以后,返回主线程进行界面的更新。

    2 不要重复应用滤镜,即使是同一个滤镜也不要应用两次,因为滤镜后输出照片包含滤镜链,在进行照片渲染是会将滤镜链效果叠加到原始数据上,这时会造成问题。比如,有一个CIImage,上面配置了强度为0.5的棕色滤镜,现在通过滑块将强度改为0.6,这个滤镜应该用在新的CIImage上,如果不是新的CIImage上,那么原来的CIImage中将包含强度为0.5和0.6的棕色滤镜,而我们只想0.6的棕色滤镜,这样就造成错误,这一点在编写程序的时候一定要切忌。

    3 app中应用的滤镜太多,改变速率太快,如果是根据滑块来产生事件的话,一定要注意在使用滑条值前要首先判断更改的滤镜当前是否正在起作用,如果该滤镜正在生成新的渲染图片,则应该这次滑块的更新。这一点也是很重要的,弄的不好常常导致程序崩溃,出现内存泄露问题。

    ========================

     

    展开全文
  • 计算机视觉和图像处理框架

    千次阅读 2016-09-02 10:13:43
    计算机视觉和图像处理框架一、概述图像处理即传感器将图像信号转换为数字信号,再利用计算机对其进行加工处理的过程。其涉及到的方法主要有图像变换、图像编码、图像去噪、图像增强、图像恢复、图像分割、特征提取、...

    计算机视觉和图像处理框架


    一、概述

    图像处理即传感器将图像信号转换为数字信号,再利用计算机对其进行加工处理的过程。其涉及到的方法主要有图像变换、图像编码、图像去噪、图像增强、图像恢复、图像分割、特征提取、图像识别等。
    计算机视觉是一门研究如何让机器(计算机)像人一样看并理解周围世界的学科,其基本理论和研究方法,旨在从图像或者其他数据中获得相关信息。
    从直观的角度看,我们可以说计算机视觉处理视频,图像处理处理图像,而视频由图像构成,当然这个说法只能用作理解,不够严谨。二者更科学的区别是计算机视觉重点研究映射到单幅图像或者多幅图像上的三维场景,如三维重建就是计算机视觉研究的内容;图像处理主要研究一个二维的数字图像,主要针对的是像素级的操作,例如提高对比度、边缘提取、几何变换等。
    计算机视觉和图像处理有很大的交叉,之前我也会把机器学习和模式识别也加入到交叉部分,现在我倒觉得,把这两门学科总结为像数学和英语那样为基础服务更合适。

    二、计算机视觉基本流程

    一个信息处理系统,总对应着一个或多个Input和Output,计算机视觉系统也不例外,输入为从三维世界中采集到的数据,输出为系统对信息的理解。无外乎就以下几个部分:
    1、数据采集(输入)
    2、预处理: 去噪、增强
    3、特征提取;
    4、检测/跟踪/分割;
    5、高级操作(分类、识别等)(输出)
    关于图像检测与识别的区分:
    目标检测:首先我们已经知道目标是什么,然后去图像中定位它的位置。(人脸检测、行人检测、车辆检测等)
    图像识别:简单的说,是图像再认,从成千上万张图像中找到认识的那一张,犹如我们在大街上遇到一个一个人,然后就会去搜索我们见过的所有人,‘哦!我见过他’,如果再加上‘哦!我见他趟在天安门的水晶棺里!’,那么就等于识别系统识别到了一个图像的id和路径,这就是图像识别的过程,(对于一个从来没有出现过的目标,计算机是无法进行再认的,人也不行)。其处理过程主要包括:图像输入、预处理、特征提取、特征分类、匹配。
    计算机视觉中的识别:是计算机视觉系统处理的高级过程,从再认的角度上讲,它们是一样的,然而出发点和‘识别’过程是不同的两个方面,计算机视觉中的识别重点在某一个领域内,比如行人行为识别(拥抱、指路、打架、偷车等),那么这个系统我们研究的就是人,车辆行为识别(是否酒驾、是否超速等),那就是一个交通监控系统,我们需要定义一个行为:什么是拥抱(偷车)或者什么是酒驾;而图像识别旨在从某一个库中去‘匹配’一个相同或者相似的图像(当然匹配的是特征)。

    三、基本图像处理与分析

    基于计算机视觉系统的整条主线,总结一下现有的一些理论和方法。
    图像采集:(摄像机标定和矫正)
    预处理:(去噪、增强、金字塔等)
    特征提取:(BRIEF、颜色和直方图特征、FAST特征、Harris特征、HOG、SIFT、SURF等)
    检测:(背景建模、特征+分类器(SVM、Adaboost、Random forest)、显著性监测等)
    跟踪:(Mean-shift、TLD、粒子滤波、卡尔曼)
    高级操作:(BOW)
    上述主要介绍了整个系统中常用到的一些方法和理论,当然计算机视觉和图像处理的内容远不止这些,下面列一些主要的领域,然后再补充一点模式识别的内容:
    人脸检测、人脸识别、目标检测和跟踪、OCR、阴影检测、场景理解、SLAM、视频监控等。

    四、为我所用

    最后主要总结一下能够为计算机视觉使用的一些理论和方法。
    机器学习:用摄像机模拟人眼,cpu模拟人脑,对于‘白痴’cpu,告诉它学习的方法也就显得自然了。
    模式识别:理论极强的一门学科,和ML、CV相辅相成,基于神经网络的DL大红大紫
    Boosting、clustering、CS(Compressive Sensing)、DT(Decision Trees)、DP(Dynamical Programimg)、EM、GM(Graphical Model)、HMM、ICA、PCA、RF(random forest)、RANSAC、SVD(Singular Value Decomposition)、稀疏表示、SVM、小波、NN
    英语:谁让我们落后于人家呢,师夷长技以制夷
    数学:一切美好的基石,数学分析、概率、统计、矩阵、最优化等
    计算机基础理论和方法:可能像组成原理、体系结构、操作系统、编译原理对算法研究帮助不大,不过数据结构和基本算法的作用却是相当大的,如果是做工程,前面的基础知识就显得很重要了。
    产品:为什么提到产品,因为工业不等于研究,要想自己喜欢的学科真正能够服务于大众,理论和实际必须要结合起来。

    展开全文
  • 摘要:本文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习。虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到Objective-C和...

    allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-02-13%2F2823961-core-image&type=3&count=&appkey=&title=%E6%9C%AC%E6%96%87%E7%BB%93%E5%90%88%E5%AE%9E%E4%BE%8B%E8%AF%A6%E8%A7%A3%E4%BA%86OS%20X%E5%92%8CiOS%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E6%A1%86%E6%9E%B6Core%20Image%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87Core%20Image%E6%9D%A5%E5%88%9B%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8iOS%E7%9A%84%E5%86%85%E7%BD%AE%E6%BB%A4%E9%95%9C%EF%BC%8C%E9%9D%9E%E5%B8%B8%E9%80%82%E5%90%88%E5%88%9D%E5%AD%A6%E8%80%85%E5%AD%A6%E4%B9%A0%E3%80%82%E8%99%BD%E7%84%B6%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81%E6%98%AF%E7%94%A8Swift%E5%86%99%E7%9A%84iOS%E7%A8%8B%E5%BA%8F%EF%BC%8C%E4%B8%8D%E8%BF%87%E5%AE%9E%E7%8E%B0%E6%A6%82%E5%BF%B5%E5%BE%88%E5%AE%B9%E6%98%93%E8%BD%AC%E6%8D%A2%E5%88%B0Objective-C%E5%92%8COS%20X%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1455938779863" width="22" height="16">摘要:本文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习。虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到Objective-C和OS X。

    这篇文章会为初学者介绍一下Core Image,一个OS X和iOS的图像处理框架。

    如果你想跟着本文中的代码学习,你可以在GitHub上下载示例工程。示例工程是一个iOS应用程序,列出了系统提供的大量图像滤镜以供选择,并提供了一个用户界面用来调整参数并观察效果。

    虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到Objective-C和OS X。

    基本概念

    说到Core Image,我们首先需要介绍几个基本的概念。

    一个滤镜是一个对象,有很多输入和输出,并执行一些变换。例如,模糊滤镜可能需要输入图像和一个模糊半径来产生适当的模糊后的输出图像。

    一个滤镜图表是一个链接在一起的滤镜网络(无回路有向图),使得一个滤镜的输出可以是另一个滤镜的输入。以这种方式,可以实现精心制作的效果。我们将在下面看到如何连接滤镜来创建一个复古的拍照效果。

    熟悉Core Image API

    有了上述的这些概念,我们可以开始探索Core Image的图像滤镜细节了。

    Core Image架构

    Core Image有一个插件架构,这意味着它允许用户编写自定义的滤镜并与系统提供的滤镜集成来扩展其功能。我们在这篇文章中不会用到Core Image的可扩展性;我提到它只是因为它影响到了框架的API。

    Core Image 是用来最大化利用其所运行之上的硬件的。每个滤镜实际上的实现,即内核,是由一个GLSL(即OpenGL的着色语言)的子集来书写的。当多个滤镜连接成一个滤镜图表,Core Image便把内核串在一起来构建一个可在GPU上运行的高效程序。

    只要有可能,Core Image都会把工作延迟。通常情况下,直到滤镜图表的最后一个滤镜的输出被请求之前都不会发生分配或处理。

    为了完成工作,Core Image需要一个称为上下文(context)的对象。这个上下文是框架真正工作的地方,它需要分配必要的内存,并编译和运行滤镜内核来执行图像处理。建立一个上下文是非常昂贵的,所以你会经常想创建一个反复使用的上下文。接下来我们将看到如何创建一个上下文。

    查询可用的滤镜

    Core Image滤镜是按名字创建的。要获得系统滤镜的列表,我们要向Core Image的kCICategoryBuiltIn类别请求得到滤镜的名字:

    1. let filterNames = CIFilter.filterNamesInCategory(kCICategoryBuiltIn) as [String]  

    iOS上可用的滤镜列表非常接近于OS X上可用滤镜的一个子集。在OS X上有169个内置滤镜,在iOS上有127个。

    通过名字创建一个滤镜

    现在,我们有了可用滤镜的列表,我们就可以创建和使用滤镜了。例如,要创建一个高斯模糊滤镜,我们传给CIFilter初始化方法相应的名称就可以了:

    1. let blurFilter = CIFilter(named:"CIGaussianBlur")   

    设置滤镜参数

    由于Core Image的插件结构,大多数滤镜属性并不是直接设置的,而是通过键值编码(KVC)设置。例如,要设置模糊滤镜的模糊半径,我们使用KVC来设置inputRadius属性:

    1. blurFilter.setValue(10.0 forKey:"inputRadius")  

    由于这种方法需要AnyObject? (即Objective-C里的id)作为其参数值,它不是类型安全的。因此,设置滤镜参数需要谨慎一些,确保你传值的类型是正确的。

    查询滤镜属性

    为了知道一个滤镜提供什么样的输入和输出参数,我们就可以分别获取inputKeys和outputKeys数组。它们都返回NSString的数组。

    要获取每个参数的详细信息,我们可以看看由滤镜提供的attributes字典。每个输入和输出参数名映射到它自己的字典里,描述了它是什么样的参数,如果有的话还会给出它的最大值和最小值。例如,下面是 CIColorControls滤镜对应的inputBrightness参数字典:

    1. inputBrightness = {    
    2.     CIAttributeClass = NSNumber;  
    3.     CIAttributeDefault = 0;  
    4.     CIAttributeIdentity = 0;  
    5.     CIAttributeMin = -1;  
    6.     CIAttributeSliderMax = 1;  
    7.     CIAttributeSliderMin = -1;  
    8.     CIAttributeType = CIAttributeTypeScalar;  
    9. };  

    对于数值参数,该字典会包含 kCIAttributeSliderMin 和 kCIAttributeSliderMax 键,来限制期望的输入域。大多数参数还包含一个 kCIAttributeDefault 关键字,映射到该参数的默认值。

    图片滤镜实战

    图像滤镜的工作由三部分组成:构建和配置滤镜图表,发送等待滤镜处理的图像,得到滤镜处理后的图像。下面的部分对此进行了详细描述。

    构建一个滤镜图表

    构建一个滤镜图表由这几个部分组成:实例化我们需要的滤镜,设置它们的参数,把它们连接起来以便该图像数据按顺序传过每个滤镜。

    在本节中,我们将创建一个用来制作 19 世纪锡版照风格图像的滤镜图表。我们将两个效果链在一起来达到这种效果:同时去饱和以及染色调的黑白滤镜,和一个暗角滤镜来创建一个有阴影效果的加框图片。

    用Quartz Composer,来做Core Image滤镜图表的原型非常有用,可以从苹果开发者网站下载。下面,我们整理了所需的照片滤镜,把黑白滤镜和暗角滤镜串在一起:


    一旦达到了我们满意的效果,我们可以重新在代码里创建滤镜图表:

    1. let sepiaColor = CIColor(red: 0.76, green: 0.65, blue: 0.54)    
    2. let monochromeFilter = CIFilter(name: "CIColorMonochrome",    
    3.     withInputParameters: ["inputColor" : sepiaColor, "inputIntensity" : 1.0])  
    4. monochromeFilter.setValue(inputImage, forKey: "inputImage")  
    5. let vignetteFilter = CIFilter(name: "CIVignette",    
    6.     withInputParameters: ["inputRadius" : 1.75, "inputIntensity" : 1.0])  
    7. vignetteFilter.setValue(monochromeFilter.outputImage, forKey: "inputImage")  
    8. let outputImage = vignetteFilter.outputImage  

    需要注意的是黑白滤镜的输出图像变为暗角滤镜的输入图像。这将导致暗角效果要应用到黑白图像上。还要注意的是,我们可以在初始化中指定参数,而不一定需要用KVC单独设置它们。

    创建输入图像

    Core Image滤镜要求其输入图像是CIImage类型。而对于iOS的程序员来说这可能会有一点不寻常,因为他们更习惯用UIImage,但这个区别是值得的。一个CIImage实例实际上比UIImage更全面,因为CIImage可以无限大。当然,我们不能存储无限的图像在内存中,但在概念上,这意味着你可以从2D平面上的任意区域获取图像数据,并得到一个有意义的结果。

    所有我们在本文中使用的图像都是有限的,而且也可以很容易从一个UIImage来创建一个CIImage。事实上,这只需要一行代码:

    1. let inputImage = CIImage(image: uiImage)  

    也有很方便的初始化方法直接从图像数据或文件URL来创建CIImage。

    一旦我们有了一个CIImage,我们就可以通过设置滤镜的inputImage参数来将其设置为滤镜的输入图像:

    1. filter.setValue(inputImage, forKey:"inputImage")  

    得到一个滤镜处理后的图片

    滤镜都有一个名为outputImage的属性。正如你可能已经猜到的一样,它是 CIImage 类型的。那么,我们如何实现从一个CIImage创建UIImage这样一个反向操作?好了,虽然我们到此已经花了所有的时间建立一个滤镜图表,现在是调用CIContext的力量来实际的做图像滤镜处理工作的时候了。

    创建一个上下文最简单的方法是给它的构造方法传一个nil字典:

    1. let ciContext = CIContext(options: nil)  

    为了得到一个滤镜处理过的图像,我们需要CIContext从输出图像的一个矩形内创建一个CGImage,传入输入图像的范围(bounds):

    1. let cgImage = ciContext.createCGImage(filter.outputImage, fromRect: inputImage.extent())  

    我们使用输入图像大小的原因是,输出图像通常和输入图像具有不同的尺寸比。例如,一个模糊图像由于采样超出了输入图像的边缘,围绕在其边界外还会有一些额外的像素。

    现在,我们可以从这个新创建的CGImage来创建一个UIImage了:

    1. let uiImage = UIImage(CGImage: cgImage)  

    直接从一个CIImage创建UIImage也是可以的,但这种方法有点让人郁闷:如果你试图在一个UIImageView上显示这样的图像,其contentMode属性将被忽略。使用过渡的CGImage则需要一个额外的步骤,但可以省去这一烦恼。

    用OpenGL来提高性能

    用CPU来绘制一个CGImage是非常耗时和浪费的,它只将结果回传给UIKit来做合成。我们更希望能够在屏幕上绘制应用滤镜后的图像,而不必去Core Graphics里绕一圈。幸运的是,由于OpenGL和Core Image的可互操作性,我们可以这么做。

    要OpenGL上下文和Core Image上下文之间共享资源,我们需要用一个稍微不同的方式来创建我们的 CIContext:

    1. let eaglContext = EAGLContext(API: .OpenGLES2)    
    2. let ciContext = CIContext(EAGLContext: context)  

    在这里,我们用OpenGL ES 2.0的功能集创建了一个EAGLContext。这个GL上下文可以用作一个GLKView的背衬上下文或用来绘制成一个CAEAGLLayer。示例代码使用这种技术来有效地绘制图像。

    当一个CIContext具有了关联GL的上下文,滤镜处理后的图像就可用OpenGL来绘制,像如下这样调用方法:

    1. ciContext.drawImage(filter.outputImage, inRect: outputBounds, fromRect: inputBounds)  

    与以前一样,fromRect 参数是用滤镜处理后的图像的坐标空间来绘制的图像的一部分。这个inRect 参数是GL上下文的坐标空间的矩形应用到需要绘制图像上。如果你想保持图像的长宽比,你可能需要做一些数学计算来得到适当的inRect。

    强制在CPU上做滤镜操作

    只要有可能,Core Image将在GPU上执行滤镜操作。然而,它确实有回滚到CPU上执行的可能。滤镜操作在CPU上完成可具有更好的精确度,因为GPU经常在浮点计算上以失真换得更快的速度。在创建一个上下文时,你可以通过设置kCIContextUseSoftwareRenderer关键字的值为true来强制Core Image在CPU上运行。

    你可以通过在Xcode中设置计划配置(scheme configuration)里的CI_PRINT_TREE环境变量为1来决定用CPU  还是GPU来渲染。这将导致每次一个滤镜处理图像被渲染的时候Core Image都会打印诊断信息。此设置用来检查合成图像滤镜树也很有用。

    示例应用一览

    本文的示例代码是一个iPhone应用程序,展示了iOS里大量的各式Core Image图像滤镜。

    为滤镜参数创建一个GUI

    为了尽可能多的演示各种滤镜,示例应用程序利用了Core Image的内省特点生成了一个界面,用于控制它支持的滤镜参数:


    示例应用程序只限于单一的图像输入以及零个或多个数值输入的滤镜。也有一些有趣的滤镜不属于这一类(特别是那些合成和转换滤镜)。即便如此,该应用程序仍然很好的概述了Core Image支持的功能。

    对于每个滤镜的输入参数,都有一个滑动条可以用于配置参数的最小值和最大值,其值被设置为默认值。当滑动条的值发生变化时,它把改变后的值传给它的 delegate,一个持有CIFilter引用的 UIImageView子类。

    使用内建的照片滤镜

    除了许多其他的内置滤镜,示例应用程序还展示了iOS 7中引入的照片滤镜。这些滤镜没有我们可以调整的参数,但它们值得被囊括进来,因为它们展示了如何在iOS中模拟照片应用程序的效果:


    结论

    这篇文章简要介绍了Core Image这个高性能的图像处理框架。我们一直在试图在如此简短的形式内尽可能多的展示这个框架的功能。你现在已经学会了如何实例化和串联Core Image的滤镜,在滤镜图表传入和输出图像,以及调整参数来获得想要的结果。你还学习了如何访问系统提供的照片滤镜,用以模拟在iOS上的照片应用程序的行为。

    现在你知道了足够多的东西来写你自己的照片编辑应用程序了。随着更多的一些探索,你就可以写自己的滤镜了,利用你的Mac或iPhone的神奇的力量来执行以前无法想象的效果。快去动手做吧!

    参考

    展开全文
  • 网上看到,摘录过来的,暂时还没... Marvin 是一个Java开发的可扩展的图像处理框架,该框架主要提供以下几方面的功能:  基本图像操作;  从视频中捕获帧;  多线程的图像处理;  通过GUI界面集成插件;  插...
  • C++编写的FMC图像处理框架,这个框架很好好,编写的图像处理算法都可以加进去。编译成功。
  • ImagePy 是一款 python 开源图像处理框架,其 UI 界面支持开放插件。在 github:https://github.com/Image-Py/imagepy上,不仅有关于这款图像处理软件的详细介绍,还有一些使用示例,雷锋网 AI 科技评论接下来将详细...
  • 这篇文章会为初学者介绍一下 Core Image,一个 OS X 和 iOS 的图像处理框架。 如果你想跟着本文中的代码学习,你可以在 GitHub 上下载示例工程。示例工程是一个 iOS 应用程序,列出了系统提供的大量图像滤镜以供...
  • Java对图像的处理框架比较少,目前比较流行的有Jmagick以及Marvin,但Jmagick只能处理图像(上篇Java清除图片中的...Marvin 是一个Java开发的可扩展的图像处理框架,该框架主要提供以下几方面的功能: 基本图像操...
  • Imagepy图像处理框架中neighbors函数的探索之旅 https://github.com/Image-Py 一、探索函数 1.1 neighbors函数 1.2 结果早知 defneighbors(shape): 以下讲解以二维为例,假设dhspe=3,5 dim=len(shape) ...
  • 背景:梯度域的图像处理在这个专栏的前面几次文章里面,我给大家介绍了空域的图像处理,还介绍了频域的图像处理。我们可以看到在空域中有时不好解决的问题,或者解决起来比较慢的问题,转换到一个新的表达方式,...
  • 详解OS X和iOS图像处理框架Core Image 摘要:本文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习。虽然示例代码是用Swift写...
  • Java开源图像处理框架Marvin介绍

    千次阅读 2010-07-09 10:45:00
    Marvin 是一个Java开发的可扩展的图像处理框架,该框架主要提供以下几方面的功能:基本图像操作;从视频中捕获帧;多线程的图像处理;通过GUI界面集成插件;插件性能分析;通过插件进行功能扩展。授权协议: GPL开发...
  • 数字图像处理框架及常用技术

    千次阅读 2017-12-29 14:49:39
    数字图像处理框架大体分为如下8个部分   1. 图像变换 原理:有时候,直接对图像进行处理会遇到一些困难,为了有效和快速地对图像进行处理和分析,需要将原定义在图像空间的图像以某种形式转换到另外的空间,利用...
  • javascript图像处理框架

    千次阅读 2015-03-04 10:29:46
    canvas图像处理 canvas 绘图区域 var canvas1 = document.getElementById("canvas1"); var context1 = canvas1.getContext('2d'); image = new Image(); image.src = "z
  • 图像处理框架Core Image

    2015-09-28 17:19:05
    CoreImage是iOS5中新加入的一个Objective-C的框架,提供了强大高效的图像处理功能,用来对基于像素的图像进行操作与分析。iOS提供了很多强大的滤镜(Filter),其中iOS5中有48种,而到了最新的iOS6 Filter已经增加到了...
  • Android与OpenCV2.4.4(2013最新)搭建图像处理框架 分类: 【android】 Android与OpenCV2.4.4(2013最新)搭建图像处理平台注意事项 一.环境搭建 详细可以参考官方提供的文档:官方介绍 1.首先是Android...
  • 数字图像处理框架大体分为如下8个部分   1. 图像变换 有时候,直接对图像进行处理会遇到一些困难,为了有效和快速地对图像进行处理和分析,需要将原定义在图像空间的图像以某种形式转换到另外的空间,利用...
  • 本科毕设时,为了进行演示曾按照网上的方法搭建了一个基于MFC多文档视图界面(MDI)的图像处理框架程序。但是由于对于windows编程的原理不甚了解,过程中遇到了很多细节上的问题,因此整理一下整个过程,便于以后...
  • GPUImage是一个非常棒的图像处理的开源库,里面提供了非常非常多的滤镜效果来加工图像。 不过就是因为太多效果了,而且对于程序员来说,那么多效果并不清楚知道要用那一个。于是我就使用提供的默认值,加上对滤镜的...
  • Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。 open类 Image.open(file) ⇒ image Image.open(file, mode) ⇒ image ...
  • 在这个界面最上面的地方,显示的是当前图像处理的状态。(一般来说,是成功/不成功,或者是存在什么问题)。 固然采用文章显示状态的方法比较简陋,但是也是能够达到提示用户正确拍摄的目的的;另一个方面,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,603
精华内容 1,441
关键字:

图像处理框架