[1cac92]: / sitk_functions.py

Download this file

93 lines (87 with data), 4.4 kB

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Sep 11 12:23:12 2018
@author: Josefine
"""
import numpy as np
import random
import SimpleITK as sitk
def affine_rotate(img_sitk,label_sitk,min_value):
rotate = random.choice([-15,-10,10,15])
new_transform = sitk.AffineTransform(3)
new_transform = sitk.AffineTransform(new_transform)
matrix = np.array(new_transform.GetMatrix()).reshape((3,3))
radians_z = -np.pi * rotate / 180.
rotation = np.array([[np.cos(radians_z), -np.sin(radians_z),0],[np.sin(radians_z), np.cos(radians_z),0],[0,0,1]])
new_matrix = np.dot(rotation, matrix)
new_transform.SetMatrix(new_matrix.ravel())
interpolator = sitk.sitkNearestNeighbor
img_rot = sitk.Resample(img_sitk, new_transform,interpolator,min_value)
label_rot = sitk.Resample(label_sitk, new_transform,interpolator,0)
return [img_rot,label_rot]
def affine_shear(img_sitk,label_sitk,min_value):
shear = (random.uniform(-0.1,0.1), random.uniform(-0.1,0.1),random.uniform(-0.1,0.1))
new_transform = sitk.AffineTransform(3)
new_transform = sitk.AffineTransform(new_transform)
matrix = np.array(new_transform.GetMatrix()).reshape((3,3))
matrix[0,1] = -shear[0]
matrix[1,0] = -shear[1]
matrix[0,2] = -shear[1]
matrix[2,0] = -shear[0]
matrix[1,2] = -shear[2]
matrix[2,1] = -shear[2]
new_transform.SetMatrix(matrix.ravel())
interpolator = sitk.sitkNearestNeighbor
img_sh = sitk.Resample(img_sitk, new_transform,interpolator,min_value)
label_sh = sitk.Resample(label_sitk, new_transform,interpolator,0)
return [img_sh,label_sh]
def mult_and_add_intensity_fields(original_image):
'''
Modify the intensities using multiplicative and additive Gaussian bias fields.
'''
# Gaussian image with same meta-information as original (size, spacing, direction cosine)
# Sigma is half the image's physical size and mean is the center of the image.
sigma = random.uniform(0.5,3)
middel = random.uniform(1,3)
g_mult = sitk.GaussianSource(original_image.GetPixelIDValue(),
original_image.GetSize(),
[(sz-1)*spc/sigma for sz, spc in zip(original_image.GetSize(), original_image.GetSpacing())],
original_image.TransformContinuousIndexToPhysicalPoint(np.array(original_image.GetSize())/middel),
255,
original_image.GetOrigin(),
original_image.GetSpacing(),
original_image.GetDirection())
# Gaussian image with same meta-information as original (size, spacing, direction cosine)
# Sigma is 1/8 the image's physical size and mean is at 1/16 of the size
sigma = random.uniform(2,8)
middel = random.uniform(4,10)
g_add = sitk.GaussianSource(original_image.GetPixelIDValue(),
original_image.GetSize(),
[(sz-1)*spc/sigma for sz, spc in zip(original_image.GetSize(), original_image.GetSpacing())],
original_image.TransformContinuousIndexToPhysicalPoint(np.array(original_image.GetSize())/middel),
255,
original_image.GetOrigin(),
original_image.GetSpacing(),
original_image.GetDirection())
l1 = g_mult*original_image+g_add
return l1
def BSplineDeform(img, lab, dim, numcontrolpoints, stdDeform,min_value):
transfromDomainMeshSize=[numcontrolpoints]*dim
tx = sitk.BSplineTransformInitializer(img,transfromDomainMeshSize)
params = tx.GetParameters()
paramsNp=np.asarray(params,dtype=float)
paramsNp = paramsNp + np.random.randn(paramsNp.shape[0])*stdDeform
paramsNp[0:int(len(params)/3)]=0 #remove z deformations! The resolution in z is too bad
params=tuple(paramsNp)
tx.SetParameters(params)
resampler = sitk.ResampleImageFilter()
resampler.SetReferenceImage(img)
resampler.SetInterpolator(sitk.sitkNearestNeighbor) # ORIGINAL: sitk.sitkLinear
resampler.SetDefaultPixelValue(min_value)
resampler.SetTransform(tx)
resampler.SetDefaultPixelValue(min_value) # -1024 HU on CT image = air
outimgsitk = resampler.Execute(img)
resampler.SetDefaultPixelValue(0)
outlabsitk = resampler.Execute(lab)
return outimgsitk, outlabsitk