In [1]:
    
%matplotlib inline
import matplotlib.pyplot as plt
import dicom
import os
import shutil 
import time
import numpy as np
    
This function generates a new unique UID for our new image
In [2]:
    
def generate_new_UID():
    UID_prefix = "1.2.826.0.1.3680043.8.707" # change this if your not me!
    currentTime = (str(time.time()))
    time1, time2 = currentTime.split(".")
    UID = UID_prefix +"."+ time1 + ".1"+time2  # need to include the .1 to ensure UID element cannot start with 0
    time.sleep(2) # wait 1 second to ensure ech UID is different
    return UID
    
The next two functions perform a Poisson resampling of the image data. The first resamples each individual pixel. This was the way I did it in my python script that I wrote for the MSc project:
In [3]:
    
def half_time_values(oldImage):
	newImage = np.zeros_like(oldImage)
	for i in range(0, oldImage.shape[0]):
		for j in range(0, oldImage.shape[1]):
			origValue = oldImage[i,j]
			newValue=(origValue/2)
			Value = np.random.poisson(newValue)
			newImage[i,j] = Value		# write the value to newImage
	return newImage
    
Some time later I realised that you could perform the resampling on the complete array (which should be much faster)
In [4]:
    
def half_time_array(oldImage):
    newImage=(oldImage/2)
    newImage = np.random.poisson(newImage)
    return newImage
    
First we need to import our dataset using the dicom library
In [5]:
    
ds = dicom.read_file("testobject.dcm")
    
We can then display this using imshow on the pixel_array
In [6]:
    
image1 = plt.imshow(ds.pixel_array, cmap='bone')
image1.axes.xaxis.set_visible(False)
image1.axes.yaxis.set_visible(False);
    
    
max() gives us the maximum pixel value for this image:
In [7]:
    
ds.pixel_array.max()
    
    Out[7]:
the ipython %timeit command allows use to time the execution of each of our poisson resamplaing routines:
In [8]:
    
%timeit newImage = half_time_values(ds.pixel_array)
%timeit newImage2 = half_time_array(ds.pixel_array)
    
    
Doing the resampling on the entire array is much faster. We can then create a resampled copy of our original image
In [9]:
    
newImage2 = half_time_array(ds.pixel_array)
image2 = plt.imshow(newImage2, cmap='bone')
    
    
In [10]:
    
newImage2.max()
    
    Out[10]:
The maximum value in our image is now approximately half the value of the original as expected
In [11]:
    
newImage2.min()
    
    Out[11]:
In [ ]: