# Welcome to the SimpleITK Image Filtering Tutorial

This tutorial illustrates how to use some of the basic image filtering capabilities of SimpleITK.

## Importing SimpleITK

We start by importing the SimpleITK python module



In [1]:

import SimpleITK as sitk




---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-3dd12c25dd88> in <module>()
----> 1 import SimpleITK as sitk

ImportError: No module named SimpleITK



We download a specific image from the Figshare data sharing and hosting site



In [ ]:

import urllib
import os.path

destination = '/tmp/TralitusSaltrator.jpg'
source = 'http://files.figshare.com/1546044/IMG_0974.jpg'





In [ ]:

if not os.path.isfile(destination):
urllib.urlretrieve(source,destination)



Then we read in an image



In [ ]:



## Converting to Grayscale

Typical image fileformats such as PNG and JPG will be read as color images (three channels matching RGB components).



In [ ]:

image = sitk.VectorMagnitude(colorimage)



## Displaying the Image

We extract the pixel data in the form of a numpy array, that then we visualize using the Matplotlib python module



In [ ]:

imshow(sitk.GetArrayFromImage(image));



### Changing the Colormap

By default, imshow would use a rainbow colormap. We can change that by selecting from http://wiki.scipy.org/Cookbook/Matplotlib/Show_colormaps



In [ ]:

import matplotlib.pyplot as plt
import matplotlib.cm as cm

imshow(sitk.GetArrayFromImage(image),cmap=cm.gray);



Add cells here for experimenting with two other color maps from the SciPy wiki list above.

Note that you don't need to repeat the import of matplotlib modules.

Just call imshow() with different arguments in "cmap" color map.

## Smoothing Filters

Smooting is often used to reduce noise.

### Recursive Gaussian Smoothing

This is a relatively fast filter for smoothing an image along all directions.

Here we are showing off, how cool of equations we can add to the notebook

$$SI(x') = \int^\infty_\infty{I(x'-x) e^{-x^2}}$$

We need to specify the Sigma value of the Gaussian function to use.

Experiment with the values of Sigma and see its effect on the image.



In [ ]:

rgsmootherfilter = sitk.SmoothingRecursiveGaussianImageFilter()
rgsmootherfilter.SetSigma(2.5)
rgsmootherfilter.SetNormalizeAcrossScale(1)
rgsmoothedimage  = rgsmootherfilter.Execute(image)

imshow(sitk.GetArrayFromImage(rgsmoothedimage),cmap=cm.gray);



The parameters of the filter can also be passed directly to the Execute() function as:



In [ ]:

rgsmoothedimage  = rgsmootherfilter.Execute(image,3.5,1)

imshow(sitk.GetArrayFromImage(rgsmoothedimage),cmap=cm.gray);



### Median Image Filter

The Median filter is commonly used to provide robust smoothing of an image.

Its main parameter is the size of the neirborhood over which the median of pixels intensities is computed.

The neighborhood size is specified in terms of an integer number representing the radius of a Manhattan distance.

Therefore, a radius of 3 means that we will use a neighborhood of 7x7 pixels: 7 = 3 + 1 + 3

Experiment with the values of the Radius and see the effect on the smoothed image



In [ ]:

medianfilter = sitk.MedianImageFilter()
medianimage  = medianfilter.Execute(image)

imshow(sitk.GetArrayFromImage(medianimage),cmap=cm.gray);



The parameters of the filter can also be passed directly to the Execute() function. Note that the Radius could be different in the X and Y directions, therefore we must pass an array with two values.



In [ ]:

medianimage  = medianfilter.Execute(image,[3,3])

imshow(sitk.GetArrayFromImage(medianimage),cmap=cm.gray);



### Curvature Flow Filter

The Curvature flow filter applies a level set paradigm to the smoothin of a scalar image.

Its main parameters are the TimeStep and NumberOfIterations to use for performing the approximation of a solution to a differential equation.

• Increasing the number of iterations will increase the smoothing
• Reducing the time stop will improve the precision of the differential equation solution, but would require more iterations to produce the same amount of smoothing.

Experiment with the values of number of iterations and time step size.



In [ ]:

curvatureflowfilter = sitk.CurvatureFlowImageFilter()
curvatureflowfilter.SetTimeStep(0.01)
curvatureflowfilter.SetNumberOfIterations(30)
curvatureflowimage  = curvatureflowfilter.Execute(image)

imshow(sitk.GetArrayFromImage(curvatureflowimage),cmap=cm.gray);



The parameters of the filter can also be passed directly to the Execute() function as:



