]> Creatis software - clitk.git/commitdiff
auto crop of binary image
authordsarrut <dsarrut>
Wed, 30 Jun 2010 06:01:07 +0000 (06:01 +0000)
committerdsarrut <dsarrut>
Wed, 30 Jun 2010 06:01:07 +0000 (06:01 +0000)
itk/clitkAutoCropFilter.h [new file with mode: 0644]
itk/clitkAutoCropFilter.txx [new file with mode: 0644]

diff --git a/itk/clitkAutoCropFilter.h b/itk/clitkAutoCropFilter.h
new file mode 100644 (file)
index 0000000..b294efb
--- /dev/null
@@ -0,0 +1,91 @@
+/*=========================================================================
+  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 CLITKAUTOCROPFILTER_H
+#define CLITKAUTOCROPFILTER_H
+
+#include <itkImageToImageFilter.h>
+
+namespace clitk {
+  
+  //--------------------------------------------------------------------
+  /*
+    Perform auto crop on a Label Image (with Background defined)
+  */
+  //--------------------------------------------------------------------
+  
+  template <class TImageType>
+  class ITK_EXPORT AutoCropFilter: 
+    public itk::ImageToImageFilter<TImageType, TImageType> {
+
+  public:
+    /** Standard class typedefs. */
+    typedef AutoCropFilter                         Self;
+    typedef itk::ImageToImageFilter<TImageType, TImageType>  Superclass;
+    typedef itk::SmartPointer<Self>                          Pointer;
+    typedef itk::SmartPointer<const Self>                    ConstPointer;
+    
+    /** Method for creation through the object factory. */
+    itkNewMacro(Self);
+    
+    /** Run-time type information (and related methods). */
+    itkTypeMacro(AutoCropFilter, ImageToImageFilter);
+
+    /** Some convenient typedefs. */
+    typedef TImageType                       ImageType;
+    typedef typename ImageType::ConstPointer ImageConstPointer;
+    typedef typename ImageType::Pointer      ImagePointer;
+    typedef typename ImageType::PixelType    ImagePixelType;
+    typedef typename ImageType::RegionType   ImageRegionType;
+    typedef long LabelType;
+
+    /** Connect one of the operands for pixel-wise addition */
+    void SetInput( const ImageType * image);
+    
+    // LabelImage information (BG)
+    void SetBackgroundValue(ImagePixelType p);
+
+    /** ImageDimension constants */
+    itkStaticConstMacro(ImageDimension, unsigned int, TImageType::ImageDimension);
+    
+  protected:
+    AutoCropFilter();
+    virtual ~AutoCropFilter() {}
+    
+    virtual void GenerateOutputInformation();
+    virtual void GenerateData();
+    
+    ImagePixelType m_BackgroundValue;
+    ImageRegionType m_Region;
+    ImagePointer m_labeImage;
+    
+  private:
+    AutoCropFilter(const Self&); //purposely not implemented
+    void operator=(const Self&); //purposely not implemented
+    
+  }; // end class
+  //--------------------------------------------------------------------
+
+} // end namespace clitk
+//--------------------------------------------------------------------
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "clitkAutoCropFilter.txx"
+#endif
+
+#endif
diff --git a/itk/clitkAutoCropFilter.txx b/itk/clitkAutoCropFilter.txx
new file mode 100644 (file)
index 0000000..46e3587
--- /dev/null
@@ -0,0 +1,141 @@
+/*=========================================================================
+  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 CLITKAUTOCROPFILTER_TXX
+#define CLITKAUTOCROPFILTER_TXX
+
+// clitk
+#include "clitkCommon.h"
+#include "clitkSegmentationUtils.h"
+
+// itk
+#include "itkAutoCropLabelMapFilter.h"
+#include "itkStatisticsLabelObject.h"
+#include "itkLabelImageToLabelMapFilter.h"
+#include "itkLabelMapToLabelImageFilter.h"
+#include "itkRegionOfInterestImageFilter.h"
+
+namespace clitk {
+
+  //--------------------------------------------------------------------
+  template <class TImageType>
+  AutoCropFilter<TImageType>::
+  AutoCropFilter():itk::ImageToImageFilter<TImageType, TImageType>() {
+    this->SetNumberOfRequiredInputs(1);
+    m_BackgroundValue  = 0;
+  }
+  //--------------------------------------------------------------------
+
+
+  //--------------------------------------------------------------------
+  template <class TImageType>
+  void 
+  AutoCropFilter<TImageType>::
+  SetInput(const TImageType * image) {
+    // Process object is not const-correct so the const casting is required.
+    this->SetNthInput(0, const_cast<TImageType *>( image ));
+  }
+  //--------------------------------------------------------------------
+  
+
+  //--------------------------------------------------------------------
+  template <class TImageType>
+  void 
+  AutoCropFilter<TImageType>::  
+  SetBackgroundValue(ImagePixelType p) {
+    m_BackgroundValue = p;
+  }
+  //--------------------------------------------------------------------
+
+
+  //--------------------------------------------------------------------
+  template <class TImageType>
+  void 
+  AutoCropFilter<TImageType>::
+  GenerateOutputInformation() {    
+
+    // Superclass
+    // do not call the superclass' implementation of this method since
+    // this filter allows the input the output to be of different dimensions
+    // Superclass::GenerateOutputInformation();
+
+    // Get input pointers
+    ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
+    
+    // Get output pointer
+    ImagePointer output = this->GetOutput(0);
+  
+    // Convert to LabelMap
+    static const unsigned int Dim = ImageType::ImageDimension;
+    //    typedef unsigned long LabelType; // unsigned long needed (!!??)
+    typedef itk::StatisticsLabelObject< LabelType, Dim > LabelObjectType;
+    typedef itk::LabelMap< LabelObjectType > LabelMapType;
+    typedef itk::LabelImageToLabelMapFilter<ImageType, LabelMapType> ImageToMapFilterType;
+    typename ImageToMapFilterType::Pointer imageToLabelFilter = ImageToMapFilterType::New();  
+    imageToLabelFilter->SetBackgroundValue(m_BackgroundValue);
+    imageToLabelFilter->SetInput(input);
+    
+    // AutoCrop
+    typedef itk::AutoCropLabelMapFilter<LabelMapType> AutoCropFilterType;
+    typename AutoCropFilterType::Pointer autoCropFilter = AutoCropFilterType::New();
+    autoCropFilter->SetInput(imageToLabelFilter->GetOutput());
+
+    // Convert to LabelImage
+    typedef itk::LabelMapToLabelImageFilter<LabelMapType, ImageType> MapToImageFilterType;
+    typename MapToImageFilterType::Pointer labelToImageFilter = MapToImageFilterType::New();       
+    labelToImageFilter->SetInput(autoCropFilter->GetOutput());
+
+    // Go ! (needed)
+    labelToImageFilter->Update();
+    m_labeImage = labelToImageFilter->GetOutput();
+
+    // Update the output size
+    m_Region = m_labeImage->GetLargestPossibleRegion();
+    output->SetLargestPossibleRegion(m_Region);
+    output->SetRequestedRegion(m_Region);
+    output->SetBufferedRegion(m_Region);
+    output->SetRegions(m_Region);
+  }
+  //--------------------------------------------------------------------
+   
+  //--------------------------------------------------------------------
+  template <class TImageType>
+  void 
+  AutoCropFilter<TImageType>::
+  GenerateData() {
+    // Get input pointers
+    ImageConstPointer input = dynamic_cast<const ImageType*>(itk::ProcessObject::GetInput(0));
+  
+    // Extract the region
+    typedef itk::RegionOfInterestImageFilter<ImageType, ImageType> CropFilterType;
+    m_labeImage->SetRequestedRegion(m_labeImage->GetLargestPossibleRegion());
+    typename CropFilterType::Pointer cropFilter = CropFilterType::New();
+    cropFilter->SetInput(m_labeImage);
+    cropFilter->SetRegionOfInterest(m_Region);
+
+    // Go ! 
+    cropFilter->Update();
+
+    // Get (graft) output (SetNthOutput does not fit here because of Origin).
+    this->GraftOutput(cropFilter->GetOutput());
+  }
+  //--------------------------------------------------------------------
+   
+}//end clitk
+#endif //#define CLITKAUTOCROPFILTER