CBICA Toolkit  1.0.0
DicomIOManager.hxx
1 #include "DicomIOManager.h"
2 #include "itkImageSeriesReader.h"
3 #include "DicomSeriesReader.h"
4 #include "DicomImageReader.h"
5 #include "gdcmReader.h"
6 
7 template <class T>
9 {
10 
11 }
12 template <class T>
14 {
15 
16 }
17 template <class T>
19 {
20  this->m_dir = path;
21 }
22 template <class T>
24 {
25  bool loadStatus = false;
26 
27  NamesGeneratorType::Pointer nG = NamesGeneratorType::New();
28  nG->SetDirectory(this->m_dir);
29  std::vector<std::string> files = nG->GetInputFileNames();
30 
31  if (files.empty())
32  {
33  //! no files in the given directory
34  loadStatus = false;
35  }
36  else
37  {
38  //! get the first file in the given directory and check its pixel type
39  //! and component type so we can invoke the load with appropriate
40  //! template type
41  //std::string fname = files[0].absoluteFilePath().toStdString();
42  std::string fname = files[0].c_str();
43 
44  bool isDicom = this->IsDicom(fname);
45 
46  itk::ImageIOBase::Pointer imageIO;
47  itk::ImageIOBase::IOPixelType pixelType;
48  itk::ImageIOBase::IOComponentType componentType;
49  unsigned int dimensions;
50  bool canRead = this->CanReadFile(fname.c_str(),imageIO);
51  if (canRead && isDicom)
52  {
53  imageIO->SetFileName(fname);
54  imageIO->ReadImageInformation();
55  pixelType = imageIO->GetPixelType();
56  componentType = imageIO->GetComponentType();
57  dimensions = imageIO->GetNumberOfDimensions();
58 
59  if (pixelType == itk::ImageIOBase::SCALAR)
60  {
61  if (dimensions == 3)
62  {
63  switch (componentType)
64  {
65  case itk::ImageIOBase::SHORT:
66  {
67  using PixelType = short;
68  using ImageType = itk::Image<PixelType, T::ImageDimension>;
69  typename ImageType::Pointer img = ImageType::New();
70  bool readStatus = false;
71  DicomSeriesReader *serReader = new DicomSeriesReader();
72  serReader->SetDirectoryPath(this->m_dir);
73  img = serReader->ReadDicomSeries<ImageType>(readStatus);
74  if (readStatus)
75  {
76  m_image3d = ConvertImage3DToFloatImage3D<ImageType>(img);
77  loadStatus = true;
78  }
79  else
80  loadStatus = false;
81  delete serReader;
82  break;
83  }
84  case itk::ImageIOBase::USHORT:
85  {
86  using PixelType = unsigned short;
87  using ImageType = itk::Image<PixelType, T::ImageDimension>;
88  typename ImageType::Pointer img = ImageType::New();
89  bool readStatus = false;
90  DicomSeriesReader *serReader = new DicomSeriesReader();
91  serReader->SetDirectoryPath(this->m_dir);
92  img = serReader->ReadDicomSeries<ImageType>(readStatus);
93  if (readStatus)
94  {
95  m_image3d = ConvertImage3DToFloatImage3D<ImageType>(img);
96  loadStatus = true;
97  }
98  else
99  loadStatus = false;
100  delete serReader;
101  break;
102  }
103  case itk::ImageIOBase::INT:
104  {
105  using PType = int;
106  using ImageType = itk::Image<PType, T::ImageDimension>;
107  typename ImageType::Pointer img = ImageType::New();
108  bool readStatus = false;
109  DicomSeriesReader *serReader = new DicomSeriesReader();
110  serReader->SetDirectoryPath(this->m_dir);
111  img = serReader->ReadDicomSeries<ImageType>(readStatus);
112  if (readStatus)
113  {
114  m_image3d = ConvertImage3DToFloatImage3D<ImageType>(img);
115  loadStatus = true;
116  }
117  else
118  loadStatus = false;
119  delete serReader;
120  break;
121  }
122  case itk::ImageIOBase::UINT:
123  case itk::ImageIOBase::LONG:
124  case itk::ImageIOBase::LONGLONG:
125  case itk::ImageIOBase::ULONG:
126  case itk::ImageIOBase::ULONGLONG:
127  {
128  //! need this type of data
129  //! this needs to be handled when we get the data
130  loadStatus = false;
131  break;
132  }
133  case itk::ImageIOBase::CHAR:
134  {
135  //! need this type of data
136  //! this needs to be handled when we get the data
137  loadStatus = false;
138  break;
139  }
140  case itk::ImageIOBase::UCHAR:
141  {
142  //! need this type of data
143  //! this needs to be handled when we get the data
144  loadStatus = false;
145  break;
146  }
147  case itk::ImageIOBase::DOUBLE:
148  {
149  //! need this type of data
150  //! this needs to be handled when we get the data
151  loadStatus = false;
152  break;
153  }
154  case itk::ImageIOBase::FLOAT:
155  {
156  //! need this type of data
157  //! this needs to be handled when we get the data
158  loadStatus = false;
159  break;
160  }
161  default:
162  loadStatus = false;
163  break;
164  }
165  }
166  else if (dimensions == 2)
167  {
168  switch (componentType)
169  {
170  case itk::ImageIOBase::SHORT:
171  {
172  using PixelType = short;
173  using ImageType = itk::Image<PixelType, T::ImageDimension>;
174  typename ImageType::Pointer img = ImageType::New();
175  bool readStatus = false;
176  DicomImageReader *imgReader = new DicomImageReader();
177  imgReader->SetDirectoryPath(this->m_dir);
178  img = imgReader->ReadDicomImage<ImageType>(readStatus);
179  if (readStatus)
180  {
181  m_image3d = ConvertImage3DToFloatImage3D<ImageType>(img);
182  loadStatus = true;
183  }
184  else
185  loadStatus = false;
186  delete imgReader;
187  break;
188  }
189  case itk::ImageIOBase::USHORT:
190  {
191  using PixelType = unsigned short;
192  using ImageType = itk::Image<PixelType, T::ImageDimension>;
193  typename ImageType::Pointer img = ImageType::New();
194  bool readStatus = false;
195  DicomImageReader *imgReader = new DicomImageReader();
196  imgReader->SetDirectoryPath(this->m_dir);
197  img = imgReader->ReadDicomImage<ImageType>(readStatus);
198  if (readStatus)
199  {
200  m_image3d = ConvertImage3DToFloatImage3D<ImageType>(img);
201  loadStatus = true;
202  }
203  else
204  loadStatus = false;
205  delete imgReader;
206  break;
207  }
208  case itk::ImageIOBase::INT:
209  {
210  using PType = int;
211  using ImageType = itk::Image<PType, T::ImageDimension>;
212  typename ImageType::Pointer img = ImageType::New();
213  bool readStatus = false;
214  DicomImageReader *imgReader = new DicomImageReader();
215  imgReader->SetDirectoryPath(this->m_dir);
216  img = imgReader->ReadDicomImage<ImageType>(readStatus);
217  if (readStatus)
218  {
219  m_image3d = ConvertImage3DToFloatImage3D<ImageType>(img);
220  loadStatus = true;
221  }
222  else
223  loadStatus = false;
224  delete imgReader;
225  break;
226  }
227  case itk::ImageIOBase::UINT:
228  case itk::ImageIOBase::LONG:
229  case itk::ImageIOBase::LONGLONG:
230  case itk::ImageIOBase::ULONG:
231  case itk::ImageIOBase::ULONGLONG:
232  {
233  //! need this type of data
234  //! this needs to be handled when we get the data
235  loadStatus = false;
236  break;
237  }
238  case itk::ImageIOBase::CHAR:
239  {
240  //! need this type of data
241  //! this needs to be handled when we get the data
242  loadStatus = false;
243  break;
244  }
245  case itk::ImageIOBase::UCHAR:
246  {
247  //! need this type of data
248  //! this needs to be handled when we get the data
249  loadStatus = false;
250  break;
251  }
252  case itk::ImageIOBase::DOUBLE:
253  {
254  //! need this type of data
255  //! this needs to be handled when we get the data
256  loadStatus = false;
257  break;
258  }
259  case itk::ImageIOBase::FLOAT:
260  {
261  //! need this type of data
262  //! this needs to be handled when we get the data
263  loadStatus = false;
264  break;
265  }
266  default:
267  loadStatus = false;
268  break;
269  }
270  }
271  else
272  loadStatus = false;
273  }
274  else
275  loadStatus = false;
276  }
277  else
278  loadStatus = false;
279  }
280  return loadStatus;
281 }
282 
283 template<class T>
284 inline bool DicomIOManager<T>::IsDicom(std::string path)
285 {
286  return cbica::IsDicom(path);
287 }
288 
289 template<class T>
290 inline bool DicomIOManager<T>::CanReadFile(std::string path, itk::ImageIOBase::Pointer &imageIO)
291 {
292  imageIO = itk::ImageIOFactory::CreateImageIO(path.c_str(), itk::ImageIOFactory::ReadMode);
293  return imageIO->CanReadFile(path.c_str());
294 }
295 
296 template <class T>
297 template<class TInputImage>
298 typename T::Pointer DicomIOManager<T>::ConvertImage3DToFloatImage3D(typename TInputImage::Pointer image)
299 {
300  typedef itk::CastImageFilter<TInputImage, T> CastFilterType;
301  auto castFilter = CastFilterType::New();
302  castFilter->SetInput(image);
303  castFilter->Update();
304  return castFilter->GetOutput();
305 }
306 
307 template <class T>
308 typename T::Pointer DicomIOManager<T>::GetITKImage()
309 {
310  return m_image3d;
311 }
static bool IsDicom(std::string path)
check if file is dicom
Definition: DicomIOManager.hxx:284
void SetDirectoryPath(std::string path)
set the input directory containing dicom series
Definition: DicomIOManager.hxx:18
static bool CanReadFile(std::string path, itk::ImageIOBase::Pointer &imageIO)
check if file can be read or not and return the base imageIO if readable
Definition: DicomIOManager.hxx:290
TInputImage::Pointer ReadDicomSeries(bool &readStatus)
Read dicom series.
Definition: DicomSeriesReader.h:66
Definition: DicomSeriesReader.h:26
Definition: DicomIOManager.h:24
T::Pointer GetITKImage()
get the read dicom data as 3D float ITK image
Definition: DicomIOManager.hxx:308
bool LoadDicom()
load dicom data
Definition: DicomIOManager.hxx:23
T::Pointer ConvertImage3DToFloatImage3D(typename TInputImage::Pointer image)
helper to write itk image
Definition: DicomIOManager.hxx:298
TInputImage::Pointer ReadDicomImage(bool &readStatus)
Read dicom series.
Definition: DicomImageReader.h:66
void SetDirectoryPath(std::string path)
set the input directory containing dicom series
Definition: DicomImageReader.h:26