#ifndef _itkNaryElevateImageFilter_txx #define _itkNaryElevateImageFilter_txx #include "stdio.h" #include "itkNaryElevateImageFilter.h" #include "itkMetaDataDictionary.h" #include "itkImageRegionIteratorWithIndex.h" namespace itk { // helper function to get the value of a specific tag double gettagvalue(std::string &entryId, MetaDataDictionary &metaDict) { ExceptionObject ex("invalid tag value"); MetaDataDictionary::ConstIterator tagItr=metaDict.Find(entryId); if (tagItr!=metaDict.End()) { typedef MetaDataObject MetaDataStringType; MetaDataObjectBase::Pointer entry=tagItr->second; MetaDataStringType::Pointer entryvalue= dynamic_cast(entry.GetPointer()); if (entryvalue) { std::string tagvalue=entryvalue->GetMetaDataObjectValue(); float value; if (sscanf(tagvalue.c_str(),"%g",&value)!=1) throw ex; else return(value); } } else throw ex; return(0.0); } // constructor template NaryElevateImageFilter:: NaryElevateImageFilter() { m_DataMin=0.0f; m_DataMax=0.0f; m_DataMean=0.0f; m_NoiseThres=0.0f; } // check inputs template void NaryElevateImageFilter:: GenerateOutputInformation() { const unsigned int dimI=InputImageDimension; const unsigned int dimO=OutputImageDimension; if (dimOGetOutput(0); const unsigned int numberOfInputImages = static_cast(this->GetNumberOfInputs()); for (int i=0; i(ProcessObject::GetInput(i)); InputImageRegionType regionI=inputPtr->GetRequestedRegion(); InputImageSizeType sizeI = regionI.GetSize(); InputImageIndexType indexI = regionI.GetIndex(); InputImageOriginType originI = inputPtr->GetOrigin(); InputImageSpacingType spacingI = inputPtr->GetSpacing(); OutputImageSizeType sizeO; OutputImageIndexType indexO; OutputImageOriginType originO; OutputImageSpacingType spacingO; if (i==0) { for (int j=0; jSetOrigin(originO); outputPtr->SetSpacing(spacingO); outputPtr->SetRegions(regionO); } else for (int j=0; j(ProcessObject::GetInput(0)); outputPtr->SetMetaDataDictionary(inputPtr0->GetMetaDataDictionary()); // retrieve all time points as list: typedef MetaDataDictionary DictionaryType; std::list list; double firstdate; double firsttime; int firsthour; int firstminutes; double firstseconds; bool dontusedict=false; for (int i=0; i(ProcessObject::GetInput(i)); DictionaryType &metaDict=inputPtr->GetMetaDataDictionary(); if (metaDict.Begin()==metaDict.End() || dontusedict) { ExceptionObject ex("invalid time series"); if (i>0 && !dontusedict) throw ex; list.push_back(i); // assume that time points are given in minutes dontusedict=true; continue; } std::string entryIdAD="0008|0022"; // acquisition date std::string entryIdAT="0008|0032"; // acquisition time std::string entryIdAN="0020|0012"; // aquisition number double entryAD=gettagvalue(entryIdAD,metaDict); double entryAT=gettagvalue(entryIdAT,metaDict); if (i==0) { firstdate=entryAD; firsttime=entryAT; firsthour=(int)(firsttime/10000)%100; firstminutes=(int)(firsttime/100)%100; firstseconds=firsttime-100*((int)firsttime/100); list.push_back(0.0); } else { double date=entryAD; double time=entryAT; int hour=(int)(time/10000)%100; int minutes=(int)(time/100)%100; double seconds=time-100*((int)time/100); // assume that if date differs we have just passed midnight if (date!=firstdate) { hour+=24; firstdate=date; } double difference=(seconds-firstseconds)+ 60.0*(minutes-firstminutes)+ 3600.0*(hour-firsthour); list.push_back(difference/60.0); // minutes } } // encapsulate list into MetaDataObject and append to MetaDataDictionary: typedef MetaDataObject< std::list > MetaDataListType; MetaDataListType::Pointer value=MetaDataListType::New(); value->SetMetaDataObjectValue(list); std::string internalId="___internal-4D-filter-time-point-list"; // internal tag DictionaryType &metaDict=outputPtr->GetMetaDataDictionary(); metaDict[internalId]=value; } // elevate inputs template void NaryElevateImageFilter:: GenerateData() { const unsigned int dimI=InputImageDimension; const unsigned int dimO=OutputImageDimension; OutputImagePointer outputPtr = this->GetOutput(0); const unsigned int numberOfInputImages = static_cast(this->GetNumberOfInputs()); typedef ImageRegionConstIteratorWithIndex ImageRegionConstIteratorWithIndexType; std::vector inputItrVector(numberOfInputImages); for (int i=0; i(ProcessObject::GetInput(i)); inputPtr->Update(); ImageRegionConstIteratorWithIndexType *inputItr = new ImageRegionConstIteratorWithIndexType(inputPtr, inputPtr->GetBufferedRegion()); inputItrVector[i] = reinterpret_cast(inputItr); inputItrVector[i]->GoToBegin(); } // get time point list from meta dictionary: typedef MetaDataDictionary DictionaryType; DictionaryType &metaDict=outputPtr->GetMetaDataDictionary(); std::string internalId="___internal-4D-filter-time-point-list"; // internal tag MetaDataDictionary::ConstIterator tagItr=metaDict.Find(internalId); ExceptionObject ex("invalid time point list"); Array timePoints; timePoints.SetSize(numberOfInputImages); if (tagItr!=metaDict.End()) { typedef MetaDataObject< std::list > MetaDataListType; MetaDataObjectBase::Pointer entry = tagItr->second; MetaDataListType::Pointer entryvalue = dynamic_cast( entry.GetPointer() ); // check whether or not the type of the entry value is correct if (entryvalue) { std::list list; list=entryvalue->GetMetaDataObjectValue(); if (list.size()!=numberOfInputImages) throw ex; std::list::const_iterator listItr=list.begin(); for (int k=0; kAllocate(); m_DataMin=NumericTraits::max(); m_DataMax=NumericTraits::min(); m_DataMean=0.0f; unsigned int meancount=0; m_NoiseThres=0.0f; unsigned int noisecount=0; InputImageIndexType indexI; OutputImageIndexType indexO; for (int i=dimI+1; iIsAtEnd()) { indexI=inputItrVector[0]->GetIndex(); for (int j=0; j::max(); float rndgrad=0.0f; float last_fvalue=0.0f,lastlast_fvalue=0.0f; NaryInputType values; values.set_size(numberOfInputImages); // get actual time series for (int inputNumber=0; inputNumberGet(); values[inputNumber]=value; ++(*inputItrVector[inputNumber]); } // push actual time series through elevate functor NaryOutputType result; result.SetSize(numberOfInputImages); m_Functor(values,timePoints,result); // check actual time series for (int inputNumber=0; inputNumber(value); if (fvaluem_DataMax) m_DataMax=fvalue; mean_fvalue+=fvalue; if (inputNumber>1) { float grad=last_fvalue-lastlast_fvalue; if (grad<0.0f) grad=-grad; if (gradSetPixel(indexO, result[inputNumber]); } mean_fvalue/=numberOfInputImages; if (++meancount>1) m_DataMean*=float(meancount-1)/meancount; m_DataMean+=mean_fvalue/meancount; m_NoiseThres+=rndgrad; noisecount++; } // clean up: for (int i=0; i