From 5753311ba2368f89edfd7ba3d43a0186de1b16b5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Beno=C3=AEt=20Presles?= Date: Tue, 12 Nov 2013 10:29:58 +0100 Subject: [PATCH] new tool to normalize image intensity --- tools/CMakeLists.txt | 5 + tools/clitkImageIntensityWindowing.cxx | 50 ++++++ tools/clitkImageIntensityWindowing.ggo | 13 ++ ...litkImageIntensityWindowingGenericFilter.h | 69 ++++++++ ...tkImageIntensityWindowingGenericFilter.txx | 167 ++++++++++++++++++ 5 files changed, 304 insertions(+) create mode 100644 tools/clitkImageIntensityWindowing.cxx create mode 100644 tools/clitkImageIntensityWindowing.ggo create mode 100644 tools/clitkImageIntensityWindowingGenericFilter.h create mode 100644 tools/clitkImageIntensityWindowingGenericFilter.txx diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 06d85a7..a0e8846 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -305,6 +305,11 @@ IF (CLITK_BUILD_TOOLS) TARGET_LINK_LIBRARIES(clitkImageLaplacian clitkCommon ) SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkImageLaplacian) + WRAP_GGO(clitkImageIntensityWindowing_GGO_C clitkImageIntensityWindowing.ggo) + ADD_EXECUTABLE(clitkImageIntensityWindowing clitkImageIntensityWindowing.cxx ${clitkImageIntensityWindowing_GGO_C}) + TARGET_LINK_LIBRARIES(clitkImageIntensityWindowing clitkCommon ) + SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkImageIntensityWindowing) + #========================================================= option(CLITK_USE_ROOT "Build experimental tools using root" OFF) diff --git a/tools/clitkImageIntensityWindowing.cxx b/tools/clitkImageIntensityWindowing.cxx new file mode 100644 index 0000000..e7e01fa --- /dev/null +++ b/tools/clitkImageIntensityWindowing.cxx @@ -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 clitkImageIntensityWindowingGenericFilter.txx + * @author xxx + * @date 29 June 2029 + * + * @brief ImageIntensityWindowing an image + * + ===================================================*/ + +// clitk +#include "clitkImageIntensityWindowing_ggo.h" +#include "clitkImageIntensityWindowingGenericFilter.h" + +//-------------------------------------------------------------------- +int main(int argc, char * argv[]) +{ + + // Init command line + GGO(clitkImageIntensityWindowing, args_info); + CLITK_INIT; + + // Filter + typedef clitk::ImageIntensityWindowingGenericFilter FilterType; + FilterType::Pointer filter = FilterType::New(); + + filter->SetArgsInfo(args_info); + filter->Update(); + + return EXIT_SUCCESS; +}// end main + +//-------------------------------------------------------------------- diff --git a/tools/clitkImageIntensityWindowing.ggo b/tools/clitkImageIntensityWindowing.ggo new file mode 100644 index 0000000..6b7fe46 --- /dev/null +++ b/tools/clitkImageIntensityWindowing.ggo @@ -0,0 +1,13 @@ +#File clitkImageIntensityWindowing.ggo +package "clitkImageIntensityWindowing" +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 "output" o "Output image filename" string required +option "mask" m "Mask input image filename" string optional diff --git a/tools/clitkImageIntensityWindowingGenericFilter.h b/tools/clitkImageIntensityWindowingGenericFilter.h new file mode 100644 index 0000000..41f88e1 --- /dev/null +++ b/tools/clitkImageIntensityWindowingGenericFilter.h @@ -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 CLITKImageIntensityWindowingGENERICFILTER_H +#define CLITKImageIntensityWindowingGENERICFILTER_H +#include "clitkIO.h" +#include "clitkImageToImageGenericFilter.h" + +//-------------------------------------------------------------------- +namespace clitk +{ + +template +class ITK_EXPORT ImageIntensityWindowingGenericFilter: + public ImageToImageGenericFilter > +{ + +public: + + //-------------------------------------------------------------------- + ImageIntensityWindowingGenericFilter(); + + //-------------------------------------------------------------------- + typedef ImageIntensityWindowingGenericFilter Self; + typedef itk::SmartPointer Pointer; + typedef itk::SmartPointer ConstPointer; + + //-------------------------------------------------------------------- + // Method for creation through the object factory + // and Run-time type information (and related methods) + itkNewMacro(Self); + itkTypeMacro(ImageIntensityWindowingGenericFilter, LightObject); + + //-------------------------------------------------------------------- + void SetArgsInfo(const args_info_type & a); + + //-------------------------------------------------------------------- + // Main function called each time the filter is updated + template + void UpdateWithInputImageType(); + +protected: + template void InitializeImageType(); + args_info_type mArgsInfo; + +}; // end class +//-------------------------------------------------------------------- + +} // end namespace clitk + +#ifndef ITK_MANUAL_INSTANTIATION +#include "clitkImageIntensityWindowingGenericFilter.txx" +#endif + +#endif // #define clitkImageIntensityWindowingGenericFilter_h diff --git a/tools/clitkImageIntensityWindowingGenericFilter.txx b/tools/clitkImageIntensityWindowingGenericFilter.txx new file mode 100644 index 0000000..02f4acd --- /dev/null +++ b/tools/clitkImageIntensityWindowingGenericFilter.txx @@ -0,0 +1,167 @@ +/*========================================================================= + 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 clitkImageIntensityWindowingGenericFilter_txx +#define clitkImageIntensityWindowingGenericFilter_txx + +/* ================================================= + * @file clitkImageIntensityWindowingGenericFilter.txx + * @author Jef Vandemeulebroucke + * @date 29 june 2009 + * + * @brief + * + ===================================================*/ + +// itk include +#include "itkIntensityWindowingImageFilter.h" +#include "itkLabelStatisticsImageFilter.h" +#include "itkMaskImageFilter.h" +#include "itkMaskNegatedImageFilter.h" +#include + +namespace clitk +{ + +//-------------------------------------------------------------------- +template +ImageIntensityWindowingGenericFilter::ImageIntensityWindowingGenericFilter(): + ImageToImageGenericFilter("ImageIntensityWindowing") +{ + InitializeImageType<2>(); + InitializeImageType<3>(); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +template +void ImageIntensityWindowingGenericFilter::InitializeImageType() +{ + ADD_DEFAULT_IMAGE_TYPES(Dim); +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +template +void ImageIntensityWindowingGenericFilter::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 +template +void +ImageIntensityWindowingGenericFilter::UpdateWithInputImageType() +{ + + // Main filter + typedef typename InputImageType::PixelType InputPixelType; + typedef itk::Image OutputImageType; + typedef itk::Image MaskImageType; + + // Reading input + typename OutputImageType::Pointer input = this->template GetInput(0); + + typename MaskImageType::Pointer mask = NULL; + if(mArgsInfo.mask_given) { + mask = this->template GetInput(1); + } + else { + mask = MaskImageType::New(); + mask->SetRegions(input->GetLargestPossibleRegion()); + mask->SetOrigin(input->GetOrigin()); + mask->SetSpacing(input->GetSpacing()); + mask->Allocate(); + mask->FillBuffer(1); + } + // Set mask iterator + typedef itk::ImageRegionIterator IteratorMaskType; + IteratorMaskType itm(mask, mask->GetLargestPossibleRegion()); + // + typedef itk::LabelStatisticsImageFilter< OutputImageType, MaskImageType > LabelStatisticsImageFilterType; + typename LabelStatisticsImageFilterType::Pointer labelStatisticsImageFilter = LabelStatisticsImageFilterType::New(); + labelStatisticsImageFilter->SetLabelInput( mask ); + labelStatisticsImageFilter->SetInput(input); + labelStatisticsImageFilter->Update(); + float maxImg = labelStatisticsImageFilter->GetMaximum(1); + //std::cout << "maxImg: " << maxImg << std::endl; + // Filter + typedef itk::IntensityWindowingImageFilter IntensityWindowingImageFilterType; + typename IntensityWindowingImageFilterType::Pointer filter = IntensityWindowingImageFilterType::New(); + filter->SetInput(input); + filter->SetWindowMinimum(0.0); + filter->SetWindowMaximum(maxImg); + filter->SetOutputMinimum(0.0); + filter->SetOutputMaximum(1.0); + filter->Update(); + + // Set iterator + typedef itk::ImageRegionIterator IteratorType; + IteratorType it(filter->GetOutput(), filter->GetOutput()->GetLargestPossibleRegion()); + //A little bit strange to do that but I think I need to do it. + // Create output image + typename OutputImageType::Pointer outputImage = OutputImageType::New(); + outputImage->SetRegions(filter->GetOutput()->GetLargestPossibleRegion()); + outputImage->SetOrigin(filter->GetOutput()->GetOrigin()); + outputImage->SetSpacing(filter->GetOutput()->GetSpacing()); + outputImage->Allocate(); + outputImage->FillBuffer(-100.0); + // Set output iterator + typedef itk::ImageRegionIterator IteratorOutputType; + IteratorOutputType ito = IteratorOutputType(outputImage, outputImage->GetLargestPossibleRegion()); + + it.GoToBegin(); + ito.GoToBegin(); + itm.GoToBegin(); + + while (!ito.IsAtEnd()) { + if(itm.Get() > 0) { + ito.Set(it.Get()); + } + ++it; + ++ito; + ++itm; + } + + // Write/Save results + this->template SetNextOutput(outputImage); +} +//-------------------------------------------------------------------- + + +}//end clitk + +#endif //#define clitkImageIntensityWindowingGenericFilter_txx -- 2.47.1