Commit 70d41721ccfcf24423efb76f3cf8ec81d59f22ce

Authored by tatiana
1 parent b2ea3928

ENH: Organized functions related to DICOM group selection/reconstruction

Showing 1 changed file with 58 additions and 85 deletions   Show diff stats
invesalius/reader/dicom_reader.py
@@ -26,15 +26,19 @@ import gdcm @@ -26,15 +26,19 @@ import gdcm
26 import constants as const 26 import constants as const
27 import dicom 27 import dicom
28 import dicom_grouper 28 import dicom_grouper
29 -from data.imagedata_utils import ResampleImage2D 29 +import data.imagedata_utils as iu
30 30
31 def LoadImages(dir_): 31 def LoadImages(dir_):
32 - # TODO!!! SUPER GAMBIARRA!!! DO THIS BETTER  
33 32
34 - patient_group = GetDicomFiles(dir_)  
35 - print "1111111111111"  
36 - #select the series with the largest  
37 - #number of slices. 33 + patient_group = GetDicomGroups(dir_)
  34 + filelist, dicom, zspacing = SelectLargerDicomGroup(patient_group)
  35 + filelist = SortFiles(filelist, dicom)
  36 + imagedata = CreateImageData(filelist, zspacing)
  37 +
  38 + return imagedata, dicom
  39 +
  40 +
  41 +def SelectLargerDicomGroup(patient_group):
38 nslices_old = 0 42 nslices_old = 0
39 for patient in patient_group: 43 for patient in patient_group:
40 group_list = patient.GetGroups() 44 group_list = patient.GetGroups()
@@ -43,107 +47,76 @@ def LoadImages(dir_): @@ -43,107 +47,76 @@ def LoadImages(dir_):
43 print "nslices:", nslices 47 print "nslices:", nslices
44 if (nslices >= nslices_old): 48 if (nslices >= nslices_old):
45 dicoms = group.GetList() 49 dicoms = group.GetList()
46 - spacing = group.spacing 50 + zspacing = group.zspacing
47 nslices_old = nslices 51 nslices_old = nslices
48 - print "22222222222222"  
49 -  
50 - file_list = []  
51 - for dicom in dicoms:  
52 - file_list.append(dicom.image.file)  
53 -  
54 52
  53 + filelist = []
  54 + for dicom in dicoms:
  55 + filelist.append(dicom.image.file)
  56 + return filelist, dicom, zspacing
55 57
56 - #Coronal Crash. necessary verify 58 +def SortFiles(filelist, dicom):
  59 + # Sort slices
  60 + # FIXME: Coronal Crash. necessary verify
57 if (dicom.image.orientation_label <> "CORONAL"): 61 if (dicom.image.orientation_label <> "CORONAL"):
58 #Organize reversed image 62 #Organize reversed image
59 sorter = gdcm.IPPSorter() 63 sorter = gdcm.IPPSorter()
60 sorter.SetComputeZSpacing(True) 64 sorter.SetComputeZSpacing(True)
61 sorter.SetZSpacingTolerance(1e-10) 65 sorter.SetZSpacingTolerance(1e-10)
62 - sorter.Sort(file_list) 66 + sorter.Sort(filelist)
63 67
64 #Getting organized image 68 #Getting organized image
65 - files = sorter.GetFilenames() 69 + filelist = sorter.GetFilenames()
66 70
67 - print "33333333333" 71 + return filelist
68 72
69 - array = vtk.vtkStringArray()  
70 73
71 - img_app = vtk.vtkImageAppend()  
72 - img_app.SetAppendAxis(2) #Define Stack in Z 74 +def CreateImageData(filelist, zspacing):
73 75
74 if not(const.REDUCE_IMAGEDATA_QUALITY): 76 if not(const.REDUCE_IMAGEDATA_QUALITY):
75 - print "not reduce"  
76 - for x in xrange(len(files)):  
77 - array.InsertValue(x,files[x])  
78 -  
79 - read = vtkgdcm.vtkGDCMImageReader()  
80 - read.SetFileNames(array)  
81 - read.Update()  
82 -  
83 - image_data = vtk.vtkImageData()  
84 - image_data.DeepCopy(read.GetOutput())  
85 -  
86 - image_data.SetSpacing(spacing) 77 + array = vtk.vtkStringArray()
  78 + for x in xrange(len(filelist)):
  79 + array.InsertValue(x,filelist[x])
  80 +
  81 + reader = vtkgdcm.vtkGDCMImageReader()
  82 + reader.SetFileNames(array)
  83 + reader.Update()
  84 +
  85 + # The zpacing is a DicomGroup property, so we need to set it
  86 + imagedata = vtk.vtkImageData()
  87 + imagedata.DeepCopy(reader.GetOutput())
  88 + spacing = imagedata.GetSpacing()
  89 + imagedata.SetSpacing(spacing[0], spacing[1], zspacing)
