]> Creatis software - clitk.git/commitdiff
new tool to compute the laplacian of an image
authorBenoît Presles <benoit.presles@creatis.insa-lyon.fr>
Fri, 18 Oct 2013 13:12:34 +0000 (15:12 +0200)
committerBenoît Presles <benoit.presles@creatis.insa-lyon.fr>
Fri, 18 Oct 2013 13:12:34 +0000 (15:12 +0200)
tools/CMakeLists.txt
tools/clitkImageLaplacian.cxx [new file with mode: 0644]
tools/clitkImageLaplacian.ggo [new file with mode: 0644]
tools/clitkImageLaplacianGenericFilter.h [new file with mode: 0644]
tools/clitkImageLaplacianGenericFilter.txx [new file with mode: 0644]

index c3984c3d68b8d40377b592ef7d282aa7cae70dd1..a4594a28dd59671ad26e5ab96c9cc03fb3426cc6 100644 (file)
@@ -305,6 +305,11 @@ IF (CLITK_BUILD_TOOLS)
   TARGET_LINK_LIBRARIES(clitkImageGradientMagnitude clitkCommon )
   SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkImageGradientMagnitude)
 
+  WRAP_GGO(clitkImageLaplacian_GGO_C clitkImageLaplacian.ggo)
+  ADD_EXECUTABLE(clitkImageLaplacian clitkImageLaplacian.cxx ${clitkImageLaplacian_GGO_C})
+  TARGET_LINK_LIBRARIES(clitkImageLaplacian clitkCommon )
+  SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkImageLaplacian)
+
 
   #=========================================================
   option(CLITK_USE_ROOT "Build experimental tools using root" OFF)
