]> Creatis software - clitk.git/commitdiff
optional opening after 1st step in ExtractPatient
authorRomulo Pinho <pinho@lyon.fnclcc.fr>
Wed, 6 Jul 2011 11:27:26 +0000 (13:27 +0200)
committerRomulo Pinho <pinho@lyon.fnclcc.fr>
Wed, 6 Jul 2011 11:27:26 +0000 (13:27 +0200)
- controlled by the radius given on the cmd line

segmentation/clitkExtractPatient.ggo
segmentation/clitkExtractPatientFilter.h
segmentation/clitkExtractPatientFilter.txx
segmentation/clitkExtractPatientGenericFilter.txx

index 5c2861dfbae5a4550487ac9b8311ea872f324d11..f4944409a1b10e6286a9930b1046b659a2301ece 100644 (file)
@@ -22,6 +22,7 @@ section "Binarize"
 
 option "lower"         -       "Initial lower threshold"       double          no      
 option "upper"         -       "Initial upper threshold"       double          no      default="-300"
+option "openingRadius"    - "Radius for opening after threshold"  int no  default="0"
 
 section "First Label Image (air=1)"
 
index b612fd3f7eba02ba344e2e814bdafbcf944dcfa1..fe290cc2302603808682cf1c49887494ca0c72a5 100644 (file)
@@ -98,7 +98,9 @@ namespace clitk {
 
     itkSetMacro(LowerThreshold, InputImagePixelType);
     itkGetMacro(LowerThreshold, InputImagePixelType);
-    itkSetMacro(UseLowerThreshold, bool);    
+    itkSetMacro(UseLowerThreshold, bool);   
+    itkGetMacro(PrimaryOpeningRadius, unsigned int);
+    itkSetMacro(PrimaryOpeningRadius, unsigned int);
     itkGetConstMacro(UseLowerThreshold, bool);    
     itkBooleanMacro(UseLowerThreshold);
 
@@ -165,6 +167,7 @@ namespace clitk {
     bool m_DecomposeAndReconstructDuringFirstStep;
     bool m_DecomposeAndReconstructDuringSecondStep;
     bool m_FinalOpenClose;
+    unsigned  m_PrimaryOpeningRadius;
     InternalImageSizeType m_Radius1;
     InternalImageSizeType m_Radius2;
     int m_MaximumNumberOfLabels1;
index 00e31653afce00e5ea32c5a91a1218fbe39251fa..43e8a9b27bc79ba6b74247fc6a857ed7d2ed08ae 100644 (file)
@@ -48,6 +48,7 @@ ExtractPatientFilter():
   this->SetNumberOfRequiredInputs(1);
   SetBackgroundValue(0); // Must be zero
   SetForegroundValue(1);
+  SetPrimaryOpeningRadius(0);
 
   // Step 1: Threshold + CC + sort (Find low density areas)
   SetUpperThreshold(-300);
@@ -134,14 +135,36 @@ GenerateOutputInformation() {
   binarizeFilter->SetUpperThreshold(GetUpperThreshold());
   binarizeFilter ->SetInsideValue(this->GetForegroundValue());
   binarizeFilter ->SetOutsideValue(this->GetBackgroundValue());
+  working_image = binarizeFilter->GetOutput();
 
+  typedef itk::BinaryBallStructuringElement<InternalPixelType,Dim> KernelType;
+  unsigned int radius = this->GetPrimaryOpeningRadius();
+  if (radius > 0)
+  {
+    if (this->GetVerboseOptionFlag()) std::cout << ("Opening after threshold; R = ") << radius << std::endl;
+    KernelType kernel;
+    kernel.SetRadius(radius);
+    
+    typedef itk::BinaryMorphologicalOpeningImageFilter<InternalImageType, InternalImageType , KernelType> OpenFilterType2;
+    typename OpenFilterType2::Pointer openFilter2 = OpenFilterType2::New();
+    openFilter2->SetInput(working_image);
+    openFilter2->SetBackgroundValue(0);
+    openFilter2->SetForegroundValue(1);
+    openFilter2->SetKernel(kernel);
+    openFilter2->Update();
+    working_image = openFilter2->GetOutput();
+  }
+
+  if (this->GetVerboseOptionFlag()) std::cout << ("Labelling") << std::endl;
   // Connected component labeling
   typedef itk::ConnectedComponentImageFilter<InternalImageType, InternalImageType> ConnectFilterType;
   typename ConnectFilterType::Pointer connectFilter=ConnectFilterType::New();
-  connectFilter->SetInput(binarizeFilter->GetOutput());
+  connectFilter->SetInput(working_image);
   connectFilter->SetBackgroundValue(this->GetBackgroundValue());
   connectFilter->SetFullyConnected(false);
+  connectFilter->Update();
 
+  if (this->GetVerboseOptionFlag()) std::cout << ("RelabelComponentImageFilter") << std::endl;
   // Sort labels according to size
   typedef itk::RelabelComponentImageFilter<InternalImageType, InternalImageType> RelabelFilterType;
   typename RelabelFilterType::Pointer relabelFilter=RelabelFilterType::New();
@@ -175,6 +198,7 @@ GenerateOutputInformation() {
 
   //--------------------------------------------------------------------
   //--------------------------------------------------------------------
+  if (this->GetVerboseOptionFlag()) std::cout << ("Remove the air (largest area)") << std::endl;
   StartNewStep("Remove the air (largest area)");
   typedef itk::BinaryThresholdImageFilter<InternalImageType, InternalImageType> iBinarizeFilterType;
   typename iBinarizeFilterType::Pointer binarizeFilter2 = iBinarizeFilterType::New();
@@ -226,7 +250,6 @@ GenerateOutputInformation() {
   if (GetFinalOpenClose()) {
     StartNewStep("Final OpenClose");
     // Open
-    typedef itk::BinaryBallStructuringElement<InternalPixelType,Dim> KernelType;
     KernelType structuringElement;
     structuringElement.SetRadius(1);
     structuringElement.CreateStructuringElement();
index a8fbad81e227e2360e1b34b74e71233c85cebdac..e7d4ebee74565d7dca39e2cd2bef982bb9a161fd 100644 (file)
@@ -75,6 +75,7 @@ SetOptionsFromArgsInfoToFilter(FilterType * f)
 
   f->SetUpperThreshold(mArgsInfo.upper_arg);
   f->SetLowerThreshold(mArgsInfo.lower_arg);
+  f->SetPrimaryOpeningRadius(mArgsInfo.openingRadius_arg);
 
   f->SetDecomposeAndReconstructDuringFirstStep(mArgsInfo.erode1_flag);