]> Creatis software - clitk.git/blobdiff - segmentation/clitkExtractMediastinumFilter.txx
some segmentation tools (most from jef)
[clitk.git] / segmentation / clitkExtractMediastinumFilter.txx
diff --git a/segmentation/clitkExtractMediastinumFilter.txx b/segmentation/clitkExtractMediastinumFilter.txx
new file mode 100644 (file)
index 0000000..b5535cf
--- /dev/null
@@ -0,0 +1,263 @@
+/*=========================================================================
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
+
+  Authors belong to: 
+  - University of LYON              http://www.universite-lyon.fr/
+  - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
+  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the copyright notices for more information.
+
+  It is distributed under dual licence
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+  ======================================================================-====*/
+
+#ifndef CLITKEXTRACTMEDIASTINUMFILTER_TXX
+#define CLITKEXTRACTMEDIASTINUMFILTER_TXX
+
+// clitk
+#include "clitkCommon.h"
+#include "clitkExtractMediastinumFilter.h"
+#include "clitkAddRelativePositionConstraintToLabelImageFilter.h"
+#include "clitkSegmentationFunctions.h"
+
+// itk
+#include <deque>
+#include "itkStatisticsLabelMapFilter.h"
+#include "itkLabelImageToStatisticsLabelMapFilter.h"
+#include "itkRegionOfInterestImageFilter.h"
+#include "itkBinaryThresholdImageFilter.h"
+
+// itk ENST
+#include "RelativePositionPropImageFilter.h"
+
+//--------------------------------------------------------------------
+template <class TImageType>
+clitk::ExtractMediastinumFilter<TImageType>::
+ExtractMediastinumFilter():
+  clitk::FilterBase(),
+  itk::ImageToImageFilter<TImageType, TImageType>()
+{
+  this->SetNumberOfRequiredInputs(3);
+
+  SetBackgroundValuePatient(0);
+  SetBackgroundValueLung(0);
+  SetBackgroundValueBones(0);
+  SetForegroundValueLeftLung(1);
+  SetForegroundValueRightLung(2);
+  SetBackgroundValue(0);
+  SetForegroundValue(1);
+
+  SetIntermediateSpacing(6);
+  SetFuzzyThreshold1(0.6);
+  SetFuzzyThreshold2(0.7);
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class TImageType>
+void 
+clitk::ExtractMediastinumFilter<TImageType>::
+SetInputPatientLabelImage(const TImageType * image, ImagePixelType bg) {
+  this->SetNthInput(0, const_cast<TImageType *>(image));
+  m_BackgroundValuePatient = bg;
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class TImageType>
+void 
+clitk::ExtractMediastinumFilter<TImageType>::
+SetInputLungLabelImage(const TImageType * image, ImagePixelType bg, 
+                       ImagePixelType fgLeft, ImagePixelType fgRight) {
+  this->SetNthInput(1, const_cast<TImageType *>(image));
+  m_BackgroundValueLung = bg;
+  m_ForegroundValueLeftLung = fgLeft;
+  m_ForegroundValueRightLung = fgRight;
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class TImageType>
+void 
+clitk::ExtractMediastinumFilter<TImageType>::
+SetInputBonesLabelImage(const TImageType * image, ImagePixelType bg) {
+  this->SetNthInput(2, const_cast<TImageType *>(image));
+  m_BackgroundValueBones = bg;
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class TImageType>
+template<class ArgsInfoType>
+void 
+clitk::ExtractMediastinumFilter<TImageType>::
+SetArgsInfo(ArgsInfoType mArgsInfo)
+{
+  SetVerboseOption_GGO(mArgsInfo);
+  SetVerboseStep_GGO(mArgsInfo);
+  SetWriteStep_GGO(mArgsInfo);
+  SetVerboseWarningOff_GGO(mArgsInfo);
+
+  SetBackgroundValuePatient_GGO(mArgsInfo);
+  SetBackgroundValueLung_GGO(mArgsInfo);
+  SetBackgroundValueBones_GGO(mArgsInfo);
+
+  SetForegroundValueLeftLung_GGO(mArgsInfo);
+  SetForegroundValueRightLung_GGO(mArgsInfo);
+
+  SetIntermediateSpacing_GGO(mArgsInfo);
+  SetFuzzyThreshold1_GGO(mArgsInfo);
+  SetFuzzyThreshold2_GGO(mArgsInfo);
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class TImageType>
+void 
+clitk::ExtractMediastinumFilter<TImageType>::
+GenerateOutputInformation() { 
+  ImagePointer input = dynamic_cast<TImageType*>(itk::ProcessObject::GetInput(0));
+  ImagePointer outputImage = this->GetOutput(0);
+  outputImage->SetRegions(outputImage->GetLargestPossibleRegion());
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class TImageType>
+void 
+clitk::ExtractMediastinumFilter<TImageType>::
+GenerateInputRequestedRegion() {
+  // Call default
+  Superclass::GenerateInputRequestedRegion();  
+  // Get input pointers
+  ImagePointer patient = dynamic_cast<TImageType*>(itk::ProcessObject::GetInput(0));
+  ImagePointer lung    = dynamic_cast<TImageType*>(itk::ProcessObject::GetInput(1));
+  ImagePointer bones   = dynamic_cast<TImageType*>(itk::ProcessObject::GetInput(2));
+    
+  patient->SetRequestedRegion(patient->GetLargestPossibleRegion());
+  lung->SetRequestedRegion(lung->GetLargestPossibleRegion());
+  bones->SetRequestedRegion(bones->GetLargestPossibleRegion());
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template <class TImageType>
+void 
+clitk::ExtractMediastinumFilter<TImageType>::
+GenerateData() {
+  // Get input pointers
+  ImageConstPointer patient = dynamic_cast<const TImageType*>(itk::ProcessObject::GetInput(0));
+  ImageConstPointer lung   = dynamic_cast<const TImageType*>(itk::ProcessObject::GetInput(1));
+  ImageConstPointer bones   = dynamic_cast<const TImageType*>(itk::ProcessObject::GetInput(2));
+    
+  // Get output pointer
+  ImagePointer output;
+
+  // Step 1: patient minus lungs, minus bones
+  StartNewStep("Patient contours minus lungs and minus bones");
+  typedef clitk::BooleanOperatorLabelImageFilter<ImageType> BoolFilterType;
+  typename BoolFilterType::Pointer boolFilter = BoolFilterType::New(); 
+  boolFilter->InPlaceOn();
+  boolFilter->SetInput1(patient);
+  boolFilter->SetInput2(lung);    
+  boolFilter->SetOperationType(BoolFilterType::AndNot);
+  boolFilter->Update();    
+  boolFilter->SetInput1(boolFilter->GetOutput());
+  boolFilter->SetInput2(bones);
+  boolFilter->SetOperationType(BoolFilterType::AndNot);
+  boolFilter->Update(); 
+  output = boolFilter->GetOutput();
+
+  output = clitk::AutoCrop<ImageType>(output, GetBackgroundValue()); 
+  ////autoCropFilter->GetOutput();  typedef clitk::AutoCropFilter<ImageType> CropFilterType;
+  //typename CropFilterType::Pointer cropFilter = CropFilterType::New();
+  //cropFilter->SetInput(output);
+  //cropFilter->Update();   
+  //output = cropFilter->GetOutput();
+
+  this->template StopCurrentStep<TImageType>(output);
+
+  // Step 2: LR limits from lung (need separate lung ?)
+  StartNewStep("Left/Right limits with lungs");
+  typedef clitk::AddRelativePositionConstraintToLabelImageFilter<TImageType> RelPosFilterType;
+  typename RelPosFilterType::Pointer relPosFilter = RelPosFilterType::New();
+  relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
+  relPosFilter->VerboseStepOff();
+  relPosFilter->WriteStepOff();
+  relPosFilter->SetInput(output); 
+  relPosFilter->SetInputObject(lung); 
+  relPosFilter->SetOrientationType(RelPosFilterType::LeftTo);
+  relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
+  relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold1());
+  relPosFilter->Update();
+  output = relPosFilter->GetOutput();
+
+  relPosFilter->SetInput(output); 
+  relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
+  relPosFilter->VerboseStepOff();
+  relPosFilter->WriteStepOff();
+  relPosFilter->SetInputObject(lung); 
+  relPosFilter->SetOrientationType(RelPosFilterType::RightTo);
+  relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
+  relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold1());
+  relPosFilter->Update();   
+  output = relPosFilter->GetOutput();
+  this->template StopCurrentStep<TImageType>(output);
+
+  // Step 3: AP limits from bones
+  StartNewStep("Ant/Post limits with bones");
+  relPosFilter->SetCurrentStepNumber(0);
+  relPosFilter->ResetPipeline();// = RelPosFilterType::New();
+  relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
+  relPosFilter->VerboseStepOff();
+  relPosFilter->WriteStepOff();
+  relPosFilter->SetInput(output); 
+  relPosFilter->SetInputObject(bones); 
+  relPosFilter->SetOrientationType(RelPosFilterType::AntTo);
+  relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
+  relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold2());
+  relPosFilter->Update();
+
+  relPosFilter->SetInput(relPosFilter->GetOutput()); 
+  relPosFilter->SetCurrentStepBaseId(this->GetCurrentStepId());
+  relPosFilter->VerboseStepOff();
+  relPosFilter->WriteStepOff();
+  relPosFilter->SetInputObject(bones); 
+  relPosFilter->SetOrientationType(RelPosFilterType::PostTo);
+  relPosFilter->SetIntermediateSpacing(GetIntermediateSpacing());
+  relPosFilter->SetFuzzyThreshold(GetFuzzyThreshold2());
+  relPosFilter->Update();   
+  output = relPosFilter->GetOutput();
+  this->template StopCurrentStep<TImageType>(output);
+
+  // Get CCL
+  output = clitk::Labelize<TImageType>(output, GetBackgroundValue(), true, 100);
+  // output = RemoveLabels<TImageType>(output, BG, param->GetLabelsToRemove());
+  output = clitk::KeepLabels<TImageType>(output, GetBackgroundValue(), 
+                                  GetForegroundValue(), 1, 1, 0);
+
+  output = clitk::AutoCrop<ImageType>(output, GetBackgroundValue()); 
+  //  cropFilter = CropFilterType::New();
+  //cropFilter->SetInput(output);
+  //cropFilter->Update();   
+  //output = cropFilter->GetOutput();
+
+  // Final Step -> set output
+  this->SetNthOutput(0, output);
+}
+//--------------------------------------------------------------------
+  
+
+#endif //#define CLITKBOOLEANOPERATORLABELIMAGEFILTER_TXX