diff --git a/tools/clitkImageLaplacian.cxx b/tools/clitkImageLaplacian.cxx
new file mode 100644 (file)
index 0000000..9f9901e
--- /dev/null
@@ -0,0 +1,50 @@
+/*=========================================================================
+  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://www.centreleonberard.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
+===========================================================================**/
+
+/* =================================================
+ * @file   clitkImageLaplacianGenericFilter.txx
+ * @author xxx <xxx@creatis.insa-lyon.fr>
+ * @date   29 June 2029
+ *
+ * @brief ImageLaplacian an image
+ *
+ ===================================================*/
+
+// clitk
+#include "clitkImageLaplacian_ggo.h"
+#include "clitkImageLaplacianGenericFilter.h"
+
+//--------------------------------------------------------------------
+int main(int argc, char * argv[])
+{
+
+  // Init command line
+  GGO(clitkImageLaplacian, args_info);
+  CLITK_INIT;
+
+  // Filter
+  typedef clitk::ImageLaplacianGenericFilter<args_info_clitkImageLaplacian> FilterType;
+  FilterType::Pointer filter = FilterType::New();
+
+  filter->SetArgsInfo(args_info);
+  filter->Update();
+
+  return EXIT_SUCCESS;
+}// end main
+
+//--------------------------------------------------------------------
diff --git a/tools/clitkImageLaplacian.ggo b/tools/clitkImageLaplacian.ggo
new file mode 100644 (file)
index 0000000..2066df9
--- /dev/null
@@ -0,0 +1,14 @@
+#File clitkImageLaplacian.ggo
+package "clitkImageLaplacian"
+version "1.0"
+purpose ""
+
+option "config"                -       "Config file"                     string        optional
+option "verbose"       v       "Verbose"                         flag          off
+
+option "imagetypes"    -       "Display allowed image types"     flag          off
+
+option "input"         i       "Input image filename"            string        required
+option "mask"          m       "Mask input image filename"       string        optional
+option "output"        o       "Output image filename"           string        required
+option "normalize"      n       "Normalize the output image between 0 and 1"    flag off
diff --git a/tools/clitkImageLaplacianGenericFilter.h b/tools/clitkImageLaplacianGenericFilter.h
new file mode 100644 (file)
index 0000000..928f3a5
--- /dev/null
@@ -0,0 +1,69 @@
+/*=========================================================================
+  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://www.centreleonberard.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 CLITKImageLaplacianGENERICFILTER_H
+#define CLITKImageLaplacianGENERICFILTER_H
+#include "clitkIO.h"
+#include "clitkImageToImageGenericFilter.h"
+
+//--------------------------------------------------------------------
+namespace clitk
+{
+
+template<class args_info_type>
+class ITK_EXPORT ImageLaplacianGenericFilter:
+        public ImageToImageGenericFilter<ImageLaplacianGenericFilter<args_info_type> >
+{
+
+public:
+
+    //--------------------------------------------------------------------
+    ImageLaplacianGenericFilter();
+
+    //--------------------------------------------------------------------
+    typedef ImageLaplacianGenericFilter         Self;
+    typedef itk::SmartPointer<Self>            Pointer;
+    typedef itk::SmartPointer<const Self>      ConstPointer;
+
+    //--------------------------------------------------------------------
+    // Method for creation through the object factory
+    // and Run-time type information (and related methods)
+    itkNewMacro(Self);
+    itkTypeMacro(ImageLaplacianGenericFilter, LightObject);
+
+    //--------------------------------------------------------------------
+    void SetArgsInfo(const args_info_type & a);
+
+    //--------------------------------------------------------------------
+    // Main function called each time the filter is updated
+    template<class InputImageType>
+    void UpdateWithInputImageType();
+
+protected:
+    template<unsigned int Dim> void InitializeImageType();
+    args_info_type mArgsInfo;
+
+}; // end class
+//--------------------------------------------------------------------
+
+} // end namespace clitk
+
+#ifndef ITK_MANUAL_INSTANTIATION
+#include "clitkImageLaplacianGenericFilter.txx"
+#endif
+
+#endif // #define clitkImageLaplacianGenericFilter_h
diff --git a/tools/clitkImageLaplacianGenericFilter.txx b/tools/clitkImageLaplacianGenericFilter.txx
new file mode 100644 (file)
index 0000000..2ffa43b
--- /dev/null
@@ -0,0 +1,183 @@
+/*=========================================================================
+  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://www.centreleonberard.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 clitkImageLaplacianGenericFilter_txx
+#define clitkImageLaplacianGenericFilter_txx
+
+/* =================================================
+ * @file   clitkImageLaplacianGenericFilter.txx
+ * @author Jef Vandemeulebroucke <jef@creatis.insa-lyon.fr>
+ * @date   29 june 2009
+ *
+ * @brief
+ *
+ ===================================================*/
+
+// itk include
+#include "itkCastImageFilter.h"
+#include "itkLaplacianImageFilter.h"
+#include "itkLabelStatisticsImageFilter.h"
+#include "itkMaskImageFilter.h"
+#include "itkMaskNegatedImageFilter.h"
+#include <clitkCommon.h>
+
+namespace clitk
+{
+
+//--------------------------------------------------------------------
+template<class args_info_type>
+ImageLaplacianGenericFilter<args_info_type>::ImageLaplacianGenericFilter():
+  ImageToImageGenericFilter<Self>("ImageLaplacian")
+{
+  InitializeImageType<2>();
+  InitializeImageType<3>();
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template<class args_info_type>
+template<unsigned int Dim>
+void ImageLaplacianGenericFilter<args_info_type>::InitializeImageType()
+{
+  ADD_DEFAULT_IMAGE_TYPES(Dim);
+}
+//--------------------------------------------------------------------
+
+
+//--------------------------------------------------------------------
+template<class args_info_type>
+void ImageLaplacianGenericFilter<args_info_type>::SetArgsInfo(const args_info_type & a)
+{
+  mArgsInfo=a;
+  this->SetIOVerbose(mArgsInfo.verbose_flag);
+  if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes();
+
+  if (mArgsInfo.input_given) {
+    this->SetInputFilename(mArgsInfo.input_arg);
+  }
+  if (mArgsInfo.output_given) {
+    this->SetOutputFilename(mArgsInfo.output_arg);
+  }
+  if (mArgsInfo.mask_given) {
+    this->AddInputFilename(mArgsInfo.mask_arg);
+  }
+}
+//--------------------------------------------------------------------
+
+//--------------------------------------------------------------------
+// Update with the number of dimensions and the pixeltype
+//--------------------------------------------------------------------
+template<class args_info_type>
+template<class InputImageType>
+void
+ImageLaplacianGenericFilter<args_info_type>::UpdateWithInputImageType()
+{
+    // Main filter
+    typedef typename InputImageType::PixelType InputPixelType;
+    typedef itk::Image<float, InputImageType::ImageDimension> FloatImageType;
+    typedef itk::Image<unsigned char, FloatImageType::ImageDimension> MaskImageType;
+
+    // Reading input
+    typename InputImageType::Pointer input = this->template GetInput<InputImageType>(0);
+
+    //Cast input to float
+    typedef itk::CastImageFilter< InputImageType, FloatImageType > CastFilterType;
+    typename CastFilterType::Pointer castFilter = CastFilterType::New();
+    castFilter->SetInput(input);
+    castFilter->Update();
+
+    typename MaskImageType::Pointer mask = NULL;
+    if(mArgsInfo.mask_given) {
+        mask = this->template GetInput<MaskImageType>(1);
+    }
+    else {
+        mask = MaskImageType::New();
+        mask->SetRegions(input->GetLargestPossibleRegion());
+        mask->SetOrigin(input->GetOrigin());
+        mask->SetSpacing(input->GetSpacing());
+        mask->Allocate();
+        mask->FillBuffer(1);
+    }
+
+
+    // Create output image
+    typename FloatImageType::Pointer outputImage = FloatImageType::New();
+    outputImage->SetRegions(input->GetLargestPossibleRegion());
+    outputImage->SetOrigin(input->GetOrigin());
+    outputImage->SetSpacing(input->GetSpacing());
+    outputImage->Allocate();
+    outputImage->FillBuffer(0.0);
+    // Set output iterator
+    typedef itk::ImageRegionIterator<FloatImageType> IteratorOutputType;
+    IteratorOutputType ito = IteratorOutputType(outputImage, outputImage->GetLargestPossibleRegion());
+
+    // Filter
+    typedef itk::LaplacianImageFilter<FloatImageType, FloatImageType> LaplacianImageFilterType;
+    typename LaplacianImageFilterType::Pointer laplacianFilter=LaplacianImageFilterType::New();
+    laplacianFilter->SetInput(castFilter->GetOutput());
+    laplacianFilter->Update();
+    // Set iterator
+    typedef itk::ImageRegionIterator<FloatImageType> IteratorType;
+    IteratorType it(laplacianFilter->GetOutput(), laplacianFilter->GetOutput()->GetLargestPossibleRegion());
+
+    // Set mask iterator
+    typedef itk::ImageRegionIterator<MaskImageType> IteratorMaskType;
+    IteratorMaskType itm(mask, mask->GetLargestPossibleRegion());
+
+    //typedef itk::MinimumMaximumImageCalculator <OutputImageType> ImageCalculatorFilterType;
+    //typename ImageCalculatorFilterType::Pointer imageCalculatorFilter = ImageCalculatorFilterType::New();
+    //imageCalculatorFilter->SetImage(gradientFilter->GetOutput());
+    //imageCalculatorFilter->Compute();
+    typedef itk::LabelStatisticsImageFilter< FloatImageType, MaskImageType > LabelStatisticsImageFilterType;
+    typename LabelStatisticsImageFilterType::Pointer labelStatisticsImageFilter = LabelStatisticsImageFilterType::New();
+    labelStatisticsImageFilter->SetLabelInput( mask );
+    labelStatisticsImageFilter->SetInput(laplacianFilter->GetOutput());
+    labelStatisticsImageFilter->Update();
+
+    //std::cout << "Number of labels: " << labelStatisticsImageFilter->GetNumberOfLabels() << std::endl;
+
+    float minImg = labelStatisticsImageFilter->GetMinimum(1);
+    //std::cout << "minImg: " << minImg << std::endl;
+    float maxImg = labelStatisticsImageFilter->GetMaximum(1);
+    //std::cout << "maxImg: " << maxImg << std::endl;
+
+    it.GoToBegin();
+    ito.GoToBegin();
+    itm.GoToBegin();
+
+    while (!ito.IsAtEnd()) {
+        if(mArgsInfo.normalize_flag && itm.Get() == 1) {
+            ito.Set(((float) it.Get() - minImg)/(maxImg-minImg));
+        }
+        if (mArgsInfo.normalize_flag == 0 && itm.Get() == 1) {
+            ito.Set((float) it.Get());
+        }
+        ++it;
+        ++ito;
+        ++itm;
+    }
+
+    //typename OutputImageType::Pointer outputImage = gradientFilter->GetOutput();
+    this->template SetNextOutput<FloatImageType>(outputImage);
+}
+//--------------------------------------------------------------------
+
+
+}//end clitk
+
+#endif //#define clitkImageLaplacianGenericFilter_txx