SlideShare a Scribd company logo
Core Image	

The Most Fun API	

You’re Not Using
Chris Adamson • @invalidname	

CocoaConf Columbus, August 2014
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
“Core Image is an image processing and analysis
technology designed to provide near real-time
processing for still and video images.”
Agenda
• Images, Filters, and Contexts	

• The Core Image Filter Gallery	

• Neat Tricks with Built-In Filters	

• Core Image on OS X
Core Image, Core Concepts
• Core Image is
of the time	

• A chain of filters describes a “recipe” of processing
steps to be applied to one or more images	

• “Stringly typed”	

• You only get pixels when you render
Typical Workflow
• Start with a source CIImage	

• Apply one or more filters	

• Render resulting CIImage to a CIContext, or
convert CIImage out to another type	

• A few filters take or produce types other than
CIImage (CIQRCodeGenerator)
CIImage
• An image provided to or produced by Core Image	

• But no bitmap of pixel data!	

• Immutable	

• -imageByCroppingToRect,
-imageByApplyingTransform	

• -extent — a CGRect of the image’s size
CIImage sources
• NSURL	

• CGImageRef	

• Bitmap or JPEG/PNG/TIFF in NSData	

• OpenGL texture	

• Core Video image/pixel buffer
CIContext
• Rendering destination for a CIImage (-
[drawImage:inRect:fromRect:])	

• This is where you get pixels (also, this is the processor-
intenstive part)	

• On iOS, must be created from an EAGLContext. On
Mac, can be created with CGContextRef	

• Can also produce output as a CGImageRef, bitmap data,
or a CVPixelBuffer (iOS only)
????
CIFilter
• Performs an image processing operation	

• Typically takes and produces a CIImage	

• All parameters are provided via -[setValue:forKey:]	

• Stringly-typed!	

• Output is retrieved with -[valueForKey:]
–Core Image Cat
“I can has filterz?
Yes, you can has Filterz!
Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)
Core Image Filter Reference
Filter Name
Parameters
Note the type & number to
provide
Categories
Watch for CICategoryBuiltIn
and CICategoryVideo
Example Figure
Availability
Watch for versioning and
OS X-only filters
Filter Categories
• Group filters by functionality: CICategoryBlur,
CICategoryGenerator,
CICategoryCompositeOperation, etc.	

• Also group filters by availability and
appropriateness: CICategoryBuiltIn,
CICategoryVideo, CICategoryNonSquarePixels
CICategoryGenerator
• No input image, just produces an output	

• CICategoryGradient is also output-only	

• Example: CICheckerboardGenerator
CICategoryBlur
• Algorithmically spreads/blends pixels	

• CICategorySharpen offers an opposite effect	

• Example: CIGaussianBlur
CICategoryColorAdjustement
• Changes distribution of color throughout an image	

• Example: CIColorControls (adjusts saturation,
brightness, contrast)
CICategoryColorEffect
• Color changes that affect the subjective nature of
the image	

• Example: CIPhotoEffectNoir
CICategoryDistortionEffect
• Moves pixels to achieve an effect	

• Example: CITorusLensDistortion
CICategoryStylize
• Various stylistic effects	

• Example: CIPointillize
CICategoryGeometryAdjustment
• Moves pixels via cropping, affine transforms, etc.	

• Example: CICrop
CICategoryTileEffect
• Repeatedly copies all or part of an image	

• Example: CIAffineTile
CICategoryCompositeOperation
• Combines multiple images	

