Pythonic Syntactic Sugar

The Image Basics Notebook was straight forward and closely follows ITK's C++ interface (albeit without those cumbersome templates).

Sugar is great it gives your energy to get things done faster! SimpleITK has applied a generous about of syntactic sugar to help get things done faster too.

In [1]:
import SimpleITK as sitk

Let us begin by developing a convenient method for displaying images in our notebooks.

In [2]:
img = sitk.GaussianSource(size=[64]*2)
imshow(sitk.GetArrayFromImage(img))
Out[2]:
<matplotlib.image.AxesImage at 0x11d376910>
In [3]:
img = sitk.GaborSource(size=[64]*2, frequency=.03)
imshow(sitk.GetArrayFromImage(img))
Out[3]:
<matplotlib.image.AxesImage at 0x11d3ada90>
In [4]:
def myshow(img):
    nda = sitk.GetArrayFromImage(img)
    imshow(nda)
myshow(img)

Multi-dimension slice indexing

If you are familiar with numpy, sliced index then this should be cake for the SimpleITK image. The Python standard slice interface for 1-D object:

Operation Result
d[i] ith item of d, starting index 0
d[i:j] slice of d from i to j
d[i:j:k] slice of d from i to j with step k

With this convient syntax many basic tasks can be easily done.

In [5]:
img[24,24]
Out[5]:
0.048901304602622986

Cropping

In [6]:
myshow(img[16:48,:])
In [7]:
myshow(img[:,16:-16])
In [8]:
myshow(img[:32,:32])

Flipping

In [9]:
img_corner = img[:32,:32]
myshow(img_corner)
In [10]:
myshow(img_corner[::-1,:])
In [11]:
myshow(sitk.Tile(img_corner, img_corner[::-1,::],img_corner[::,::-1],img_corner[::-1,::-1], [2,2]))

Slice Extraction

A 2D image can be extracted from a 3D one.

In [12]:
img = sitk.GaborSource(size=[64]*3, frequency=0.05)

# Why does this produce an error?
myshow(img)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-a990f90669fe> in <module>()
      2 
      3 # Why does this produce an error?
----> 4 myshow(img)

<ipython-input-4-8b0cddf8dfc0> in myshow(img)
      1 def myshow(img):
      2     nda = sitk.GetArrayFromImage(img)
----> 3     imshow(nda)
      4 myshow(img)

/Users/blowekamp/.virtualenvs/sitkpy/lib/python2.7/site-packages/matplotlib/pyplot.pyc in imshow(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, hold, **kwargs)
   2890                         vmax=vmax, origin=origin, extent=extent, shape=shape,
   2891                         filternorm=filternorm, filterrad=filterrad,
-> 2892                         imlim=imlim, resample=resample, url=url, **kwargs)
   2893         draw_if_interactive()
   2894     finally:

/Users/blowekamp/.virtualenvs/sitkpy/lib/python2.7/site-packages/matplotlib/axes.pyc in imshow(self, X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, shape, filternorm, filterrad, imlim, resample, url, **kwargs)
   7298                        filterrad=filterrad, resample=resample, **kwargs)
   7299 
-> 7300         im.set_data(X)
   7301         im.set_alpha(alpha)
   7302         self._set_artist_props(im)

/Users/blowekamp/.virtualenvs/sitkpy/lib/python2.7/site-packages/matplotlib/image.pyc in set_data(self, A)
    427         if (self._A.ndim not in (2, 3) or
    428             (self._A.ndim == 3 and self._A.shape[-1] not in (3, 4))):
--> 429             raise TypeError("Invalid dimensions for image data")
    430 
    431         self._imcache = None

TypeError: Invalid dimensions for image data
In [13]:
myshow(img[:,:,32])
In [14]:
myshow(img[16,:,:])

Super Sampling

In [15]:
myshow(img[:,::3,32])

Mathematical Operators

Most python mathematical operators are overloaded to call the SimpleITK filter which does that same operation on a per-pixel basis. They can operate on a two images or an image and a scalar.

If two images are used then both must have the same pixel type. The output image type is ussually the same.

As these operators basically call ITK filter, which just use raw C++ operators, care must be taked to prevent overflow, and divide by zero etc.

Operators
+
-
*
/
//
**
In [16]:
img = sitk.ReadImage("Data/cthead1.png")
img = sitk.Cast(img,sitk.sitkFloat32)
myshow(img)
img[150,150]
Out[16]:
140.0
In [17]:
timg = img**2
myshow(timg)
timg[150,150]
Out[17]:
19600.0

Division Operators

All three Python division operators are implemented __floordiv__, __truediv__, and __div__.

The true division's output is a double pixle type.

See PEP 238 to see why Python changed the division operator in Python 3.

Bitwise Logic Operators

Operators
&
|
^
~
In [18]:
img = sitk.ReadImage("Data/cthead1.png")
myshow(img)
In [18]:

Comparative Operators

Operators
>
>=
<
<=
==

These comparative operators follow the same convention as the reset of SimpleITK for binary images. They have the pixel type of sitkUInt8 with values of 0 and 1.

In [19]:
img = sitk.ReadImage("Data/cthead1.png")
myshow(img)
In [19]:

Amazingly make common trivial tasks really trivial

In [20]:
myshow(img>90)
In [21]:
myshow(img>150)
In [22]:
myshow((img>90)+(img>150))