SimpleITK Tutorial
Transcription
SimpleITK Tutorial
SimpleITK Tutorial Image processing for mere mortals Insight Software Consortium Sept 23, 2011 January 10, 2012 (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 1 / 142 This presentation is copyrighted by The Insight Software Consortium distributed under the Creative Commons by Attribution License 3.0 http://creativecommons.org/licenses/by/3.0 What this Tutorial is about Provide working knowledge of the SimpleITK platform (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 3 / 142 Program Virtual Machines Preparation (10min) Introduction (15min) Basic Tutorials I (45min) Short Break (10min) Basic Tutorials II (45min) Co↵ee Break (30min) Intermediate Tutorials (45min) Short Break (10min) Advanced Topics (40min) Wrap-up (10min) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 4 / 142 Tutorial Goals Gentle introduction to ITK Introduce SimpleITK Provide hands-on experience Problem solving, not direction following ...but please follow directions! (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 13 / 142 ITK Overview How many are familiar with ITK? (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 14 / 142 Ever seen code like this? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 // Setup image types . typedef float InputPi xelType ; typedef float O ut pu t Pi xe lT y pe ; typedef itk : : Image<InputPixelType , 2> Inpu tImageTy pe ; typedef itk : : Image<OutputPixelType ,2> O ut pu tI m ag eT yp e ; // Filter type typedef itk : : DiscreteGaussianImageFilter< InputImageType , O ut pu tI m ag eT yp e > FilterType ; // Create a filter FilterType : : Pointer filter = FilterType : : New ( ) ; // Create the p i p e l i n e filter >SetInput ( reader >GetOutput ( ) ) ; filter >SetVariance ( 1 . 0 ) ; filter >S e t M a x i m u m K e r n e l W i d t h ( 5 ) ; filter >Update ( ) ; Ou t pu tI ma g eT yp e : : Pointer blurred = filter >GetOutput ( ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 15 / 142 What if you could write this? 1 2 3 import SimpleITK input = SimpleITK . ReadImage ( filename ) output = SimpleITK . D i s c r e t e G a u s s i a n F i l t e r ( input , 1 . 0 , 5 ) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 16 / 142 What if you could write this? 1 2 3 import SimpleITK input = SimpleITK . ReadImage ( filename ) output = SimpleITK . D i s c r e t e G a u s s i a n F i l t e r ( input , 1 . 0 , 5 ) We are here to tell you that you can... (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 16 / 142 Goals of SimpleITK Be an “on-ramp” for ITK Simplify the use of ITK by Providing a templateless, typeless layer for ITK in C++ Providing wrappings in scripting languages Providing access to most ITK algorithms (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 17 / 142 SimpleITK Architectural Overview Conceptually, SimpleITK is an application library built on ITK All functionality provided by ITK Components: Template expansion system C++ library Small SWIG definition (more details later) “Glue” code for several scripting languages Some language utilities Open Source, Apache licensed project (http://www.opensource.org/licenses/apache2.0.php) Hosted by GitHub (https://github.com/SimpleITK/SimpleITK) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 18 / 142 Templates in ITK 1 2 3 4 5 6 7 8 9 10 11 typedef unsigned char PixelType ; enum {Imag eDimensi on = 2 } ; typedef itk : : Image<PixelType , ImageDimension> ImageType ; typedef itk : : Vector<float , ImageDimension> VectorType ; typedef itk : : Image<VectorType , ImageDimension> FieldType ; typedef itk : : Image<VectorType : : ValueType , ImageDimension> Float ImageTyp e ; typedef ImageType : : IndexType IndexType ; typedef ImageType : : SizeType SizeType ; typedef ImageType : : RegionType RegionType ; typedef itk : : M u l t i R e s o l u t i o n P D E D e f o r m a b l e R e g i s t r a t i o n <ImageType , ImageType , FieldType> R e g i s t r a t i o n T y p e ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 19 / 142 Template Freedom 1 2 3 4 5 6 7 8 9 10 11 using itk : : simple ; // Read the image file I ma ge Fi l eR ea de r reader ; reader . SetFileName ( " / my / fancy / file . nrrd " ) ; Image image = reader . Execute ( ) ; // This filters perform a gaussian bluring with sigma in // ph y s i c a l space . The output image will be of real type . S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r gaussian ; gaussian . SetSigma ( 2 . 0 ) ; Image blurredImage = gaussian . Execute ( image ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 20 / 142 Programming Models Object oriented Function oriented More about this later (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 21 / 142 Wrapping Transformed by SWIG Parses header and “interface” files Automatically creates scripting “glue” Wrappings available for: Python Java C# Tcl, Lua, Ruby Others as requested. . . (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 22 / 142 Image Anatomy SimpleITK images contain itk::Image Hides the templates Adds useful “utility” functions (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 23 / 142 Filter Anatomy SimpleITK filters contain itk::ImageToImageFilter Hides the templates Adds useful “utility” functions (Mainly) output = Filter.Execute ( input ) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 24 / 142 Basic Tutorial Basic Tutorial (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 25 / 142 Note on the Tutorial Most examples will be Python Obvious translation to other languages C++ usage (generally) obvious (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 33 / 142 Image Class Creation Number of dimensions, size, origin, spacing Pixel access Back to iPython (Examples/BasicTutorial1/Image.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 34 / 142 What just happened? 1 2 3 4 5 import SimpleITK as sitk # Create an image image = sitk . Image ( 2 5 6 , 2 5 6 , 2 5 6 , sitk . sitkInt16 ) ; # How about 2 d ? twoD = sitk . Image ( 6 4 , 6 4 , sitk . sitkFloat32 ) sitk is the module Image is the constructor for the Image class Height, width, depth (omit depth for 2D images) Datatype (more on this later) Back to iPython (Examples/BasicTutorial1/Image.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 35 / 142 What just happened? 1 2 3 4 # Addressing pixels image . GetPixel ( 0 , 0 , 0 ) image . SetPixel ( 0 , 0 , 0 , 1 ) image . GetPixel ( 0 , 0 , 0 ) Get the voxel value at [0,0,0]? Hmm, I don’t like it, so set to 1 What is the value at [0,0,0] now? Back to iPython (Examples/BasicTutorial1/Image.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 36 / 142 What just happened? 1 2 3 4 # Addressing pixels image [ 0 , 0 , 0 ] image [ 0 , 0 , 0 ] = 10 image [ 0 , 0 , 0 ] Without warning, we sprinkled syntatic sugar on you! image[0,0,0] is shorthand for Image.GetPixel(0,0,0) image[0,0,0] = 10 is shorthand for Image.SetPixel(0,0,0,10) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 37 / 142 Summary Images are created using SimpleITK.Image ( w, h, d, Type ) Images can be 2- or 3-dimensional Images can describe themselves Images have simple pixel accessors Questions before we move on? (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 38 / 142 Memory Management Memory Management (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 39 / 142 Images Images... usually allocated on the stack are copy-on-write use internal smart-pointers Back to iPython (Examples/BasicTutorial1/MemoryManagement.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 40 / 142 Image Memory Management 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 image = SimpleITK . Image ( 3 2 , 3 2 , 3 2 , SimpleITK . sitkInt16 ) print image ... Image ( 0 x94f2d98 ) Reference Count : 1 ... # Clone image b = SimpleITK . Image ( image ) print image ... Image ( 0 x94f2d98 ) Reference Count : 2 ... print b ... Image ( 0 x94f2d98 ) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 41 / 142 Image Memory Management 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 print b ... Image ( 0 x94f2d98 ) ... b [0 ,0 ,0] = 1 print b ... Image ( 0 x94f4cb0 ) Reference Count : 1 ... print image ... Image ( 0 x94f2d98 ) Reference Count : 1 ... (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 42 / 142 Filters Filters... usually allocated on the stack tend to clean up after themselves do not hold on to images no access to the ITK pipeline ...more on this later... (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 43 / 142 Memory Management Strategies C++. . . No need for explicit management Let images clean up after themselves Let filters clean up after themselves Wrapped. . . Utilize language-specific memory management Automatic in Python, Java, Ruby, C#, Lua More manual in Tcl (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 44 / 142 Basic Tutorial 2 Basic Tutorial 2 (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 50 / 142 Hands On Hands On Examples/BasicTutorial2/Filters.py (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 51 / 142 What just happened? 1 2 3 4 5 6 7 # Simple smoothing smooth = sitk . S m o o t h i n g R e c u r s i v e G a u s s i a n ( image , 2 . 0 ) sitk . Show ( sitk . Subtract ( image , smooth ) ) ... RuntimeError : Exception thrown in SimpleITK Subtract : . . . sitk : : ERROR : Both images for S u b t r a c t I m a g e F i l t e r don ’t match type or dimension ! ... The output of SmoothingRecursiveGaussian is of type float The input image is signed short Most SimpleITK filters with 2 inputs require the same type Let’s fix the problem (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 52 / 142 Introducing Cast 1 2 3 4 5 # Much better print " Before : " , smooth . G e t P i x e l I D T y p e A s S t r i n g ( ) smooth = sitk . Cast ( smooth , image . G et Pi xe l ID Va lu e ( ) ) print " After : " , smooth . G e t P i x e l I D T y p e A s S t r i n g ( ) sitk . Show ( sitk . Subtract ( image , smooth ) , " D i f f W i t h G a u s s i a n " ) Back to iPython (Examples/BasicTutorial2/Filters.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 53 / 142 Sizes and Indices 1 2 3 4 # Extract size = [ 6 4 , 6 4 , 1 ] start = [ 6 4 , 0 , 0 ] sitk . Show ( sitk . Extract ( image , size , start ) , " Extracted " ) in C++ / ITK code this would use 1 2 3 4 5 6 7 typedef unsigned char PixelType ; enum {Imag eDimensi on = 2 } ; typedef itk : : Image<PixelType , ImageDimension> ImageType ; typedef ImageType : : IndexType IndexType ; typedef ImageType : : SizeType SizeType ; typedef ImageType : : RegionType RegionType ; SimpleITK uses STL vectors Wrapping converts to language-specific constructs (tuples/arrays) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 54 / 142 Pixel-wise Operators 1 2 # Use pixel - wise operators sitk . Show ( 127 ⇤ image + 127 ⇤ sitk . BinaryErode ( image ) , " ThinErosion " ) Table: SimpleITK Pixel-wise Operators Operator + † †† ⇤ / & | ⇠ ⇤⇤†† Equivalant Add, AddConstantTo Subtract, SubtractConstantFrom Multiply, MultiplyByConstant Divide, DivideByConstant And “and” Or “or” Not “not” Pow, PowToConstant Usage† A + B, s + A, s + B A B, s A, s B A ⇤ B, s ⇤ A, s ⇤ B A/B, s/A, B/s A&B A|B A A ⇤ ⇤B, A ⇤ ⇤s A and B are images (2D or 3D), s is a scalar python only (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 58 / 142 Operator Example 1 2 3 4 5 sitk . Hash ( image + 2 ) sitk . Hash ( sitk . AddConstantTo ( image , 2 ) ) sitk . Hash ( image ⇤ 2 ) sitk . Hash ( sitk . M u l t i p l y B y C o n s t a n t ( image , 2 ) ) Hash calculates the MD5 or SHA1 hash of the image data Used to tell if two images are exactly identical Back to iPython (Examples/BasicTutorial2/Morphology.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 59 / 142 SimpleITK with Numpy Numpy is: Python’s universal numerics foundation Provides high performance basic linear algebra numpy interface functions: 1 2 3 4 5 def G e t A r r a y F r o m I m a g e ( image ) : """ Get a numpy array from a SimpleITK Image . """ def G e t I m a g e F r o m A r r a y ( arr ) : """ Get a SimpleITK Image from a numpy array . """ Both of these methods do a deep copy of the image Ensures safety, bypassing error-prone memory issues (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 68 / 142 Python Example To iPython (Examples/InteractiveTutorial/05-02-Numpy.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 69 / 142 Image Measurements Image Measurements (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 70 / 142 The Scenerio You collected 1000 Di↵usion Weighted Imaging scan sessions Now, compute the fractional anisotropy measures for a set of anatomical regions (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 71 / 142 Python Example To iPython (Examples/InteractiveTutorial/MeasureRegions.py) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 72 / 142 Feature Detection Feature Detection (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 73 / 142 Edge Detection CannyEdgeDetection 1 2 3 4 5 Image C a n n y E d g e D e t e c t i o n ( c o n s t Image& , double inLowerThreshold = 0.0 , double inUpperThreshold = 0.0 , s t d : : v e c t o r <d o u b l e> i n V a r i a n c e = s t d : : v e c t o r <d o u b l e >(3 , 0 . 0 ) , s t d : : v e c t o r <d o u b l e> inMaximumError = s t d : : v e c t o r <d o u b l e >(3 , 0 . 0 1 ) ) ; SobelEdgeDetection 1 Image S o b e l E d g e D e t e c t i o n ( c o n s t Image& ); ZeroCrossingBasedEdge 1 2 3 4 5 Image Z e r o C r o s s i n g B a s e d E d g e D e t e c t i o n ( c o n s t Image& , double i n V a r i a n c e = 1 , u i n t 8 t i n F o r e g r o u n d V a l u e = 1u , u i n t 8 t i n B a c k g r o u n d V a l u e = 0u , d o u b l e inMaximumError = 0 . 1 ) ; GradientMagnitudeRecursiveGaussian 1 2 3 Image G r a d i e n t M a g n i t u d e R e c u r s i v e G a u s s i a n ( c o n s t Image& , double inSigma = 1.0 , bool inNormalizeAcrossScale = f a l s e ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 75 / 142 Image Derivatives Derivative 1 2 3 4 Image D e r i v a t i v e ( c o n s t Image& , u n s i g n e d i n t i n D i r e c t i o n = 0u , u n s i g n e d i n t i n O r d e r = 1u , bool inUseImageSpacing = true ) ; RecursiveGaussian 1 2 3 4 5 Image R e c u r s i v e G a u s s i a n ( c o n s t Image& , double inSigma = 1.0 , bool inNormalizeAcrossScale = fal se , i t k : : s i m p l e : : R e c u r s i v e G a u s s i a n I m a g e F i l t e r : : OrderEnumType i n O r d e r = i t k : : s i m p l u n s i g n e d i n t i n D i r e c t i o n = 0u ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 76 / 142 Advanced Topics Advanced Topics (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 81 / 142 Building SimpleITK in 5 Easy Commands git clone --recursive https://github.com/SimpleITK/SimpleITK mkdir SimpleITK/SimpleITK-build cd SimpleITK/SimpleITK-build cmake ../SuperBuild make -j 5 Or as part of Slicer ITK_VERSION_MAJOR=4 Slicer_USE_SimpleITK=ON (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 82 / 142 More complete version Check out the code from GitHub (https://github.com/SimpleITK/SimpleITK) Run CMake (http://www.cmake.org/) using SimpleITK/SuperBuild as the source directory Build using your favorite compiler (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 83 / 142 Supported Platforms Windows: Visual Studio 10 Windows: Visual Studio 9 (Requires TR1 service pack) Mac OSX: gcc 4.x (Xcode 4.x) Linux: gcc 4.x (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 84 / 142 SimpleITK Architecture SimpleITK Architecture (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 85 / 142 Filter Anatomy SimpleITK filters create ITK filters Templated based on input type Output type is usually the same as input type Instantiated for many possible image types (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 86 / 142 Image and Filter Types Dimensions Vector Types 2 dimensional 3 dimensional int8 t uint8 t int16 t uint16 t int32 t uint32 t float double Scalar types int8 t uint8 t int16 t uint16 t int32 t uint32 t float double std :: complex < float > std :: complex < double > (Insight Software Consortium) Label Types SimpleITK - MICCAI 2011 uint8 t uint16 t uint32 t Sept 2011 87 / 142 Filter Anatomy Filter interrogates input Instantiates proper ITK filter Executes ITK filter Constructs output from ITK image (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 88 / 142 Using Filters Using Filters (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 89 / 142 Object Paradigm (C++) 1 #i n c l u d e <S i m p l e I T K . h> 2 namespace sitk = itk : : simple ; 3 ... 4 // Create a s m o o t h i n g filter 5 sitk : : S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r gaussian ; 6 7 // Set a p a r a m e t e r 8 gaussian . SetSigma ( 2 . 0 ) ; 9 10 // " Execute " the Filter 11 sitk : : Image blurredImage = gaussian . Execute ( image ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 90 / 142 Object Paradigm (C++) Flexibility 1 #i n c l u d e <S i m p l e I T K . h> 2 namespace sitk = itk : : simple ; 3 ... 4 // Create a s m o o t h i n g filter 5 sitk : : S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r gaussian ; 6 7 // Set p a r a m e t e r ( s ) , then execute 8 sitk : : Image blurredImage = gaussian 9 . SetSigma ( 2 . 0 ) 10 . Execute ( image ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 91 / 142 Object Paradigm (C++) 1 #i n c l u d e <S i m p l e I T K . h> 2 namespace sitk = itk : : simple ; 3 ... 4 blurredImage = sitk : : S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r ( ) 5 . SetSigma ( 2 . 0 ) 6 . SetRadius ( 5 ) 7 . Execute ( image ) ; One line: create anonymous filter, set parameters, and execute (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 92 / 142 “Function” Paradigm (C++) 1 #i n c l u d e <S i m p l e I T K . h> 2 namespace sitk = itk : : simple ; 3 ... 4 // Call the f u n c t i o n version 5 // NB : Drop the " I m a g e F i l t e r "! 6 // S i g n a t u r e : 7 /* 8 sitk :: Image S m o o t h i n g R e c u r s i v e G a u s s i a n ( 9 const Image & , 10 double inSigma = 1.0 , 11 bool i n N o r m a l i z e A c r o s s S c a l e = false ); 12 */ 13 sitk : : Image blurredImage = sitk : : S m o o t h i n g R e c u r s i v e G a u s s i a n ( 14 image , 15 2.0 , 16 false ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 93 / 142 Mix & Match (C++) 1 #i n c l u d e <S i m p l e I T K . h> 2 namespace sitk = itk : : simple ; 3 ... 4 // Get our g a u s s i a n ready 5 sitk : : S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r gaussian ; 6 gaussian . SetSigma ( 2 . 0 ) ; 7 8 // What is the effect on the image 9 sitk : : Image difference = sitk : : Subtract ( 10 image , 11 gaussian . Execute ( image ) 12 ); 13 sitk : : Image difference2 = sitk : : Subtract ( 14 image , 15 sitk : : S m o o t h i n g R e c u r s i v e G a u s s i a n ( 16 image , 2 . 0 17 ) 18 ); (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 94 / 142 Code Philosophy Code Philosophy (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 95 / 142 Filter Class Overview (C++) 1 class S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r : 2 public ImageFilter { 3 typedef S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r Self ; 4 5 /* * Default C o n s t r u c t o r that takes no a r g u m e n t s 6 and i n i t i a l i z e s default p a r a m e t e r s */ 7 SmoothingRecursiveGaussianImageFilter ( ) ; In line 1, we declare a subclass of ImageFilter Line 3 creates a special typedef for use later The default constructor is line 7 (never any parameters) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 96 / 142 Filter Class Overview (C++) Continued 1 2 /* * Define the pixels types s u p p o r t e d by this filter */ typedef B a s i c P i x e l I D T y p e L i s t P ix e lI DT yp e Li st ; Notice PixelIDTypeList in line 2 Used to instantiate ITK filters Determines valid input image types BasicPixelIDTypeList expands to: int8 t, uint8 t int16 t, uint16 t int32 t, uint32 t float, double (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 97 / 142 Filter Class Overview (C++) Continued 1 2 3 4 5 6 7 8 Self& SetSigma ( double t ) { . . . return ⇤this ; } double GetSigma ( ) { return this >m_Sigma ; } Self& S e t N o r m a l i z e A c r o s s S c a l e ( bool t ) { . . . } Self& N o r m a l i z e A c r o s s S c a l e O n ( ) { . . . } Self& N o r m a l i z e A c r o s s S c a l e O f f ( ) { . . . } bool G e t N o r m a l i z e A c r o s s S c a l e ( ) { . . . } Get/Set parameters Set methods always return Self & (more later) Generally, a direct mapping to ITK Boolean parameters generate On and O↵ methods (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 98 / 142 Filter Class Overview (C++) Continued 1 2 3 4 5 /* * Name of this class */ std : : string GetName ( ) const { . . . } /* * Print o u r s e l v e s out */ std : : string ToString ( ) const ; Return the name and description of the filter (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 99 / 142 Filter Class Overview (C++) Continued 1 /* * Execute the filter on the input image */ 2 Image Execute ( const Image & ) ; 3 4 /* * Execute the filter with p a r a m e t e r s */ 5 Image Execute ( const Image &, 6 double inSigma , 7 bool i n N o r m a l i z e A c r o s s S c a l e ) ; 8 } ; /* End of class S m o o t h i n g R e c u r s i v e G a u s s i a n */ 9 10 Image S m o o t h i n g R e c u r s i v e G a u s s i a n ( const Image& , 11 double inSigma = 1 . 0 , 12 bool i n N o r m a l i z e A c r o s s S c a l e = false ) ; Run the filter on an image and return the result Notice extra function (line 10), adds flexibility Drop ImageFilter from class name to get function name (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 100 / 142 Questions? Questions? (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 101 / 142 Using ITK with SimpleITK Problem: Use ITK from SimpleITK (or vice versa) ./ToITK input.nii output.nii Steps: Load image using SimpleITK Filter using ITK Save using OpenCV (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 102 / 142 To ITK Starting code: ToITK/ToITK.cxx Directory: SimpleITK-MICCAI-2011-Tutorial/Examples/AdvancedTutorial 1 2 3 4 5 6 7 8 9 10 11 12 namespace s i t k = i t k : : s i m p l e ; ... // Load t h e image v i a S i m p l e I T K s i t k : : Image s i t k I m a g e = s i t k : : ReadImage ( i n p u t F i l e n a m e ) ; // C o n s t r u c t t h e ITK P i p e l i n e // L i n k p i p e l i n e t o S i m p l e I T K // Update p i p e l i n e // C r e a t e o u t p u t S i m p l e I T K image // Save image v i a S i m p l e I T K s i t k : : W r i t e I m a g e ( sOutput , o u t p u t F i l e n a m e ) ; r e t u r n EXIT SUCCESS ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 103 / 142 ToITK – Step 1: Construct the ITK Pipeline 1 2 3 4 5 6 7 8 9 10 11 12 13 // C o n s t r u c t t h e ITK P i p e l i n e t y p e d e f i t k : : Image<f l o a t ,3> ImageType ; t y p e d e f i t k : : M i r r o r P a d I m a g e F i l t e r <ImageType , ImageType> P a d F i l t e r T y p e ; P a d F i l t e r T y p e : : S i z e T y p e upperBound , l o w e r B o u n d ; P a d F i l t e r T y p e : : P o i n t e r pad = P a d F i l t e r T y p e : : New ( ) ; f o r ( u n s i g n e d i n t i = 0 ; i < 3 ; i++ ) { upperBound [ i ] = s i t k I m a g e . G e t S i z e ( ) [ i ] ; lowerBound [ i ] = s i t k I m a g e . G e t S i z e ( ) [ i ] ; } pad >SetPadUpperBound ( upperBound ) ; pad >SetPadLowerBound ( l o w e r B o u n d ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 104 / 142 ToITK – Step 2: Link pipeline to SimpleITK 1 2 3 // L i n k p i p e l i n e t o S i m p l e I T K ImageType : : P o i n t e r i n p u t I m a g e = ( ImageType ⇤) s i t k I m a g e . G e t I m a g e B a s e ( ) ; pad >S e t I n p u t ( i n p u t I m a g e ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 105 / 142 ToITK – Step 3: Update ITK Pipeline 1 2 // Update p i p e l i n e pad >Update ( ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 106 / 142 ToITK – Step 4: Create the SimpleITK output image 1 2 // C r e a t e o u t p u t S i m p l e I T K image s i t k : : Image s O u t p u t ( pad >GetOutput ( ) ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 107 / 142 ToITK – (Optional) Step 5: Show 1 2 // ( O p t i o n a l ) Show t h e r e s u l t s s i t k : : Show ( s O u t p u t ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 108 / 142 To ITK Solution ~/Source/AdvancedTutorial-build/ToITK/ToITKSolution \ ~/Source/SimpleITK/Testing/Data/Input/RA-Float.nrrd \ /tmp/foo.nii (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 109 / 142 Quick Examples from Other Languages Simple Gaussian in 8 languages AdvancedTutorial/SimpleGaussian/SimpleGaussian.* (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 130 / 142 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # include < SimpleITK .h > namespace sitk = itk :: simple ; int main ( int argc , char * argv [] ) { // Read the image file sitk :: I ma g eF il eR e ad er reader ; reader . SetFileName ( std :: string ( argv [1] ) ); sitk :: Image image = reader . Execute (); // This filters perform a gauss ian bluring with sigma in physical // space . The output image will be of real type . sitk :: S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r gaussian ; gaussian . SetSigma ( atof ( argv [2] ) ); sitk :: Image blurredImage = gaussian . Execute ( image ); // Covert the real output image back to the original pixel type , to // make writing easier , as many file formats don ’t support real // pixels . sitk :: C as tI m ag eF il t er caster ; caster . S e t O u t p u t P i x e l T y p e ( image . G et Pi x el ID Va l ue () ); sitk :: Image outputImage = caster . Execute ( blurredImage ); // write the image sitk :: I ma ge F il eW ri t er writer ; writer . SetFileName ( std :: string ( argv [3] ) ); writer . Execute ( outputImage ); return 0; } (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 131 / 142 Ruby 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 require ’ simpleitk ’ if ARGV . length != 3 then puts " Usage : Simpl eGaussia n < input > < sigma > < output > " ; exit ( 1 ) end reader = Simpleitk : : I ma ge Fi l eR ea de r . new reader . set_file_name ( ARGV [ 0 ] ) image = reader . execute in putPixe lType = image . g e t _ p i x e l _ i d v a l u e gaussian = Simpleitk : : S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r . new gaussian . set_sigma ARGV [ 1 ] . to_f image = gaussian . execute image ; caster = Simpleitk : : C as tI ma g eF il te r . new caster . s e t _ o u t p u t _ p i x e l _ t y p e inputP ixelType image = caster . execute image writer = Simpleitk : : I ma ge Fi l eW ri te r . new writer . set_file_name ARGV [ 2 ] writer . execute image (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 132 / 142 R 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # Run with : # # Rscript -- vanilla S i m p l e G a u s s i a n . R # input sigma output library ( SimpleITK ) args <- commandArgs ( TRUE ) myreader <- I ma ge Fi l eR ea de r ( ) myreader <- I ma ge Fi l eR ea de r _ SetFileName ( myreader , args [ [ 1 ] ] ) myimage <- Im ag e Fi le Re a de r _ Execute ( myreader ) pixeltype <- Image _ G e tP ix el I DV al ue ( myimage ) myfilter <- S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r ( ) myfilter <- S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r _ SetSigma ( myfilter , as . real ( args [ 2 ] ) ) smoothedimage <- S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r _ Execute ( myfilter , myimage ) mycaster <- C as tI ma g eF il te r ( ) mycaster <- C as tI ma g eF il te r _ S e t O u t p u t P i x e l T y p e ( mycaster , pixeltype ) castedimage <- Ca st Im a ge Fi lt e r _ Execute ( mycaster , soothedimage ) mywriter <- I ma ge Fi l eW ri te r ( ) mywriter <- I ma ge Fi l eW ri te r _ SetFileName ( mywriter , args [ [ 3 ] ] ) mywriter <- I ma ge Fi l eW ri te r _ Execute ( mywriter , castedimage ) (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 133 / 142 C# 1 u s i n g System ; 2 using itk . simple ; 3 4 namespace itk . simple . examples { 5 class Sim pleGauss ian { 6 static void Main ( string [ ] args ) { 7 try { 8 if ( args . Length < 3 ) { 9 Console . WriteLine ( " Usage : Simp leGauss ian < input > < sigma > < output > " ) ; 10 return ; 11 } 12 // Read input image 13 I ma ge Fi l eR ea de r reader = new I ma ge F il eR ea d er ( ) ; 14 reader . SetFileName ( args [ 0 ] ) ; 15 Image image = reader . Execute ( ) ; 16 17 // Execute Gaussian s m o o t h i n g filter 18 S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r gaussian = new S m o o t h i n g R e c u r s i v e G a 19 gaussian . SetSigma ( Double . Parse ( args [ 1 ] ) ) ; 20 image = gaussian . Execute ( image ) ; 21 22 // Write output image 23 I ma ge Fi l eW ri te r writer = new I ma ge F il eW ri t er ( ) ; 24 writer . SetFileName ( args [ 2 ] ) ; 25 writer . Execute ( image ) ; 26 27 } catch ( Exception ex ) { 28 Console . WriteLine ( ex ) ; 29 } 30 } 31 } 32 } (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 134 / 142 Java 1 import org . itk . simple . ⇤ ; 2 3 class Simp leGaussi an { 4 5 public static void main ( String argv [ ] ) { 6 7 if ( argv . length < 3 ) { 8 System . out . println ( " Usage : java S impleGau ssian < input > < sigma > < output > " ) ; 9 return ; 10 } 11 12 org . itk . simple . I ma ge Fi l eR ea de r reader = new org . itk . simple . I ma ge Fi l eR ea de r ( ) ; 13 reader . setFileName ( argv [ 0 ] ) ; 14 Image img = reader . execute ( ) ; 15 16 S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r filter = 17 new S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r ( ) ; 18 filter . setSigma ( Double . valueOf ( argv [ 1 ] ) . doubleValue ( ) ) ; 19 Image blurredImg = filter . execute ( img ) ; 20 21 Ca s tI ma ge F il te r caster = new C as tI ma g eF il te r ( ) ; 22 caster . s e t O u t p u t P i x e l T y p e ( img . g et Pi xe l ID Va lu e ( ) ) ; 23 Image castImg = caster . execute ( blurredImg ) ; 24 25 Im a ge Fi le W ri te r writer = new I ma ge Fi l eW ri te r ( ) ; 26 writer . setFileName ( argv [ 2 ] ) ; 27 writer . execute ( castImg ) ; 28 29 } 30 31 } (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 135 / 142 Lua 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 if #arg < 3 then print ( ” Usage : Simpl eGaussia n <input> <sigma> <output>” ) os . exit ( 1 ) end reader = SimpleITK . I ma ge Fi l eR ea de r ( ) -- Re m e m b e r that Lua arrays are 1 - based , -- and that arg does not contain the a p p l i c a t i o n name ! reader : SetFileName ( arg [ 1 ] ) image = reader : Execute ( ) ; in putPixe lType = image : G et Pi xe l ID Va lu e ( ) gaussian = SimpleITK . S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r ( ) gaussian : SetSigma ( arg [ 2 ] ) image = gaussian : Execute ( image ) ; caster = SimpleITK . C as tI ma g eF il te r ( ) ; caster : S e t O u t p u t P i x e l T y p e ( input PixelTy pe ) ; image = caster : Execute ( image ) writer = SimpleITK . I ma ge Fi l eW ri te r ( ) writer : SetFileName ( arg [ 3 ] ) writer : Execute ( image ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 136 / 142 Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import SimpleITK as sitk import sys if len ( sys . argv ) < 4 : print " Usage : Sim pleGauss ian < input > < sigma > < output > " ; sys . exit ( 1 ) reader = sitk . I ma ge Fi l eR ea de r ( ) reader . SetFileName ( sys . argv [ 1 ] ) image = reader . Execute ( ) pixelID = image . G et Pi xe l ID Va lu e ( ) gaussian = sitk . S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r ( ) gaussian . SetSigma ( float ( sys . argv [ 2 ] ) ) image = gaussian . Execute ( image ) caster = sitk . C as tI ma g eF il te r ( ) caster . S e t O u t p u t P i x e l T y p e ( pixelID ) image = caster . Execute ( image ) writer = sitk . I ma ge Fi l eW ri te r ( ) writer . SetFileName ( sys . argv [ 3 ] ) writer . Execute ( image ) ; (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 137 / 142 Tcl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 if { $argc < 3 } { puts " Usage: Simpl eGaussia n < input > < sigma > < output > " exit 1 } I ma ge Fi l eR ea de r reader reader SetFileName [ lindex $argv 0 ] set image [ reader Execute ] set pixelID [ $image G et P ix el ID V al ue ] S m o o t h i n g R e c u r s i v e G a u s s i a n I m a g e F i l t e r gaussian gaussian SetSigma [ lindex $argv 1 ] set image [ gaussian Execute $image ] Ca s tI ma ge F il te r caster caster S e t O u t p u t P i x e l T y p e $pixelID set image [ caster Execute $image ] Im a ge Fi le W ri te r writer writer SetFileName [ lindex $argv 2 ] writer Execute $image # Tcl r e q u i r e s e x p l i c i t cleanup Cleanup reader -delete gaussian -delete caster -delete $image -delete writer -delete (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 138 / 142 Conclusion Conclusion (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 139 / 142 Wrap-up Gentle introduction to ITK Introduce SimpleITK Provide hands-on experience Problem solving, not direction following (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 140 / 142 Where to go next Some resources for using and extending SimpleITK Home Page http://www.simpleitk.org Documentation http://www.itk.org/SimpleITKDoxygen/html/ Conventions http: //www.itk.org/SimpleITKDoxygen/html/Conventions.html Contributions http://www.itk.org/SimpleITKDoxygen/html/Developer.html (Insight Software Consortium) SimpleITK - MICCAI 2011 Sept 2011 141 / 142