In [ ]:

rgsmootherfilter.SetSigma(2.5)

imshow(sitk.GetArrayFromImage(curvatureflowimage),cmap=cm.gray);



## Grayscale Morphology

Mathematical Morphology filters can be applied in Grayscale

### Grayscale Erosion

Based on a size of neighborhood type defined in the SetKernelType() method, and a neighborhood size defined in the SetKernelRadius() method.



In [ ]:

grayscale_erode_filter = sitk.GrayscaleErodeImageFilter()
grayscale_eroded_image = grayscale_erode_filter.Execute(image)
grayscale_erode_filter.SetKernelType(sitk.sitkBall)
imshow(sitk.GetArrayFromImage(grayscale_eroded_image),cmap=cm.gray);



### Grayscale Dilation

Based on a size of neighborhood type defined in the SetKernelType() method, and a neighborhood size defined in the SetKernelRadius() method.



In [ ]:

grayscale_dilate_filter = sitk.GrayscaleDilateImageFilter()
grayscale_dilate_image = grayscale_dilate_filter.Execute(image)
grayscale_dilate_filter.SetKernelType(sitk.sitkBall)
imshow(sitk.GetArrayFromImage(grayscale_dilate_image),cmap=cm.gray);



## Edge Detection

Filters commonly used in Edge Detection

### Canny Edge Detection

The classic Canny filter. We define the lower threshold for edge connections and the Variance of the smoothing component.



In [ ]:

canny_filter = sitk.CannyEdgeDetectionImageFilter()
float_image =  sitk.Cast(image, sitk.sitkFloat32)
canny_filter.SetLowerThreshold(50);
canny_filter.SetVariance(15);
canny_edges = canny_filter.Execute(float_image)
imshow(sitk.GetArrayFromImage(canny_edges),cmap=cm.gray);



In the Canny filter above, experiment with other values of

• The Variance
• The Lower Threshold

### Laplacian Recursive

The Laplacian Recursive Image filter is based on the RecursiveGaussianImageFilter, and its second derivatives. We define the Sigma value for the Gaussian.



In [ ]:

rglaplacianfilter = sitk.LaplacianRecursiveGaussianImageFilter()
rglaplacianfilter.SetSigma(2.5)
rglaplacianfilter.SetNormalizeAcrossScale(1)
rglaplacianimage  = rglaplacianfilter.Execute(image)

imshow(sitk.GetArrayFromImage(rglaplacianimage),cmap=cm.gray);



In the Laplacian filter above, experiment with other values of

• Sigma

## Thresholding Filters

Filters commonly used to threshold images.

### Otsu Threshold Image Filter

Computes a threshold value that maximizes the separation between classes in the histogram. Then applies this threshold the image.



In [ ]:

otsu_filter = sitk.OtsuThresholdImageFilter()
otsu_image = otsu_filter.Execute(image)
imshow(sitk.GetArrayFromImage(otsu_image),cmap=cm.gray);



## Voting Filters

These filters perform operations on binary images based on the counts (votes) of neighboring pixels.

### Hole Filling Filter

This filter is based on a Voting operation. It is useful to remove isolated pixels from the image



In [ ]:

hole_filling_filter = sitk.VotingBinaryHoleFillingImageFilter()
hole_filling_filter.SetMajorityThreshold(1)
hole_filling_filter.SetBackgroundValue(0)
hole_filling_filter.SetForegroundValue(1)
hole_filled_image = hole_filling_filter.Execute(otsu_image)
imshow(sitk.GetArrayFromImage(hole_filled_image),cmap=cm.gray);



### Iterative Voting Hole Filling Filter

Performs the filling operation multiple times until no pixels change, or maximum number of iterations is reached.



In [ ]:

hole_filling_filter = sitk.VotingBinaryIterativeHoleFillingImageFilter()
hole_filling_filter.SetMajorityThreshold(1)
hole_filling_filter.SetBackgroundValue(0)
hole_filling_filter.SetForegroundValue(1)
hole_filled_image = hole_filling_filter.Execute(otsu_image)
imshow(sitk.GetArrayFromImage(hole_filled_image),cmap=cm.gray);



In the Hole Filling filters above, experiment with the values of:

• Majority Threshold

# More Filters

Find more filters available in SimpleITK in the following documentation page

http://www.itk.org/SimpleITKDoxygen08/html/namespaceitk_1_1simple.html

Another way to see the full list of classes available in SimpleITK is to use the dir() function, as in:



In [ ]:

dir(sitk)