• Example: CISourceOverCompositing
Demo
Creating CIColorControls Filter
_colorControlsFilter
Setting input values
[self
! ! ! ! ! ! ! ! ! ! ! !
[self
! ! ! ! ! ! ! ! ! ! ! !
[self
! ! ! ! ! ! ! ! ! ! ! !
Setting input image
CIImage
! ! ! ! ! ! ! ! ! !
[self
! ! ! ! ! ! ! !
Getting output image
ciImage = [
UIImage
self
Other output options
• Use a CIContext	

• -[drawImage:inRect:fromRect:] draws pixels to
the EAGLContext (iOS) or CGContextRef (OS
X) that the CIContext was created from.	

• CIContext can also render to a void* bitmap	

• On iOS, can create a CVPixelBufferRef, typically
used for writing to a file with AVAssetWriter
Chaining filters
• Use the output of one filter as the input to the next	

• This doesn’t cost anything, because the CIImages
just hold state, not pixels
Demo
Creating CIContext
if (!
! !
! ! ! ! ! !
! !
}!
! ! !
// make CIContext from GL context, clearing out default color space
self
! ! ! ! ! ! ! ! ! ! ! ! !
! ! ! !
! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
!
Note: This is in a subclass of GLKView
Set up Sepia Tone filter
_sepiaToneFilter
[_sepiaToneFilter
! ! ! ! ! ! ! ! !
Set up Mask to Alpha filter
UIImage
_circleMaskFilter
CIImage
! ! ! ! ! ! ! ! ! ! ! ! circleImageUI.
[_circleMaskFilter
! ! ! ! ! ! !
_circleMask
circle-mask-100x100.png
Set up Blend with Mask filter
_constantColorGeneratorFilter
! ! ! ! ! ! ! ! ! !
[_constantColorGeneratorFilter
! ! ! [
! ! ! ! ! ! ! ! ! ! ! ! ! !
forKey
_backgroundAlphaFill
! ! ! ! ! ! ! ! ! ! !
!
_blendWithMaskFilter
[_blendWithMaskFilter
! ! ! ! ! ! ! !
[_blendWithMaskFilter
! ! ! ! ! ! ! !
Apply filters
// Get CIImage from source image
CGImageRef
! ! ! ! ! ! ! !
loupeImage = [
!
// Apply sepia filter
[self
loupeImage = [
!
// Set sepia-filtered image as input to blend-with-mask
[_blendWithMaskFilter
! ! ! ! ! !
loupeImage = [
Render in CIContext
if ([
! [
}!
! !
[self
!
// GL-on-Retina fix
CGRect
drawBoundsInPoints.
drawBoundsInPoints.
! !
// drawing to CIContext draws to the EAGLESContext it's based on
[self
! ! ! ! !! ! !
! ! ! ! ! ! ! !
!
// Refresh GLKView contents immediately
[self
Working with Video
• AVFoundation AVCaptureVideoDataOutput and
AVAssetReader deliver CMSampleBuffers	

• CMSampleBuffers have timing information and
CVImageBuffers/CVPixelBuffers	

• +[CIImage imageWithCVPixelBuffer:]
Demo
Chroma Key (“green screen”
recipe
• Use a CIColorCube to map green-ish colors to
transparent	

• Use CISourceOverCompositing to draw this
alpha’ed image over another image
CIColorCube
Maps colors from one RGB “cube” to another
http://en.wikipedia.org/wiki/RGB_color_space
Using CIColorCube
CIColorCube maps green(-ish) colors to 0.0 alpha, all
other colors pass through
CISourceOverCompositing
inputBackgroundImage inputImage
outputImage
CIColorCube Dataconst unsigned int size = 64;!
size_t cubeDataSize = size * size * size * sizeof (float) * 4;!
float *keyCubeData = (float *)malloc (cubeDataSize);!
//! float *alphaMatteCubeData = (float *)malloc (cubeDataSize);!
//! float rgb[3], hsv[3], *keyC = keyCubeData, *alphaC = alphaMatteCubeData;!
float rgb[3], hsv[3], *keyC = keyCubeData;!
// Populate cube with a simple gradient going from 0 to 1!
for (int z = 0; z < size; z++){!
! rgb[2] = ((double)z)/(size-1); // Blue value!
! for (int y = 0; y < size; y++){!
! ! rgb[1] = ((double)y)/(size-1); // Green value!
! ! for (int x = 0; x < size; x ++){!
! ! ! rgb[0] = ((double)x)/(size-1); // Red value!
!
! ! ! // Convert RGB to HSV!
! ! ! // You can find publicly available rgbToHSV functions on the Internet!
!
! ! ! RGBtoHSV(rgb[0], rgb[1], rgb[2],!
! ! ! ! ! &hsv[0], &hsv[1], &hsv[2]);!
!
! ! ! // RGBtoHSV uses 0 to 360 for hue, while UIColor (used above) uses 0 to 1.!
! ! ! hsv[0] /= 360.0;!
! ! ! !
! ! ! // Use the hue value to determine which to make transparent!
! ! ! // The minimum and maximum hue angle depends on!
! ! ! // the color you want to remove!
! ! ! !
! ! ! bool keyed = (hsv[0] > minHueAngle && hsv[0] < maxHueAngle) &&!
! ! ! (hsv[1] > minSaturation && hsv[1] < maxSaturation) &&!
! ! ! (hsv[2] > minBrightness && hsv[2] < maxBrightness);!
! ! ! !
! ! ! float alpha = keyed ? 0.0f : 1.0f;!
! ! ! !
! ! ! // re-calculate c pointer!
! ! ! keyC = (((z * size * size) + (y * size) + x) * sizeof(float)) + keyCubeData;!
! ! ! !
! ! ! // Calculate premultiplied alpha values for the cube!
! ! ! keyC[0] = rgb[0] * alpha;!
! ! ! keyC[1] = rgb[1] * alpha;!
! ! ! keyC[2] = rgb[2] * alpha;!
! ! ! keyC[3] = alpha;!
! ! ! ! ! ! ! !
! ! }!
! }!
}!
See “Chroma Key Filter Recipe” in Core Image Programming Guide
Create CIColorCube from
mapping data
// build the color cube filter and set its data to above!
self.colorCubeFilter = [CIFilter filterWithName:@"CIColorCube"];!
[self.colorCubeFilter setValue:[NSNumber numberWithInt:size]!
! !! ! ! ! ! ! ! ! forKey:@"inputCubeDimension"];!
NSData *data = [NSData dataWithBytesNoCopy:keyCubeData!
! !! ! ! ! ! ! ! length:cubeDataSize!
! !! ! ! ! ! freeWhenDone:YES];!
[self.colorCubeFilter setValue:data forKey:@"inputCubeData"];!
Create CISourceOverCompositing
// source over filter!
self.backgroundImage = [UIImage imageNamed:!
! !! ! ! ! ! ! ! ! ! @"img_washington_small_02.jpg"]; !
self.backgroundCIImage = [CIImage imageWithCGImage:!
! !! ! ! ! ! ! ! ! ! ! self.backgroundImage.CGImage];!
self.sourceOverFilter = [CIFilter filterWithName:!
! !! ! ! ! ! ! ! ! ! @"CISourceOverCompositing"];!
[self.sourceOverFilter setValue:self.backgroundCIImage !
! !! ! ! ! ! ! ! forKeyPath:@"inputBackgroundImage"];!
Apply Filters in Capture Callback
CIImage *bufferCIImage = [CIImage imageWithCVPixelBuffer:cvBuffer];!
!
[self.colorCubeFilter setValue:bufferCIImage !
! !! ! ! ! ! ! ! ! ! forKey:kCIInputImageKey];!
CIImage *keyedCameraImage = [self.colorCubeFilter valueForKey:!
! !! ! ! ! ! ! ! ! ! ! ! kCIOutputImageKey];!
!
[self.sourceOverFilter setValue:keyedCameraImage !
! !! ! ! ! ! ! ! ! forKeyPath:kCIInputImageKey];!
!
CIImage *compositedImage = [self.sourceOverFilter valueForKeyPath:!
! !! ! ! ! ! ! ! ! ! ! kCIOutputImageKey];
Then draw compositedImage to CIContext as before
Other Points of Interest
• CIQRCodeGenerator filter — Converts data (e.g., a string) to
a QR Code	

• CILenticularHaloGenerator filter — aka, lens flare	

• CIDetector — Class (not a filter) to find features in images.
Currently only supports face finding (returned as an array of
CIFeatures). Optionally detects smiles and eye blinks within
faces.	

• CIImage has a red-eye enhancement that takes the array of
face CIFeatures to tell it where to apply the effect
Core Image on OS X
• Core Image is part of QuartzCore (or Image Kit), so
you don’t @import CoreImage	

• Many more filters are available	

• Can create your own filter with OpenGL Shading
Language (plus some CI extensions). See CIKernel.	

• Also available in iOS 8	

• Filters can be set on CALayers
CALayer Filters on OS X
• Views must be layer-backed (obviously)	

• Must also call -[NSView
setLayerUsesCoreImageFilters:] on 10.9+	

• CALayer has properties: filters, compositingFilter,
backgroundFilters, minificationFilter,
magnificationFilter	

• These exist on iOS, but do nothing
Demo
Adding CIPixellate to layer’s
filters
self
! !! ! ! ! ! ! ! !
self
[self
! !! ! ! ! ! [
! !! ! ! ! ! ! ! !
!
[self
! !! ! !
! !! ! ! ! ! ! ! ! !
self
! !! ! !
Updating a layer’s filters
-(void
! [
! !! ! ! !
! !! ! ! ! ! ! ! ! ! !
! !! ! ! !
}
Wrap Up: Stuff to Remember
• Get psyched about filters, but remember to check
that they’re on your targeted platform/version.	

• Drawing to a CIContext on iOS must be GL-
backed (e.g., with a GLKView)
Q&A
Slides and code will be posted to:	

http://www.slideshare.net/invalidname/
!
@invalidname	

http://subfurther.com/blog

More Related Content

PDF
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
PDF
What's a Core Image? An Image-Processing Framework on iOS and OS X
PDF
Stupid Video Tricks, CocoaConf Seattle 2014
PDF
Image and Video Processing Using Adobe Image Foundation's Toolkit For Flash -...
PDF
Pixel Bender - 2011 AMD Fusion Conference
PDF
The (near) future of personal computers
PDF
Stupid Video Tricks, CocoaConf Las Vegas
PDF
Stupid Video Tricks (CocoaConf DC, March 2014)
Core Image: The Most Fun API You're Not Using, CocoaConf Atlanta, December 2014
What's a Core Image? An Image-Processing Framework on iOS and OS X
Stupid Video Tricks, CocoaConf Seattle 2014
Image and Video Processing Using Adobe Image Foundation's Toolkit For Flash -...
Pixel Bender - 2011 AMD Fusion Conference
The (near) future of personal computers
Stupid Video Tricks, CocoaConf Las Vegas
Stupid Video Tricks (CocoaConf DC, March 2014)

Viewers also liked (16)

PDF
Advanced Imaging on iOS
PDF
Get On The Audiobus (CocoaConf Atlanta, November 2013)
PDF
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)
PDF
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
PDF
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
PDF
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...
PDF
Get On The Audiobus (CocoaConf Boston, October 2013)
PDF
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
PDF
Introduction to the Roku SDK
PDF
Firebase: Totally Not Parse All Over Again (Unless It Is)
PDF
Gpu Programming With GPUImage and Metal
PDF
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
PDF
Stupid Video Tricks
PDF
Forward Swift 2017: Media Frameworks and Swift: This Is Fine
PPS
Image Processing Basics
PPT
Introduction to digital image processing
Advanced Imaging on iOS
Get On The Audiobus (CocoaConf Atlanta, November 2013)
Building A Streaming Apple TV App (CocoaConf San Jose, Nov 2016)
Building A Streaming Apple TV App (CocoaConf DC, Sept 2016)
Video Killed the Rolex Star (CocoaConf Columbus, July 2015)
Firebase: Totally Not Parse All Over Again (Unless It Is) (CocoaConf San Jose...
Get On The Audiobus (CocoaConf Boston, October 2013)
Video Killed the Rolex Star (CocoaConf San Jose, November, 2015)
Introduction to the Roku SDK
Firebase: Totally Not Parse All Over Again (Unless It Is)
Gpu Programming With GPUImage and Metal
Revenge of the 80s: Cut/Copy/Paste, Undo/Redo, and More Big Hits (CocoaConf C...
Stupid Video Tricks
Forward Swift 2017: Media Frameworks and Swift: This Is Fine
Image Processing Basics
Introduction to digital image processing
Ad

Similar to Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014) (20)

PDF
Core Image
PDF
Hi performance table views with QuartzCore and CoreText
KEY
Animation in iOS
PDF
Core Animation
PDF
COMP 4026 Lecture 5 OpenFrameworks and Soli
PDF
Demystifying Angular Animations
PDF
Сергій Міськів, «SwiftUI: Animations»
KEY
Core animation
PDF
Starting Core Animation
PDF
Working with Cocoa and Objective-C
PPT
Image processing for robotics
PDF
Beginning to iPhone development
PDF
iPhone dev intro
PDF
Before Going Vector
PDF
Dino2 - the Amazing Evolution of the VA Smalltalk Virtual Machine
PDF
MNT2014: Mobile Hibrido com Phonegap
PDF
What is image in Swift?/はるふ
PPT
Open Cv Tutorial Ii
PPT
Open Cv Tutorial Ii
PPTX
Top 10 HTML5 features
Core Image
Hi performance table views with QuartzCore and CoreText
Animation in iOS
Core Animation
COMP 4026 Lecture 5 OpenFrameworks and Soli
Demystifying Angular Animations
Сергій Міськів, «SwiftUI: Animations»
Core animation
Starting Core Animation
Working with Cocoa and Objective-C
Image processing for robotics
Beginning to iPhone development
iPhone dev intro
Before Going Vector
Dino2 - the Amazing Evolution of the VA Smalltalk Virtual Machine
MNT2014: Mobile Hibrido com Phonegap
What is image in Swift?/はるふ
Open Cv Tutorial Ii
Open Cv Tutorial Ii
Top 10 HTML5 features
Ad

More from Chris Adamson (14)

PDF
Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)
PDF
Whatever Happened to Visual Novel Anime? (JAFAX 2018)
PDF
Media Frameworks Versus Swift (Swift by Northwest, October 2017)
PDF
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...
PDF
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is Fine
PDF
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
PDF
iOS Media APIs (MobiDevDay Detroit, May 2013)
PDF
Core Audio in iOS 6 (CocoaConf San Jose, April 2013)
PDF
Core Audio in iOS 6 (CocoaConf DC, March 2013)
PDF
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
PDF
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)
PDF
Core Audio Intro (Detroit Mobile City 2013)
PDF
Objective-C Is Not Java
PDF
Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)
Whatever Happened to Visual Novel Anime? (AWA/Youmacon 2018)
Whatever Happened to Visual Novel Anime? (JAFAX 2018)
Media Frameworks Versus Swift (Swift by Northwest, October 2017)
Fall Premieres: Media Frameworks in iOS 11, macOS 10.13, and tvOS 11 (CocoaCo...
CocoaConf Chicago 2017: Media Frameworks and Swift: This Is Fine
Glitch-Free A/V Encoding (CocoaConf Boston, October 2013)
iOS Media APIs (MobiDevDay Detroit, May 2013)
Core Audio in iOS 6 (CocoaConf San Jose, April 2013)
Core Audio in iOS 6 (CocoaConf DC, March 2013)
Mobile Movies with HTTP Live Streaming (CocoaConf DC, March 2013)
Core Audio in iOS 6 (CocoaConf Chicago, March 2013)
Core Audio Intro (Detroit Mobile City 2013)
Objective-C Is Not Java
Core Audio in iOS 6 (CocoaConf Raleigh, Dec. '12)

Recently uploaded (20)

PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Encapsulation theory and applications.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
20250228 LYD VKU AI Blended-Learning.pptx
Encapsulation theory and applications.pdf
Empathic Computing: Creating Shared Understanding
Chapter 3 Spatial Domain Image Processing.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
Big Data Technologies - Introduction.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Programs and apps: productivity, graphics, security and other tools
NewMind AI Weekly Chronicles - August'25 Week I
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Network Security Unit 5.pdf for BCA BBA.
The AUB Centre for AI in Media Proposal.docx
Diabetes mellitus diagnosis method based random forest with bat algorithm
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Digital-Transformation-Roadmap-for-Companies.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...

Core Image: The Most Fun API You're Not Using (CocoaConf Columbus 2014)

  • 1. Core Image The Most Fun API You’re Not Using Chris Adamson • @invalidname CocoaConf Columbus, August 2014
  • 4. “Core Image is an image processing and analysis technology designed to provide near real-time processing for still and video images.”
  • 5. Agenda • Images, Filters, and Contexts • The Core Image Filter Gallery • Neat Tricks with Built-In Filters • Core Image on OS X
  • 6. Core Image, Core Concepts • Core Image is of the time • A chain of filters describes a “recipe” of processing steps to be applied to one or more images • “Stringly typed” • You only get pixels when you render
  • 7. Typical Workflow • Start with a source CIImage • Apply one or more filters • Render resulting CIImage to a CIContext, or convert CIImage out to another type • A few filters take or produce types other than CIImage (CIQRCodeGenerator)
  • 8. CIImage • An image provided to or produced by Core Image • But no bitmap of pixel data! • Immutable • -imageByCroppingToRect, -imageByApplyingTransform • -extent — a CGRect of the image’s size
  • 9. CIImage sources • NSURL • CGImageRef • Bitmap or JPEG/PNG/TIFF in NSData • OpenGL texture • Core Video image/pixel buffer
  • 10. CIContext • Rendering destination for a CIImage (- [drawImage:inRect:fromRect:]) • This is where you get pixels (also, this is the processor- intenstive part) • On iOS, must be created from an EAGLContext. On Mac, can be created with CGContextRef • Can also produce output as a CGImageRef, bitmap data, or a CVPixelBuffer (iOS only)
  • 11. ????
  • 12. CIFilter • Performs an image processing operation • Typically takes and produces a CIImage • All parameters are provided via -[setValue:forKey:] • Stringly-typed! • Output is retrieved with -[valueForKey:]
  • 13. –Core Image Cat “I can has filterz?
  • 14. Yes, you can has Filterz!
  • 16. Core Image Filter Reference Filter Name Parameters Note the type & number to provide Categories Watch for CICategoryBuiltIn and CICategoryVideo Example Figure Availability Watch for versioning and OS X-only filters
  • 17. Filter Categories • Group filters by functionality: CICategoryBlur, CICategoryGenerator, CICategoryCompositeOperation, etc. • Also group filters by availability and appropriateness: CICategoryBuiltIn, CICategoryVideo, CICategoryNonSquarePixels
  • 18. CICategoryGenerator • No input image, just produces an output • CICategoryGradient is also output-only • Example: CICheckerboardGenerator
  • 19. CICategoryBlur • Algorithmically spreads/blends pixels • CICategorySharpen offers an opposite effect • Example: CIGaussianBlur
  • 20. CICategoryColorAdjustement • Changes distribution of color throughout an image • Example: CIColorControls (adjusts saturation, brightness, contrast)
  • 21. CICategoryColorEffect • Color changes that affect the subjective nature of the image • Example: CIPhotoEffectNoir
  • 22. CICategoryDistortionEffect • Moves pixels to achieve an effect • Example: CITorusLensDistortion
  • 23. CICategoryStylize • Various stylistic effects • Example: CIPointillize
  • 24. CICategoryGeometryAdjustment • Moves pixels via cropping, affine transforms, etc. • Example: CICrop
  • 25. CICategoryTileEffect • Repeatedly copies all or part of an image • Example: CIAffineTile
  • 26. CICategoryCompositeOperation • Combines multiple images • Example: CISourceOverCompositing
  • 27. Demo
  • 29. Setting input values [self ! ! ! ! ! ! ! ! ! ! ! ! [self ! ! ! ! ! ! ! ! ! ! ! ! [self ! ! ! ! ! ! ! ! ! ! ! !
  • 30. Setting input image CIImage ! ! ! ! ! ! ! ! ! ! [self ! ! ! ! ! ! ! !
  • 31. Getting output image ciImage = [ UIImage self
  • 32. Other output options • Use a CIContext • -[drawImage:inRect:fromRect:] draws pixels to the EAGLContext (iOS) or CGContextRef (OS X) that the CIContext was created from. • CIContext can also render to a void* bitmap • On iOS, can create a CVPixelBufferRef, typically used for writing to a file with AVAssetWriter
  • 33. Chaining filters • Use the output of one filter as the input to the next • This doesn’t cost anything, because the CIImages just hold state, not pixels
  • 34. Demo
  • 35. Creating CIContext if (! ! ! ! ! ! ! ! ! ! ! }! ! ! ! // make CIContext from GL context, clearing out default color space self ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! Note: This is in a subclass of GLKView
  • 36. Set up Sepia Tone filter _sepiaToneFilter [_sepiaToneFilter ! ! ! ! ! ! ! ! !
  • 37. Set up Mask to Alpha filter UIImage _circleMaskFilter CIImage ! ! ! ! ! ! ! ! ! ! ! ! circleImageUI. [_circleMaskFilter ! ! ! ! ! ! ! _circleMask circle-mask-100x100.png
  • 38. Set up Blend with Mask filter _constantColorGeneratorFilter ! ! ! ! ! ! ! ! ! ! [_constantColorGeneratorFilter ! ! ! [ ! ! ! ! ! ! ! ! ! ! ! ! ! ! forKey _backgroundAlphaFill ! ! ! ! ! ! ! ! ! ! ! ! _blendWithMaskFilter [_blendWithMaskFilter ! ! ! ! ! ! ! ! [_blendWithMaskFilter ! ! ! ! ! ! ! !
  • 39. Apply filters // Get CIImage from source image CGImageRef ! ! ! ! ! ! ! ! loupeImage = [ ! // Apply sepia filter [self loupeImage = [ ! // Set sepia-filtered image as input to blend-with-mask [_blendWithMaskFilter ! ! ! ! ! ! loupeImage = [
  • 40. Render in CIContext if ([ ! [ }! ! ! [self ! // GL-on-Retina fix CGRect drawBoundsInPoints. drawBoundsInPoints. ! ! // drawing to CIContext draws to the EAGLESContext it's based on [self ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! // Refresh GLKView contents immediately [self
  • 41. Working with Video • AVFoundation AVCaptureVideoDataOutput and AVAssetReader deliver CMSampleBuffers • CMSampleBuffers have timing information and CVImageBuffers/CVPixelBuffers • +[CIImage imageWithCVPixelBuffer:]
  • 42. Demo
  • 43. Chroma Key (“green screen” recipe • Use a CIColorCube to map green-ish colors to transparent • Use CISourceOverCompositing to draw this alpha’ed image over another image
  • 44. CIColorCube Maps colors from one RGB “cube” to another http://en.wikipedia.org/wiki/RGB_color_space
  • 45. Using CIColorCube CIColorCube maps green(-ish) colors to 0.0 alpha, all other colors pass through
  • 47. CIColorCube Dataconst unsigned int size = 64;! size_t cubeDataSize = size * size * size * sizeof (float) * 4;! float *keyCubeData = (float *)malloc (cubeDataSize);! //! float *alphaMatteCubeData = (float *)malloc (cubeDataSize);! //! float rgb[3], hsv[3], *keyC = keyCubeData, *alphaC = alphaMatteCubeData;! float rgb[3], hsv[3], *keyC = keyCubeData;! // Populate cube with a simple gradient going from 0 to 1! for (int z = 0; z < size; z++){! ! rgb[2] = ((double)z)/(size-1); // Blue value! ! for (int y = 0; y < size; y++){! ! ! rgb[1] = ((double)y)/(size-1); // Green value! ! ! for (int x = 0; x < size; x ++){! ! ! ! rgb[0] = ((double)x)/(size-1); // Red value! ! ! ! ! // Convert RGB to HSV! ! ! ! // You can find publicly available rgbToHSV functions on the Internet! ! ! ! ! RGBtoHSV(rgb[0], rgb[1], rgb[2],! ! ! ! ! ! &hsv[0], &hsv[1], &hsv[2]);! ! ! ! ! // RGBtoHSV uses 0 to 360 for hue, while UIColor (used above) uses 0 to 1.! ! ! ! hsv[0] /= 360.0;! ! ! ! ! ! ! ! // Use the hue value to determine which to make transparent! ! ! ! // The minimum and maximum hue angle depends on! ! ! ! // the color you want to remove! ! ! ! ! ! ! ! bool keyed = (hsv[0] > minHueAngle && hsv[0] < maxHueAngle) &&! ! ! ! (hsv[1] > minSaturation && hsv[1] < maxSaturation) &&! ! ! ! (hsv[2] > minBrightness && hsv[2] < maxBrightness);! ! ! ! ! ! ! ! float alpha = keyed ? 0.0f : 1.0f;! ! ! ! ! ! ! ! // re-calculate c pointer! ! ! ! keyC = (((z * size * size) + (y * size) + x) * sizeof(float)) + keyCubeData;! ! ! ! ! ! ! ! // Calculate premultiplied alpha values for the cube! ! ! ! keyC[0] = rgb[0] * alpha;! ! ! ! keyC[1] = rgb[1] * alpha;! ! ! ! keyC[2] = rgb[2] * alpha;! ! ! ! keyC[3] = alpha;! ! ! ! ! ! ! ! ! ! ! }! ! }! }! See “Chroma Key Filter Recipe” in Core Image Programming Guide
  • 48. Create CIColorCube from mapping data // build the color cube filter and set its data to above! self.colorCubeFilter = [CIFilter filterWithName:@"CIColorCube"];! [self.colorCubeFilter setValue:[NSNumber numberWithInt:size]! ! !! ! ! ! ! ! ! ! forKey:@"inputCubeDimension"];! NSData *data = [NSData dataWithBytesNoCopy:keyCubeData! ! !! ! ! ! ! ! ! length:cubeDataSize! ! !! ! ! ! ! freeWhenDone:YES];! [self.colorCubeFilter setValue:data forKey:@"inputCubeData"];!
  • 49. Create CISourceOverCompositing // source over filter! self.backgroundImage = [UIImage imageNamed:! ! !! ! ! ! ! ! ! ! ! @"img_washington_small_02.jpg"]; ! self.backgroundCIImage = [CIImage imageWithCGImage:! ! !! ! ! ! ! ! ! ! ! ! self.backgroundImage.CGImage];! self.sourceOverFilter = [CIFilter filterWithName:! ! !! ! ! ! ! ! ! ! ! @"CISourceOverCompositing"];! [self.sourceOverFilter setValue:self.backgroundCIImage ! ! !! ! ! ! ! ! ! forKeyPath:@"inputBackgroundImage"];!
  • 50. Apply Filters in Capture Callback CIImage *bufferCIImage = [CIImage imageWithCVPixelBuffer:cvBuffer];! ! [self.colorCubeFilter setValue:bufferCIImage ! ! !! ! ! ! ! ! ! ! ! forKey:kCIInputImageKey];! CIImage *keyedCameraImage = [self.colorCubeFilter valueForKey:! ! !! ! ! ! ! ! ! ! ! ! ! kCIOutputImageKey];! ! [self.sourceOverFilter setValue:keyedCameraImage ! ! !! ! ! ! ! ! ! ! forKeyPath:kCIInputImageKey];! ! CIImage *compositedImage = [self.sourceOverFilter valueForKeyPath:! ! !! ! ! ! ! ! ! ! ! ! kCIOutputImageKey]; Then draw compositedImage to CIContext as before
  • 51. Other Points of Interest • CIQRCodeGenerator filter — Converts data (e.g., a string) to a QR Code • CILenticularHaloGenerator filter — aka, lens flare • CIDetector — Class (not a filter) to find features in images. Currently only supports face finding (returned as an array of CIFeatures). Optionally detects smiles and eye blinks within faces. • CIImage has a red-eye enhancement that takes the array of face CIFeatures to tell it where to apply the effect
  • 52. Core Image on OS X • Core Image is part of QuartzCore (or Image Kit), so you don’t @import CoreImage • Many more filters are available • Can create your own filter with OpenGL Shading Language (plus some CI extensions). See CIKernel. • Also available in iOS 8 • Filters can be set on CALayers
  • 53. CALayer Filters on OS X • Views must be layer-backed (obviously) • Must also call -[NSView setLayerUsesCoreImageFilters:] on 10.9+ • CALayer has properties: filters, compositingFilter, backgroundFilters, minificationFilter, magnificationFilter • These exist on iOS, but do nothing
  • 54. Demo
  • 55. Adding CIPixellate to layer’s filters self ! !! ! ! ! ! ! ! ! self [self ! !! ! ! ! ! [ ! !! ! ! ! ! ! ! ! ! [self ! !! ! ! ! !! ! ! ! ! ! ! ! ! self ! !! ! !
  • 56. Updating a layer’s filters -(void ! [ ! !! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! !! ! ! ! }
  • 57. Wrap Up: Stuff to Remember • Get psyched about filters, but remember to check that they’re on your targeted platform/version. • Drawing to a CIContext on iOS must be GL- backed (e.g., with a GLKView)
  • 58. Q&A Slides and code will be posted to: http://www.slideshare.net/invalidname/ ! @invalidname http://subfurther.com/blog