X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkImage2DicomDoseGenericFilter.txx;h=df105fadfd1a75e1838d057dbd39ee6b9fdb0edb;hb=ae51e9bb80bdcd9468718a9473c1e9316cef2fd5;hp=a349c7485791f1c6198df4ed1d95ac8d9352fd5d;hpb=b35856bdd1f55ef597d2a761597f58504b076c6b;p=clitk.git diff --git a/tools/clitkImage2DicomDoseGenericFilter.txx b/tools/clitkImage2DicomDoseGenericFilter.txx index a349c74..df105fa 100644 --- a/tools/clitkImage2DicomDoseGenericFilter.txx +++ b/tools/clitkImage2DicomDoseGenericFilter.txx @@ -31,6 +31,9 @@ #include "clitkImage2DicomDoseGenericFilter.h" #include "clitkCommon.h" +#include "itkMinimumMaximumImageCalculator.h" +#include "itkImageRegionIterator.h" +#include "itkImageRegionConstIterator.h" #if GDCM_MAJOR_VERSION >= 2 #include "gdcmUIDGenerator.h" #include @@ -135,13 +138,16 @@ void Image2DicomDoseGenericFilter::UpdateWithDimAndPixelType() { -#if GDCM_MAJOR_VERSION == 2 +#if GDCM_MAJOR_VERSION >= 2 // ImageTypes typedef itk::Image InputImageType; - typedef itk::Image OutputImageType; + typedef unsigned short int OutputPixelType; + typedef itk::Image OutputImageType; typedef itk::ImageFileReader< InputImageType > ReaderType; typedef itk::ImageSeriesReader< InputImageType > ReaderSeriesType; + typedef itk::ImageSeriesWriter WriterSerieType; typedef itk::ImageRegionIterator< InputImageType > IteratorType; + typedef itk::MinimumMaximumImageCalculator ImageCalculatorFilterType; typedef itk::GDCMImageIO ImageIOType; //----------------------------------------------------------------------------- @@ -183,6 +189,13 @@ Image2DicomDoseGenericFilter::UpdateWithDimAndPixelType() itk::EncapsulateMetaData(*outputDict, "0020|0032", value.str()); DD(origin); + // orientation + typename InputImageType::DirectionType direction = image->GetDirection(); + value.str(""); + value<(*outputDict, "0020|0037", value.str()); + DD(direction); + // size typename InputImageType::SizeType imageSize = image->GetLargestPossibleRegion().GetSize(); //DD(imageSize); @@ -219,54 +232,38 @@ Image2DicomDoseGenericFilter::UpdateWithDimAndPixelType() DD(value.str()); // scaling - float highestValue=pow(10,-10); - IteratorType out( image, image->GetRequestedRegion() ); - for (out.GoToBegin(); !out.IsAtEnd(); ++out){ - //DD(out.Get()); - if (out.Get()>highestValue) highestValue=out.Get(); - } - double doseScaling = 0.0003080821;//highestValue/(pow(2,16)-1); + typename ImageCalculatorFilterType::Pointer imageCalculatorFilter = ImageCalculatorFilterType::New(); + imageCalculatorFilter->SetImage(image); + imageCalculatorFilter->ComputeMaximum(); + float highestValue=imageCalculatorFilter->GetMaximum(); + double doseScaling = highestValue/(pow(2,16)-1); value.str(""); value<(*outputDict, "3004|000e", value.str()); DD(value.str()); // image data - /*std::vector ImageData; - typename InputImageType::IndexType pixelIndex; - int l=0; - unsigned short int pixelValue; - //DD(highestValue); - for (int i=0; iGetPixel(pixelIndex)/doseScaling; - if(float(image->GetPixel(pixelIndex)/doseScaling)>(pow(2,16)-1.)) { - std::cout<<"\n!!!!! WARNING !!!!! pixel index: "< Highest value may become 0"<GetPixel(pixelIndex)); - //DD(image->GetPixel(pixelIndex)/doseScaling); - DD(pixelValue); - std::cout<<"Pixel Value should be equal to "<<(pow(2,16)-1)<<" but should not be 0"<SetRegions(image->GetLargestPossibleRegion()); + imageOutput->SetSpacing(image->GetSpacing()); + imageOutput->SetOrigin(image->GetOrigin()); + imageOutput->SetDirection(image->GetDirection()); + imageOutput->Allocate(); + + typename itk::ImageRegionConstIterator imageIterator(image,image->GetLargestPossibleRegion()); + typename itk::ImageRegionIterator imageOutputIterator(imageOutput,imageOutput->GetLargestPossibleRegion()); + while(!imageIterator.IsAtEnd()) { + // Set the current pixel to white + imageOutputIterator.Set((signed short int)(imageIterator.Get()/doseScaling)); + + ++imageIterator; + ++imageOutputIterator; } - DD(ImageData.size());*/ // Output directory and filenames - typedef itk::ImageSeriesWriter WriterSerieType; typename WriterSerieType::Pointer writerSerie = WriterSerieType::New(); outputArray.push_back(outputDict); - writerSerie->SetInput( image ); + writerSerie->SetInput( imageOutput ); writerSerie->SetImageIO( gdcmIO ); typename ReaderSeriesType::FileNamesContainer fileNamesOutput; fileNamesOutput.push_back(filename_out); @@ -283,6 +280,36 @@ Image2DicomDoseGenericFilter::UpdateWithDimAndPixelType() std::cerr << excp << std::endl; } + //Read sequence dicom tag with gdcm + gdcm::Reader readerTemplateGDCM; + readerTemplateGDCM.SetFileName( fileNames[0].c_str() ); + readerTemplateGDCM.Read(); + gdcm::File &fileTemplate = readerTemplateGDCM.GetFile(); + gdcm::DataSet &dsTemplate = fileTemplate.GetDataSet(); + const unsigned int ptr_len = 42; + char *ptrTemplate = new char[ptr_len]; + memset(ptrTemplate,0,ptr_len); + + const gdcm::DataElement &referenceRTPlanSq = dsTemplate.GetDataElement(gdcm::Tag(0x300c, 0x02)); + + //Create the Dose Grid Scaling data element (ITK 4.13 do not take into account - it works well with ITK 4.5.1) + gdcm::DataElement deDoseGridScaling( gdcm::Tag(0x3004,0x0e) ); + deDoseGridScaling.SetVR( gdcm::VR::DS ); + deDoseGridScaling.SetByteValue(NumberToString(doseScaling).c_str(), (uint32_t)strlen(NumberToString(doseScaling).c_str())); + + //Copy/Write sequence dicom tag with gdcm + gdcm::Reader readerOutputGDCM; + readerOutputGDCM.SetFileName( fileNamesOutput[0].c_str() ); + readerOutputGDCM.Read(); + gdcm::File &file = readerOutputGDCM.GetFile(); + gdcm::DataSet &dsOutput = file.GetDataSet(); + + dsOutput.Insert(referenceRTPlanSq); + dsOutput.Replace(deDoseGridScaling); + gdcm::Writer w; + w.SetFile( file ); + w.SetFileName( fileNamesOutput[0].c_str() ); + w.Write(); //--------------------------------------------------------------------------------------- //WRITE DICOM BIS