]> Creatis software - clitk.git/commitdiff
Add instanceNumber sorting for clitkDicom2Image
authortbaudier <thomas.baudier@creatis.insa-lyon.fr>
Thu, 28 Feb 2019 13:05:14 +0000 (14:05 +0100)
committertbaudier <thomas.baudier@creatis.insa-lyon.fr>
Thu, 28 Feb 2019 13:05:14 +0000 (14:05 +0100)
Sometimes (eg: with MR from HEH), the basic algorithm is not sufficient to sort dicom slices
It is the case when multiples sequences are in the same image, the z position is the same for a same slice in all sequences, it creates conflict
In such a case, we can sort slices according instanceNumber

tools/clitkDicom2Image.cxx
tools/clitkDicom2Image.ggo

index 38e8aa3d4889f51dd049e97bcf7caa7104431d94..e705f85ca7e68fb6dd2a733cb67a3ea252f73d23 100644 (file)
@@ -74,6 +74,7 @@ int main(int argc, char * argv[])
   std::map< std::string, std::vector<double> > theorigin;
   std::map< std::string, std::vector<double> > theorientation;
   std::map< std::string, std::vector<double> > sliceLocations;
+  std::map< std::string, std::vector<double> > instanceNumber;
   std::map< std::string, std::vector<std::string> > seriesFiles;
 #if GDCM_MAJOR_VERSION >= 2
   if (args_info.verbose_flag)
@@ -115,6 +116,10 @@ int main(int argc, char * argv[])
       sliceLocations[series_UID].push_back(theorigin[series_UID][2]);
     seriesFiles[series_UID].push_back(input_files[i]);
 
+    gdcm::Attribute<0x20,0x0013> instanceNumber_att;
+    instanceNumber_att.SetFromDataSet(ds);
+    instanceNumber[series_UID].push_back(instanceNumber_att.GetValue());
+
     gdcm::Attribute<0x28, 0x100> pixel_size;
     pixel_size.SetFromDataSet(ds);
     /* if (pixel_size.GetValue() != 16)
@@ -154,6 +159,7 @@ int main(int argc, char * argv[])
   while ( sn != series_UIDs.end() ) {
     std::vector<double> locs = sliceLocations[*sn];
     std::vector<double> origin = theorigin[*sn];
+    std::vector<double> instanceNumberSerie = instanceNumber[*sn];
     std::vector<std::string> files = seriesFiles[*sn];
     std::vector<int> sliceIndex(files.size());
     //clitk::GetSortedIndex(locs, sliceIndex);
@@ -223,8 +229,22 @@ int main(int argc, char * argv[])
     // Create ordered vector of filenames
     std::vector<std::string> sorted_files;
     sorted_files.resize(sliceIndex.size());
-    for(unsigned int i=0; i<sliceIndex.size(); i++)
-      sorted_files[i] = files[ sliceIndex[i] ];
+    if (!args_info.instanceNumber_flag) {
+      for(unsigned int i=0; i<sliceIndex.size(); i++)
+        sorted_files[i] = files[ sliceIndex[i] ];
+    } else {
+      std::vector<double>::iterator maxInstanceNumber = std::max_element(instanceNumberSerie.begin(), instanceNumberSerie.end());
+      std::vector<std::string> instanceNumberTemp(*maxInstanceNumber, "");
+      for(unsigned int i=0; i<instanceNumberSerie.size(); i++)
+        instanceNumberTemp[instanceNumberSerie[i]-1] = files[i];
+      unsigned int fillFiles(0);
+      for(unsigned int i=0; i<instanceNumberTemp.size(); i++) {
+          if (instanceNumberTemp[i] != "") {
+            sorted_files[fillFiles] = instanceNumberTemp[i];
+            ++fillFiles;
+          }
+       }
+    }
 
     //===========================================
     // Read write serie
index fd678f96b4c53aabdf296c6ba615b86fb0aa3d46..049ff988004eae400dd220af82d5d1669e0bd847 100644 (file)
@@ -9,3 +9,4 @@ option "output"         o "Output image filename"               string  yes
 option "std_input"      - "Take the like of input file from stdin, to support huge lists of filenames" flag off
 option "focal_origin"   - "Output files with FOCAL-like origin, instead of the origin present in the dicom files" flag off
 option "patientSystem"  p "Open the image with patient coordinate system" flag off
+option "instanceNumber" n "Sort the images regarding instance number in dicom tag" flag off