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 26 import constants as const
27 27 import dicom
28 28 import dicom_grouper
29   -from data.imagedata_utils import ResampleImage2D
  29 +import data.imagedata_utils as iu
30 30  
31 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 42 nslices_old = 0
39 43 for patient in patient_group:
40 44 group_list = patient.GetGroups()
... ... @@ -43,107 +47,76 @@ def LoadImages(dir_):
43 47 print "nslices:", nslices
44 48 if (nslices >= nslices_old):
45 49 dicoms = group.GetList()
46   - spacing = group.spacing
  50 + zspacing = group.zspacing
47 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 61 if (dicom.image.orientation_label <> "CORONAL"):
58 62 #Organize reversed image
59 63 sorter = gdcm.IPPSorter()
60 64 sorter.SetComputeZSpacing(True)
61 65 sorter.SetZSpacingTolerance(1e-10)
62   - sorter.Sort(file_list)
  66 + sorter.Sort(filelist)
63 67  
64 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 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 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 104 #Resample image in x,y dimension
97   - img = ResampleImage2D(read.GetOutput(), 256)
  105 + slice_imagedata = iu.ResampleImage2D(reader.GetOutput(), 256)
98 106  
99 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 121 def GetSeries(path):
149 122 """
... ... @@ -157,7 +130,7 @@ def GetSeries(path):
157 130  
158 131 return dcm_series.GetOutput()
159 132  
160   -def GetDicomFiles(directory, recursive=True):
  133 +def GetDicomGroups(directory, recursive=True):
161 134 """
162 135 Return all full paths to DICOM files inside given directory.
163 136 """
... ...