X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=itk%2FclitkSliceBySliceRelativePositionFilter.txx;h=a8a79ec85599d681518edfe869da79598fcbec60;hb=b3ceef81b4920547da235f23fb815736235381a5;hp=af9c4c5c35f3378e5d0c6e90c1da399c224acfab;hpb=f34fdef46fa656a1eb32271c0b9bf7d81bc7fc35;p=clitk.git diff --git a/itk/clitkSliceBySliceRelativePositionFilter.txx b/itk/clitkSliceBySliceRelativePositionFilter.txx index af9c4c5..a8a79ec 100644 --- a/itk/clitkSliceBySliceRelativePositionFilter.txx +++ b/itk/clitkSliceBySliceRelativePositionFilter.txx @@ -18,24 +18,8 @@ // clitk #include "clitkSegmentationUtils.h" -// #include "clitkBooleanOperatorLabelImageFilter.h" -// #include "clitkAutoCropFilter.h" -// #include "clitkResampleImageWithOptionsFilter.h" -// #include "clitkBooleanOperatorLabelImageFilter.h" #include "clitkExtractSliceFilter.h" -// // itk -// #include -// #include "itkStatisticsLabelMapFilter.h" -// #include "itkLabelImageToStatisticsLabelMapFilter.h" -// #include "itkRegionOfInterestImageFilter.h" -// #include "itkBinaryThresholdImageFilter.h" -// #include "itkBinaryErodeImageFilter.h" -// #include "itkBinaryBallStructuringElement.h" - -// // itk [Bloch et al] -// #include "RelativePositionPropImageFilter.h" - //-------------------------------------------------------------------- template clitk::SliceBySliceRelativePositionFilter:: @@ -45,7 +29,11 @@ SliceBySliceRelativePositionFilter(): { this->SetNumberOfRequiredInputs(2); SetDirection(2); - SetObjectBackgroundValue(0); + SetObjectBackgroundValue(0); + SetFuzzyThreshold(0.6); + SetOrientationType(RelPosFilterType::LeftTo); + SetIntermediateSpacing(10); + ResampleBeforeRelativePositionFilterOff(); } //-------------------------------------------------------------------- @@ -54,7 +42,8 @@ SliceBySliceRelativePositionFilter(): template void clitk::SliceBySliceRelativePositionFilter:: -SetInput(const ImageType * image) { +SetInput(const ImageType * image) +{ // Process object is not const-correct so the const casting is required. this->SetNthInput(0, const_cast(image)); } @@ -65,7 +54,8 @@ SetInput(const ImageType * image) { template void clitk::SliceBySliceRelativePositionFilter:: -SetInputObject(const ImageType * image) { +SetInputObject(const ImageType * image) +{ // Process object is not const-correct so the const casting is required. this->SetNthInput(1, const_cast(image)); } @@ -76,7 +66,8 @@ SetInputObject(const ImageType * image) { template void clitk::SliceBySliceRelativePositionFilter:: -GenerateOutputInformation() { +GenerateOutputInformation() +{ ImagePointer input = dynamic_cast(itk::ProcessObject::GetInput(0)); ImagePointer outputImage = this->GetOutput(0); outputImage->SetRegions(input->GetLargestPossibleRegion()); @@ -88,7 +79,8 @@ GenerateOutputInformation() { template void clitk::SliceBySliceRelativePositionFilter:: -GenerateInputRequestedRegion() { +GenerateInputRequestedRegion() +{ // Call default itk::ImageToImageFilter::GenerateInputRequestedRegion(); // Get input pointers and set requested region to common region @@ -104,7 +96,8 @@ GenerateInputRequestedRegion() { template void clitk::SliceBySliceRelativePositionFilter:: -GenerateData() { +GenerateData() +{ // Get input pointer input = dynamic_cast(itk::ProcessObject::GetInput(0)); object = dynamic_cast(itk::ProcessObject::GetInput(1)); @@ -133,66 +126,102 @@ GenerateData() { else { DD("no pad"); } - + /* + - extract vector of slices in input, in object + - slice by slice rel position + - joint result + - post process + */ //-------------------------------------------------------------------- // Extract input slices StartNewStep("Extract input slices"); typedef clitk::ExtractSliceFilter ExtractSliceFilterType; - typename ExtractSliceFilterType::Pointer extractSliceFilter = Extractslicefilter::New(); + typename ExtractSliceFilterType::Pointer extractSliceFilter = ExtractSliceFilterType::New(); extractSliceFilter->SetInput(input); extractSliceFilter->SetDirection(GetDirection()); extractSliceFilter->Update(); typedef typename ExtractSliceFilterType::SliceType SliceType; - std::vector & mInputSlices = extractSliceFilter->GetOutput(); - DD(mInputSlices.size()); - StopCurrentStep(mInputSlices[5]); + std::vector mInputSlices; + extractSliceFilter->GetOutputSlices(mInputSlices); + StopCurrentStep(mInputSlices[0]); //-------------------------------------------------------------------- // Extract object slices - StartNewStep("Extract object slices"); - extractSliceFilter = Extractslicefilter::New(); - extractSliceFilter->SetInput(input); + extractSliceFilter = ExtractSliceFilterType::New(); + extractSliceFilter->SetInput(object); extractSliceFilter->SetDirection(GetDirection()); extractSliceFilter->Update(); - std::vector & mObjectSlices = extractSliceFilter->GetOutput(); - DD(mObjectSlices.size()); - StopCurrentStep(mInputSlices[5]); + std::vector mObjectSlices; + extractSliceFilter->GetOutputSlices(mObjectSlices); + StopCurrentStep(mObjectSlices[0]); - //-------------------------------------------------------------------- // Perform slice by slice relative position StartNewStep("Perform slice by slice relative position"); - for(int i=0; iGetOrigin()); + // writeImage(mInputSlices[i], "inp"+clitk::toString(i)+".mhd"); + + // Select main CC in each object slice : this should be the main bronchus + mObjectSlices[i] = Labelize(mObjectSlices[i], 0, true, 1); + mObjectSlices[i] = KeepLabels(mObjectSlices[i], 0, 1, 1, 1, true); + + // Relative position typedef clitk::AddRelativePositionConstraintToLabelImageFilter RelPosFilterType; typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New(); relPosFilter->VerboseStepOff(); relPosFilter->WriteStepOff(); + relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId()); relPosFilter->SetInput(mInputSlices[i]); relPosFilter->SetInputObject(mObjectSlices[i]); - relPosFilter->SetOrientationType(GetOrientationType()); - relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing()); - relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold()); + relPosFilter->SetOrientationType(this->GetOrientationType()); + relPosFilter->SetIntermediateSpacing(this->GetIntermediateSpacing()); + relPosFilter->SetResampleBeforeRelativePositionFilter(this->GetResampleBeforeRelativePositionFilter()); + relPosFilter->SetFuzzyThreshold(this->GetFuzzyThreshold()); + relPosFilter->AutoCropOff(); // important ! because we join the slices after this loop relPosFilter->Update(); + // writeImage(relPosFilter->GetOutput(), "inp-after"+clitk::toString(i)+".mhd"); mInputSlices[i] = relPosFilter->GetOutput(); } - typedef itk::JoinSeriesImageFilter JointSeriesFilterType; - typename JointSeriesFilterType::Pointer jointFilter = JointSeriesFilterType::New(); - for(int i=0; iSetInput(i, mInputSlices[i]); + DD(this->GetIntermediateSpacing()); + DD(this->GetResampleBeforeRelativePositionFilter()); + DD("End slice"); + + typedef itk::JoinSeriesImageFilter JoinSeriesFilterType; + typename JoinSeriesFilterType::Pointer joinFilter = JoinSeriesFilterType::New(); + joinFilter->SetOrigin(input->GetOrigin()[GetDirection()]); + joinFilter->SetSpacing(input->GetSpacing()[GetDirection()]); + for(unsigned int i=0; iGetLargestPossibleRegion().GetIndex()); +// DD(mInputSlices[i]->GetLargestPossibleRegion().GetSize()); +// DD(mInputSlices[i]->GetRequestedRegion().GetIndex()); +// DD(mInputSlices[i]->GetRequestedRegion().GetSize()); + joinFilter->PushBackInput(mInputSlices[i]); + //SetInput(i, mInputSlices[i]); } - m_working_input = jointFilter->GetOutput(); + DD("before update"); + joinFilter->Update(); + DD("after update"); + m_working_input = joinFilter->GetOutput(); + + // Update the origin + DD(input->GetSpacing()); + DD(input->GetOrigin()); + DD(mInputSlices[0]->GetSpacing()); + DD(mInputSlices[0]->GetOrigin()); DD(m_working_input->GetSpacing()); DD(m_working_input->GetOrigin()); + // typename ImageType::PointType origin = m_working_input->GetOrigin(); +// origin[GetDirection()] = input->GetOrigin()[GetDirection()]; +// m_working_input->SetOrigin(origin); +// DD(m_working_input->GetOrigin()); StopCurrentStep(m_working_input); - */ - - //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Final Step -> set output