87 else: 90 else:
88 - print "reduce"  
89 - for x in xrange(len(files)):  
90 - #SIf the resolution of the  
91 - #matrix is very large  
92 - read = vtkgdcm.vtkGDCMImageReader()  
93 - read.SetFileName(files[x])  
94 - read.Update() 91 + # Reformat each slice and future append them
  92 + appender = vtk.vtkImageAppend()
  93 + appender.SetAppendAxis(2) #Define Stack in Z
  94 +
  95 + # Reformat each slice
  96 + for x in xrange(len(filelist)):
  97 + # TODO: We need to check this automatically according
  98 + # to each computer's architecture
  99 + # If the resolution of the matrix is too large
  100 + reader = vtkgdcm.vtkGDCMImageReader()
  101 + reader.SetFileName(filelist[x])
  102 + reader.Update()
95 103
96 #Resample image in x,y dimension 104 #Resample image in x,y dimension
97 - img = ResampleImage2D(read.GetOutput(), 256) 105 + slice_imagedata = iu.ResampleImage2D(reader.GetOutput(), 256)
98 106
99 #Stack images in Z axes 107 #Stack images in Z axes
100 - img_app.AddInput(img)  
101 - img_app.Update()  
102 - 108 + appender.AddInput(slice_imagedata)
  109 + appender.Update()
103 110
104 - print "444444444444444"  
105 - image_data = vtk.vtkImageData()  
106 - image_data.DeepCopy(img_app.GetOutput())  
107 - image_data.SetSpacing(image_data.GetSpacing()[0],\  
108 - image_data.GetSpacing()[1], spacing)  
109 - print "555555555" 111 + # The zpacing is a DicomGroup property, so we need to set it
  112 + imagedata = vtk.vtkImageData()
  113 + imagedata.DeepCopy(appender.GetOutput())
  114 + spacing = imagedata.GetSpacing()
110 115
111 - image_data.Update()  
112 - print "66666666666666" 116 + imagedata.SetSpacing(spacing[0], spacing[1], zspacing)
113 117
114 - return image_data, dicom  
115 -  
116 -def GetDicomFilesOld(path, recursive = False):  
117 - # TODO!!! SUPER GAMBIARRA!!! DO THIS BETTER  
118 - """  
119 - Separate only files of a DICOM Determined  
120 - directory. You can go recursively within  
121 - the directory. (recursive = True)  
122 - """  
123 - result = []  
124 -  
125 - if (recursive == True):  
126 -  
127 - if os.path.isdir(path) and not os.path.islink(path):  
128 -  
129 - files = os.listdir(path)  
130 -  
131 - for file in files:  
132 - path_ = os.path.join(path, file)  
133 - FindDicom(path_, True)  
134 - else:  
135 - read_dicom = dicom.Parser()  
136 - if(read_dicom.SetFileName(path)):  
137 - if (read_dicom.GetImagePosition()):  
138 - result.append(path)  
139 - else:  
140 - files = glob.glob(path + os.sep + "*")  
141 - for x in xrange(len(files)):  
142 - read_dicom = dicom.Parser()  
143 - if (read_dicom.SetFileName(files[x])):  
144 - result.append(files[x])  
145 - # TODO!!! SUPER GAMBIARRA!!! DO THIS BETTER  
146 - return result 118 + imagedata.Update()
  119 + return imagedata
147 120
148 def GetSeries(path): 121 def GetSeries(path):
149 """ 122 """
@@ -157,7 +130,7 @@ def GetSeries(path): @@ -157,7 +130,7 @@ def GetSeries(path):
157 130
158 return dcm_series.GetOutput() 131 return dcm_series.GetOutput()
159 132
160 -def GetDicomFiles(directory, recursive=True): 133 +def GetDicomGroups(directory, recursive=True):
161 """ 134 """
162 Return all full paths to DICOM files inside given directory. 135 Return all full paths to DICOM files inside given directory.
163 """ 136 """