X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkDicom2Image.cxx;h=614c5d96b458c4905316142bd791d34df76632ca;hb=a384b1aa2ad35011b2741fca00a2a52e26b30e8f;hp=aa63b0489bd50505255c2610640e8bbb4615c70e;hpb=b7b8f2b040d1772c30c34653ee3fe0c27bc8fa71;p=clitk.git diff --git a/tools/clitkDicom2Image.cxx b/tools/clitkDicom2Image.cxx index aa63b04..614c5d9 100644 --- a/tools/clitkDicom2Image.cxx +++ b/tools/clitkDicom2Image.cxx @@ -23,6 +23,8 @@ #include "clitkImageCommon.h" #include "vvImageReader.h" #include "vvImageWriter.h" +#include +#include #include #include #include @@ -55,15 +57,25 @@ int main(int argc, char * argv[]) } else for (unsigned int i=0; iSetUseSeriesDetails(false); + std::string folderName="."; + const size_t last_slash_idx = input_files[0].rfind('/'); + if (std::string::npos != last_slash_idx) + folderName = input_files[0].substr(0, last_slash_idx); + nameGenerator->SetInputDirectory(folderName); //=========================================== /// Get slices locations ... - int series_number = -1; - std::set series_numbers; - std::map< int, std::vector > theorigin; - std::map< int, std::vector > theorientation; - std::map< int, std::vector > sliceLocations; - std::map< int, std::vector > seriesFiles; + std::string series_UID = ""; + std::set series_UIDs; + std::map< std::string, std::vector > theorigin; + std::map< std::string, std::vector > theorientation; + std::map< std::string, std::vector > sliceLocations; + std::map< std::string, std::vector > instanceNumber; + std::map< std::string, std::vector > seriesFiles; #if GDCM_MAJOR_VERSION >= 2 if (args_info.verbose_flag) std::cout << "Using GDCM-2.x" << std::endl; @@ -82,29 +94,31 @@ int main(int argc, char * argv[]) hreader.Read(); gdcm::DataSet& ds = hreader.GetFile().GetDataSet(); - if (args_info.extract_series_flag) { - gdcm::Attribute<0x20,0x11> series_number_att; - series_number_att.SetFromDataSet(ds); - series_number = series_number_att.GetValue(); - } + gdcm::Attribute<0x20,0x000e> series_UID_att; + series_UID_att.SetFromDataSet(ds); + series_UID = series_UID_att.GetValue().c_str(); - series_numbers.insert(series_number); - theorigin[series_number] = gdcm::ImageHelper::GetOriginValue(hreader.GetFile()); - theorientation[series_number] = gdcm::ImageHelper::GetDirectionCosinesValue(hreader.GetFile()); + series_UIDs.insert(series_UID); + theorigin[series_UID] = gdcm::ImageHelper::GetOriginValue(hreader.GetFile()); + theorientation[series_UID] = 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); + double n1 = theorientation[series_UID][1]*theorientation[series_UID][5]- + theorientation[series_UID][2]*theorientation[series_UID][4]; + double n2 = theorientation[series_UID][3]*theorientation[series_UID][2]- + theorientation[series_UID][5]*theorientation[series_UID][0]; + double n3 = theorientation[series_UID][0]*theorientation[series_UID][4]- + theorientation[series_UID][1]*theorientation[series_UID][3]; + double sloc = theorigin[series_UID][0]*n1+ + theorigin[series_UID][1]*n2+ + theorigin[series_UID][2]*n3; + sliceLocations[series_UID].push_back(sloc); } else - sliceLocations[series_number].push_back(theorigin[series_number][2]); - seriesFiles[series_number].push_back(input_files[i]); + 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); @@ -121,17 +135,15 @@ int main(int argc, char * argv[]) header->SetMaxSizeLoadEntry(16384); // required ? header->Load(); - if (args_info.extract_series_flag) { - series_number = atoi(header->GetEntryValue(0x20,0x11).c_str()); - } + series_UID = header->GetEntryValue(0x20,0x000e).c_str(); - series_numbers.insert(series_number); - theorigin[series_number].resize(3); - theorigin[series_number][0] = header->GetXOrigin(); - theorigin[series_number][1] = header->GetYOrigin(); - theorigin[series_number][2] = header->GetZOrigin(); - sliceLocations[series_number].push_back(theorigin[series_number][2]); - seriesFiles[series_number].push_back(input_files[i]); + series_UIDs.insert(series_UID); + theorigin[series_UID].resize(3); + theorigin[series_UID][0] = header->GetXOrigin(); + theorigin[series_UID][1] = header->GetYOrigin(); + theorigin[series_UID][2] = header->GetZOrigin(); + sliceLocations[series_UID].push_back(theorigin[series_UID][2]); + seriesFiles[series_UID].push_back(input_files[i]); /*if (header->GetPixelSize() != 2) { std::cerr << "Pixel type 2 bytes ! " << std::endl; std::cerr << "In file " << input_files[i] << std::endl; @@ -143,13 +155,36 @@ int main(int argc, char * argv[]) //=========================================== // Sort slices locations ... - std::set::iterator sn = series_numbers.begin(); - while ( sn != series_numbers.end() ) { + std::set::iterator sn = series_UIDs.begin(); + while ( sn != series_UIDs.end() ) { std::vector locs = sliceLocations[*sn]; std::vector origin = theorigin[*sn]; + std::vector instanceNumberSerie = instanceNumber[*sn]; std::vector files = seriesFiles[*sn]; - std::vector sliceIndex; - clitk::GetSortedIndex(locs, sliceIndex); + std::vector sliceIndex(files.size()); + //clitk::GetSortedIndex(locs, sliceIndex); + //Look for files into GDCMSeriesFileNames, because it sorts files correctly and take the order + const std::vector & temp = nameGenerator->GetFileNames(*sn); + for(unsigned int i=0; i " << sliceIndex[0] << " / " << 0 << " => " @@ -194,13 +229,33 @@ int main(int argc, char * argv[]) // Create ordered vector of filenames std::vector sorted_files; sorted_files.resize(sliceIndex.size()); - for(unsigned int i=0; i::iterator maxInstanceNumber = std::max_element(instanceNumberSerie.begin(), instanceNumberSerie.end()); + std::vector instanceNumberTemp(*maxInstanceNumber, ""); + for(unsigned int i=0; iSetInputFilenames(sorted_files); + reader->SetPatientCoordinateSystem(args_info.patientSystem_flag); reader->Update(vvImageReader::DICOM); if (reader->GetLastError().size() != 0) { std::cerr << reader->GetLastError() << std::endl; @@ -228,7 +283,7 @@ int main(int argc, char * argv[]) } std::string outfile; - if (series_numbers.size() == 1) + if (series_UIDs.size() == 1) outfile = args_info.output_arg; else { std::ostringstream name;