X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=Example%2FexConvert3DplusT.cxx;h=a994d2fd1f901665a49acd27f6b28442c3a7139d;hb=d0f6827609a499057f4bad725522060590af3d82;hp=5e3eafc7861d058a4bda1169baec8320367ef9ac;hpb=88d171f185620221627d10d9f59cb0856df098c0;p=gdcm.git diff --git a/Example/exConvert3DplusT.cxx b/Example/exConvert3DplusT.cxx index 5e3eafc7..a994d2fd 100755 --- a/Example/exConvert3DplusT.cxx +++ b/Example/exConvert3DplusT.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: exConvert3DplusT.cxx,v $ Language: C++ - Date: $Date: 2006/07/19 09:03:24 $ - Version: $Revision: 1.1 $ + Date: $Date: 2008/02/13 19:02:39 $ + Version: $Revision: 1.6 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -13,12 +13,11 @@ This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. - =========================================================================*/ // // This program is used to convert huge amounts of functionnal (3D + T) MR images // into 'image tiles' (one title per volume) processable by clinical softwares -// +// #include "gdcmFile.h" #include "gdcmFileHelper.h" #include "gdcmCommon.h" @@ -33,7 +32,7 @@ #include // for memset int main(int argc, char *argv[]) -{ +{ START_USAGE(usage) "\n exConvert3plusT :\n ", " Converts the Dicom files inside a single-level Directory ", @@ -52,7 +51,7 @@ int main(int argc, char *argv[]) " [pixelsize = ] [imagesinvolume = ] ", " ", " studyUID : *aware* user wants to add the serie ", - " to an already existing study ", + " to an already existing study ", " imdimx,imdimy : 'elementary image' size (default : 64) ", " used to reject erroneous images ", " imgline, imgcol : sizes of the 'image tile' defaulted as 6x6 ", @@ -66,12 +65,8 @@ int main(int argc, char *argv[]) " verbose : user wants to run the program in 'verbose mode' ", " debug : developper wants to run the program in 'debug mode' ", FINISH_USAGE - - // ----- Initialize Arguments Manager ------ - - gdcm::ArgMgr *am = new gdcm::ArgMgr(argc, argv); - + GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv); if (am->ArgMgrDefined("usage") || argc == 1) { am->ArgMgrUsage(usage); // Display 'usage' @@ -80,24 +75,23 @@ int main(int argc, char *argv[]) } if (am->ArgMgrDefined("debug")) - gdcm::Debug::DebugOn(); + GDCM_NAME_SPACE::Debug::DebugOn(); int verbose = am->ArgMgrDefined("verbose"); int oververbose = am->ArgMgrDefined("oververbose"); - std::string patName = am->ArgMgrGetString("patname", "g^PatientName"); //float zSpacing = am->ArgMgrGetFloat("zSpacing", 1.0); - - const char *dirIn = am->ArgMgrGetString("dirin"); + + const char *dirIn = am->ArgMgrGetString("dirin"); const char *dirOut = am->ArgMgrGetString("dirout"); - + bool userDefinedStudy = am->ArgMgrDefined("studyUID"); const char *studyUID = am->ArgMgrGetString("studyUID"); -// not described *on purpose* in the Usage ! - bool userDefinedSerie = am->ArgMgrDefined("serieUID"); - const char *serieUID = am->ArgMgrGetString("serieUID"); - +// not described *on purpose* in the Usage ! + bool userDefinedSerie = am->ArgMgrDefined("serieUID"); + const char *serieUID = am->ArgMgrGetString("serieUID"); + int imageDimX = am->ArgMgrGetInt("imdimx",64); int imageDimY = am->ArgMgrGetInt("imdimy",64); int imagePixelSize = am->ArgMgrGetInt("pixelsize", 2); @@ -106,17 +100,17 @@ int main(int argc, char *argv[]) int nbOfImagesInVolume = am->ArgMgrGetInt("imagesinvolume", imagetteLineNumber*imagetteRowNumber); - int loadMode = gdcm::LD_ALL; + int loadMode = GDCM_NAME_SPACE::LD_ALL; if ( am->ArgMgrDefined("noshadowseq") ) - loadMode |= gdcm::LD_NOSHADOWSEQ; - else + loadMode |= GDCM_NAME_SPACE::LD_NOSHADOWSEQ; + else { if ( am->ArgMgrDefined("noshadow") ) - loadMode |= gdcm::LD_NOSHADOW; + loadMode |= GDCM_NAME_SPACE::LD_NOSHADOW; if ( am->ArgMgrDefined("noseq") ) - loadMode |= gdcm::LD_NOSEQ; + loadMode |= GDCM_NAME_SPACE::LD_NOSEQ; } - + /* if unused Param we give up */ if ( am->ArgMgrPrintUnusedLabels() ) { @@ -126,40 +120,35 @@ int main(int argc, char *argv[]) } delete am; // ------ we don't need Arguments Manager any longer ------ - // ====== Deal with a (single level, single Patient) Directory ====== - - //std::cout << "dirIn [" << dirIn << "]" << std::endl; - if ( ! gdcm::DirList::IsDirectory(dirIn) ) + if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(dirIn) ) { std::cout << "KO : [" << dirIn << "] is not a Directory." << std::endl; return 0; - } else { if (verbose) std::cout << "OK : [" << dirIn << "] is a Directory." << std::endl; - } - + } + std::string systemCommand; - std::string strDirNameout(dirOut); // to please gcc 4 + std::string strDirNameout(dirOut); // to please gcc 4 if (verbose) std::cout << "Check for output directory :[" << dirOut << "]." <SetLoadMode(loadMode); - f->SetFileName( it->c_str() ); + f[imageNumber] = GDCM_NAME_SPACE::File::New( ); + f[imageNumber]->SetLoadMode(loadMode); + f[imageNumber]->SetFileName( it->c_str() ); if (verbose) - std::cout << "file [" << it->c_str() << "]" << std::endl; - if ( !f->Load() ) + std::cout << "file [" << it->c_str() << "], as imageNumber : " << imageNumber << std::endl; + + if ( !f[imageNumber]->Load() ) { if (verbose) - std::cout << "fail to load [" << it->c_str() << "]" << std::endl; - f->Delete(); + std::cout << "fail to load [" << it->c_str() << "]" << std::endl; + f[imageNumber]->Delete(); continue; } - // Load the pixels in RAM. - - fh = gdcm::FileHelper::New(f); + // Load the pixels in RAM. + + fh[imageNumber] = GDCM_NAME_SPACE::FileHelper::New(f[imageNumber]); // Don't convert (Gray Pixels + LUT) into (RGB pixels) ?!? - tabImageData[imageNumber] = (int16_t *)fh->GetImageDataRaw(); + tabImageData[imageNumber] = (int16_t *)fh[imageNumber]->GetImageDataRaw(); if (!tabImageData[imageNumber]) { std::cout << "fail to read [" << it->c_str() << std::endl; @@ -250,9 +237,8 @@ int main(int argc, char *argv[]) } int16_t mini=32000; int16_t maxi=-32000; - - if (imageNumber == nbOfImagesInVolume) - { + if (imageNumber == nbOfImagesInVolume-1) + { for(imageNumber=0; imageNumber < nbOfImagesInVolume; imageNumber++) { int debMove = (imageNumber%imagetteRowNumber) * imageDimX @@ -260,7 +246,6 @@ int main(int argc, char *argv[]) if (verbose) std::cout << "imageNumber " << imageNumber << " debMove " << debMove << std::endl; - for(int i=0; i 100) imageTable[debLigne + j]=100; //std::cout << debLigne + j << " : " << imageTable[debLigne + j] << std::endl; - if (*(tabImageData[imageNumber] + i*imageDimY + j) < mini) mini=*(tabImageData[imageNumber] + i*imageDimY + j); else if (*(tabImageData[imageNumber] + i*imageDimY + j) > maxi) maxi=*(tabImageData[imageNumber] + i*imageDimY + j); } - } + } } // if (oververbose) // std::cout << " mini = " << mini << " maxi = " << maxi << std::endl; - // just to check (actually, it's useless) + // just to check (actually, it's useless) /* int16_t mini=32000; int16_t maxi=-32000; for (int k=0; k < totalNumberOfPixels; k++) { if (imageTable[k] < mini) mini=imageTable[k]; - else if (imageTable[k] > maxi) maxi=imageTable[k]; + else if (imageTable[k] > maxi) maxi=imageTable[k]; } // if (oververbose) @@ -314,76 +296,77 @@ int main(int argc, char *argv[]) // Set the image size str.str(""); str << imageDimX*imagetteRowNumber; - fh->InsertEntryString(str.str(),0x0028,0x0011, "US"); // Columns + fh[imageNumber]->InsertEntryString(str.str(),0x0028,0x0011, "US"); // Columns str.str(""); str << imageDimY*imagetteLineNumber; - fh->InsertEntryString(str.str(),0x0028,0x0010, "US"); // Rows + fh[imageNumber]->InsertEntryString(str.str(),0x0028,0x0010, "US"); // Rows - fh->InsertEntryString(strStudyUID,0x0020,0x000d,"UI"); - fh->InsertEntryString(strSerieUID,0x0020,0x000e,"UI"); - fh->InsertEntryString(patName,0x0010,0x0010, "PN"); // Patient's Name + fh[imageNumber]->InsertEntryString(strStudyUID,0x0020,0x000d,"UI"); + fh[imageNumber]->InsertEntryString(strSerieUID,0x0020,0x000e,"UI"); + fh[imageNumber]->InsertEntryString(patName,0x0010,0x0010, "PN"); // Patient's Name - fh->SetImageData((uint8_t *)imageTable, totalNumberOfPixels * imagePixelSize); + fh[imageNumber]->SetImageData((uint8_t *)imageTable, totalNumberOfPixels * imagePixelSize); // ================================================================================================== // This is a dirty heuristics, but no other way :-( // if Image Orientation (Patient) is not present -// I create one, (as Axial) +// I create one, (as Axial) // if Image Position (Patient) is not present // I create one, incrementing zPositionComponent up by user supplied zSpacing -// if Slice Location is not present +// if Slice Location is not present // I create one, as zPositionComponent // -// Aware use is free to supply his own one ! +// Aware user is free to supply his own one ! /* - if (! f->CheckIfEntryExist(0x0020,0x0037) ) // 0020 0037 DS 6 Image Orientation (Patient) + if (! f[imageNumber]->CheckIfEntryExist(0x0020,0x0037) ) // 0020 0037 DS 6 Image Orientation (Patient) { - fh->InsertEntryString("1.0\\0.0\\0.0\\0.0\\1.0\\0.0",0x0020,0x0037, "DS"); //[1\0\0\0\1\0] : Axial + fh[imageNumber]->InsertEntryString("1.0\\0.0\\0.0\\0.0\\1.0\\0.0",0x0020,0x0037, "DS"); //[1\0\0\0\1\0] : Axial char charImagePosition[256]; - sprintf(charImagePosition,"%f\\0.0\\0.0",zPositionComponent); zPositionComponent += zSpacing; - - if (! f->CheckIfEntryExist(0x0020,0x0032) ) //0020 0032 DS 3 Image Position (Patient) - fh->InsertEntryString(charImagePosition,0x0020,0x0032, "DS"); - - if (! f->CheckIfEntryExist(0x0020,0x1041) ) // 0020 0x1041 DS 1 Slice Location + if (! f[imageNumber]->CheckIfEntryExist(0x0020,0x0032) ) //0020 0032 DS 3 Image Position (Patient) + fh[imageNumber]->InsertEntryString(charImagePosition,0x0020,0x0032, "DS"); + if (! f[imageNumber]->CheckIfEntryExist(0x0020,0x1041) ) // 0020 0x1041 DS 1 Slice Location { sprintf(charImagePosition,"%f",zPositionComponent); - fh->InsertEntryString(charImagePosition,0x0020,0x1041, "DS"); - } - } - + fh[imageNumber]->InsertEntryString(charImagePosition,0x0020,0x1041, "DS"); + } + } */ // ================================================================================================== - fh->SetWriteTypeToDcmExplVR(); - fh->SetContentType(gdcm::UNMODIFIED_PIXELS_IMAGE); + fh[imageNumber]->SetWriteTypeToDcmExplVR(); + fh[imageNumber]->SetContentType(GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE); - - lastFilename = gdcm::Util::GetName( fullFilename ); - std::string fullWriteFilename = strDirNameout + gdcm::GDCM_FILESEPARATOR + lastFilename = GDCM_NAME_SPACE::Util::GetName( fullFilename ); + std::string fullWriteFilename = strDirNameout + GDCM_NAME_SPACE::GDCM_FILESEPARATOR + lastFilename; if (verbose) std::cout << "Write : [" << fullWriteFilename << "]" << std::endl; - if (!fh->Write(fullWriteFilename)) + if (!fh[imageNumber]->Write(fullWriteFilename)) { std::cout << "Fail to write :[" << fullWriteFilename << "]" << std::endl; } - //break; + + for(int k=0; k < nbOfImagesInVolume; k++) + { + fh[k]->Delete(); + f[k]->Delete(); + } + } // end : 'write the imagette' - else + else // start a new 'volume' { imageNumber++; } - fh->Delete(); - f->Delete(); + } -} +} +