]> Creatis software - clitk.git/blobdiff - tools/clitkDicom2Image.cxx
Debug: correct wrong flag in condition
[clitk.git] / tools / clitkDicom2Image.cxx
index c7b2e23f076420ecac828eba3bde2a5aa541dd0e..aa63b0489bd50505255c2610640e8bbb4615c70e 100644 (file)
 ===========================================================================**/
 
 // clitk includes
+#include "clitkIO.h"
 #include "clitkDicom2Image_ggo.h"
 #include "clitkCommon.h"
 #include "clitkImageCommon.h"
 #include "vvImageReader.h"
 #include "vvImageWriter.h"
 #include <gdcmFile.h>
+#include <vtkVersion.h>
 #include <vtkImageChangeInformation.h>
-#if GDCM_MAJOR_VERSION == 2
+#if GDCM_MAJOR_VERSION >= 2
   #include <gdcmImageHelper.h>
   #include <gdcmAttribute.h>
   #include <gdcmReader.h>
@@ -37,6 +39,8 @@ int main(int argc, char * argv[])
 {
   // init command line
   GGO(clitkDicom2Image, args_info);
+  CLITK_INIT;
+
   std::vector<std::string> input_files;
   ///if std_input is given, read the input files from stdin
   if (args_info.std_input_given) {
@@ -57,13 +61,22 @@ int main(int argc, char * argv[])
   int series_number = -1;
   std::set<int> series_numbers;
   std::map< int, std::vector<double> > theorigin;
+  std::map< int, std::vector<double> > theorientation;
   std::map< int, std::vector<double> > sliceLocations;
   std::map< int, std::vector<std::string> > seriesFiles;
+#if GDCM_MAJOR_VERSION >= 2
+  if (args_info.verbose_flag)
+    std::cout << "Using GDCM-2.x" << std::endl;
+#else
+  if (args_info.verbose_flag) {
+    std::cout << "Not using GDCM-2.x" << std::endl;
+    std::cout<< "The image orientation is not supported with this version of GDCM" <<std::endl;
+  }
+#endif
   for(unsigned int i=0; i<args_info.inputs_num; i++) {
-    //std::cout << "Reading <" << input_files[i] << std::endl;
-#if GDCM_MAJOR_VERSION == 2
     if (args_info.verbose_flag)
-      std::cout << "Using GDCM-2.x" << std::endl;
+        std::cout << "Reading <" << input_files[i] << std::endl;
+#if GDCM_MAJOR_VERSION >= 2
     gdcm::Reader hreader;
     hreader.SetFileName(input_files[i].c_str());
     hreader.Read();
@@ -71,26 +84,38 @@ int main(int argc, char * argv[])
 
     if (args_info.extract_series_flag) {
       gdcm::Attribute<0x20,0x11> series_number_att;
-      series_number_att.SetFromDataSet(hreader.GetFile().GetDataSet());
+      series_number_att.SetFromDataSet(ds);
       series_number = series_number_att.GetValue();
     }
-    
+
     series_numbers.insert(series_number);
     theorigin[series_number] = gdcm::ImageHelper::GetOriginValue(hreader.GetFile());
-    sliceLocations[series_number].push_back(theorigin[series_number][2]);
+    theorientation[series_number] = gdcm::ImageHelper::GetDirectionCosinesValue(hreader.GetFile());
+    if (args_info.patientSystem_flag) {
+      double n1 = theorientation[series_number][1]*theorientation[series_number][5]-
+                  theorientation[series_number][2]*theorientation[series_number][4];
+      double n2 = theorientation[series_number][3]*theorientation[series_number][2]-
+                  theorientation[series_number][5]*theorientation[series_number][0];
+      double n3 = theorientation[series_number][0]*theorientation[series_number][4]-
+                  theorientation[series_number][1]*theorientation[series_number][3];
+      double sloc = theorigin[series_number][0]*n1+
+                    theorigin[series_number][1]*n2+
+                    theorigin[series_number][2]*n3;
+      sliceLocations[series_number].push_back(sloc);
+    } else
+      sliceLocations[series_number].push_back(theorigin[series_number][2]);
     seriesFiles[series_number].push_back(input_files[i]);
-    
+
     gdcm::Attribute<0x28, 0x100> pixel_size;
     pixel_size.SetFromDataSet(ds);
-    if (pixel_size.GetValue() != 16)
-    {
-      std::cerr << "Pixel type 2 bytes ! " << std::endl;
-      std::cerr << "In file " << input_files[i] << std::endl;
-      exit(0);
-    }
+    /* if (pixel_size.GetValue() != 16)
+       {
+       std::cerr << "Pixel type not 2 bytes ! " << std::endl;
+       std::cerr << "In file " << input_files[i] << std::endl;
+       exit(0);
+       }
+    */
 #else
-    if (args_info.verbose_flag)
-      std::cout << "Not using GDCM-2.x" << std::endl;
   gdcm::File *header = new gdcm::File();
   header->SetFileName(input_files[i]);
   header->SetMaxSizeLoadEntry(16384); // required ?
@@ -99,7 +124,7 @@ int main(int argc, char * argv[])
   if (args_info.extract_series_flag) {
     series_number = atoi(header->GetEntryValue(0x20,0x11).c_str());
   }
-  
+
   series_numbers.insert(series_number);
   theorigin[series_number].resize(3);
   theorigin[series_number][0] = header->GetXOrigin();
@@ -107,11 +132,12 @@ int main(int argc, char * argv[])
   theorigin[series_number][2] = header->GetZOrigin();
   sliceLocations[series_number].push_back(theorigin[series_number][2]);
   seriesFiles[series_number].push_back(input_files[i]);
-  if (header->GetPixelSize() != 2) {
+  /*if (header->GetPixelSize() != 2) {
     std::cerr << "Pixel type 2 bytes ! " << std::endl;
     std::cerr << "In file " << input_files[i] << std::endl;
     exit(0);
   }
+  */
 #endif
   }
 
@@ -124,7 +150,7 @@ int main(int argc, char * argv[])
     std::vector<std::string> files = seriesFiles[*sn];
     std::vector<int> sliceIndex;
     clitk::GetSortedIndex(locs, sliceIndex);
-    if (args_info.verboseSliceLocation_flag) {
+    if (args_info.verbose_flag) {
       std::cout << locs[sliceIndex[0]] << " -> "
                 << sliceIndex[0] << " / " << 0 << " => "
                 << "0 mm "
@@ -180,7 +206,7 @@ int main(int argc, char * argv[])
       std::cerr << reader->GetLastError() << std::endl;
       return 1;
     }
-    
+
     vvImage::Pointer image = reader->GetOutput();
     vtkImageData* vtk_image = image->GetFirstVTKImageData();
     vtkImageChangeInformation* modifier = vtkImageChangeInformation::New();
@@ -189,7 +215,11 @@ int main(int argc, char * argv[])
       std::vector<int> size = image->GetSize();
       origin[0] = -spacing[0]*size[0]/2.0;
       origin[1] = -spacing[1]*size[1]/2.0;
+#if VTK_MAJOR_VERSION <= 5
       modifier->SetInput(vtk_image);
+#else
+      modifier->SetInputData(vtk_image);
+#endif
       modifier->SetOutputOrigin(origin[0], origin[1], locs[sliceIndex[0]]);
       modifier->Update();
       vvImage::Pointer focal_image = vvImage::New();
@@ -202,18 +232,24 @@ int main(int argc, char * argv[])
       outfile = args_info.output_arg;
     else {
       std::ostringstream name;
-      name << *sn << "_" << args_info.output_arg;
+      std::vector<std::string> directory = clitk::SplitFilename(args_info.output_arg);
+      if (directory.size() == 2)
+        name << directory[0] << "/" << *sn << "_" << directory[1];
+      else
+        name << *sn << "_" << args_info.output_arg;
       outfile = name.str();
     }
     vvImageWriter::Pointer writer = vvImageWriter::New();
     writer->SetInput(image);
+    if (args_info.patientSystem_flag && !image->GetTransform().empty())
+      writer->SetSaveTransform(true);
     writer->SetOutputFileName(outfile);
     writer->Update();
 
     modifier->Delete();
-    
+
     sn++;
   }
-  
+
   return 0;
 }