From: Benoît Presles Date: Thu, 9 Jan 2014 13:43:47 +0000 (+0100) Subject: new tool to normalize an image X-Git-Tag: v1.4.0~145^2 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=bf97e857638ed65c07c8ee1835cf5373d6b381d6;p=clitk.git new tool to normalize an image --- diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 478b817..3e7a20b 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -300,6 +300,11 @@ IF (CLITK_BUILD_TOOLS) TARGET_LINK_LIBRARIES(clitkImageUncertainty clitkCommon ${ITK_LIBRARIES}) SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkImageUncertainty) + WRAP_GGO(clitkNormalizeImageFilter_GGO_C clitkNormalizeImageFilter.ggo) + ADD_EXECUTABLE(clitkNormalizeImageFilter clitkNormalizeImageFilter.cxx ${clitkNormalizeImageFilter_GGO_C}) + TARGET_LINK_LIBRARIES(clitkNormalizeImageFilter clitkCommon ) + SET(TOOLS_INSTALL ${TOOLS_INSTALL} clitkNormalizeImageFilter) + WRAP_GGO(clitkImageGradientMagnitude_GGO_C clitkImageGradientMagnitude.ggo) ADD_EXECUTABLE(clitkImageGradientMagnitude clitkImageGradientMagnitude.cxx ${clitkImageGradientMagnitude_GGO_C}) TARGET_LINK_LIBRARIES(clitkImageGradientMagnitude clitkCommon ) diff --git a/tools/clitkNormalizeImageFilter.cxx b/tools/clitkNormalizeImageFilter.cxx new file mode 100644 index 0000000..071aa4d --- /dev/null +++ b/tools/clitkNormalizeImageFilter.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 clitkNormalizeImageFilterGenericFilter.txx + * @author xxx + * @date 29 June 2029 + * + * @brief NormalizeImageFilter an image + * + ===================================================*/ + +// clitk +#include "clitkNormalizeImageFilter_ggo.h" +#include "clitkNormalizeImageFilterGenericFilter.h" + +//-------------------------------------------------------------------- +int main(int argc, char * argv[]) +{ + + // Init command line + GGO(clitkNormalizeImageFilter, args_info); + CLITK_INIT; + + // Filter + typedef clitk::NormalizeImageFilterGenericFilter FilterType; + FilterType::Pointer filter = FilterType::New(); + + filter->SetArgsInfo(args_info); + filter->Update(); + + return EXIT_SUCCESS; +}// end main + +//-------------------------------------------------------------------- diff --git a/tools/clitkNormalizeImageFilter.ggo b/tools/clitkNormalizeImageFilter.ggo new file mode 100644 index 0000000..b67e3b8 --- /dev/null +++ b/tools/clitkNormalizeImageFilter.ggo @@ -0,0 +1,13 @@ +#File clitkNormalizeImageFilter.ggo +package "clitkNormalizeImageFilter" +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/clitkNormalizeImageFilterGenericFilter.h b/tools/clitkNormalizeImageFilterGenericFilter.h new file mode 100644 index 0000000..85f28e4 --- /dev/null +++ b/tools/clitkNormalizeImageFilterGenericFilter.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 CLITKNormalizeImageFilterGENERICFILTER_H +#define CLITKNormalizeImageFilterGENERICFILTER_H +#include "clitkIO.h" +#include "clitkImageToImageGenericFilter.h" + +//-------------------------------------------------------------------- +namespace clitk +{ + +template +class ITK_EXPORT NormalizeImageFilterGenericFilter: + public ImageToImageGenericFilter > +{ + +public: + + //-------------------------------------------------------------------- + NormalizeImageFilterGenericFilter(); + + //-------------------------------------------------------------------- + typedef NormalizeImageFilterGenericFilter 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(NormalizeImageFilterGenericFilter, 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 "clitkNormalizeImageFilterGenericFilter.txx" +#endif + +#endif // #define clitkNormalizeImageFilterGenericFilter_h diff --git a/tools/clitkNormalizeImageFilterGenericFilter.txx b/tools/clitkNormalizeImageFilterGenericFilter.txx new file mode 100644 index 0000000..99a43a4 --- /dev/null +++ b/tools/clitkNormalizeImageFilterGenericFilter.txx @@ -0,0 +1,165 @@ +/*========================================================================= + 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 clitkNormalizeImageFilterGenericFilter_txx +#define clitkNormalizeImageFilterGenericFilter_txx + +/* ================================================= + * @file clitkNormalizeImageFilterGenericFilter.txx + * @author Jef Vandemeulebroucke + * @date 29 june 2009 + * + * @brief + * + ===================================================*/ + +// itk include +#include "itkLabelStatisticsImageFilter.h" +#include "itkMaskImageFilter.h" +#include "itkMaskNegatedImageFilter.h" +#include + +namespace clitk +{ + + //-------------------------------------------------------------------- + template + NormalizeImageFilterGenericFilter::NormalizeImageFilterGenericFilter(): + ImageToImageGenericFilter("NormalizeImageFilter") + { + InitializeImageType<2>(); + InitializeImageType<3>(); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + template + void NormalizeImageFilterGenericFilter::InitializeImageType() + { + ADD_DEFAULT_IMAGE_TYPES(Dim); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void NormalizeImageFilterGenericFilter::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 + NormalizeImageFilterGenericFilter::UpdateWithInputImageType() + { + + // Main filter + typedef typename InputImageType::PixelType InputPixelType; + typedef itk::Image OutputImageType; + typedef itk::Image MaskImageType; + + // Reading input + typename InputImageType::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); + } + + // Create output image + typename OutputImageType::Pointer outputImage = OutputImageType::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 IteratorOutputType; + IteratorOutputType ito = IteratorOutputType(outputImage, outputImage->GetLargestPossibleRegion()); + + // Filter + // Set iterator + typedef itk::ImageRegionIterator IteratorType; + IteratorType it(input, input->GetLargestPossibleRegion()); + + // Set mask iterator + typedef itk::ImageRegionIterator IteratorMaskType; + IteratorMaskType itm(mask, mask->GetLargestPossibleRegion()); + + typedef itk::LabelStatisticsImageFilter< InputImageType, MaskImageType > LabelStatisticsImageFilterType; + typename LabelStatisticsImageFilterType::Pointer labelStatisticsImageFilter = LabelStatisticsImageFilterType::New(); + labelStatisticsImageFilter->SetLabelInput( mask ); + labelStatisticsImageFilter->SetInput(input); + 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(itm.Get() == 1) { + ito.Set(((float) it.Get() - minImg)/(maxImg-minImg)); + } + ++it; + ++ito; + ++itm; + } + // + // + // Write/Save results + this->template SetNextOutput(outputImage); + } + //-------------------------------------------------------------------- + + +}//end clitk + +#endif //#define clitkNormalizeImageFilterGenericFilter_txx