Commit 70d41721ccfcf24423efb76f3cf8ec81d59f22ce
1 parent
b2ea3928
Exists in
master
and in
6 other branches
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 | """ |