X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkMaskOfIntegratedIntensityGenericFilter.txx;fp=tools%2FclitkMaskOfIntegratedIntensityGenericFilter.txx;h=3096d87cebdc89e10a009a3518778107f33caf23;hb=64e548f2c8c2976f9573855e438437c9447d5d34;hp=0000000000000000000000000000000000000000;hpb=43f2c99b1e1f826d2c1c78b97aef4798bd56398c;p=clitk.git diff --git a/tools/clitkMaskOfIntegratedIntensityGenericFilter.txx b/tools/clitkMaskOfIntegratedIntensityGenericFilter.txx new file mode 100644 index 0000000..3096d87 --- /dev/null +++ b/tools/clitkMaskOfIntegratedIntensityGenericFilter.txx @@ -0,0 +1,169 @@ +/*========================================================================= + 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 clitkMaskOfIntegratedIntensityGenericFilter_txx +#define clitkMaskOfIntegratedIntensityGenericFilter_txx + +// itk include +#include "itkIntensityWindowingImageFilter.h" +#include "itkLabelStatisticsImageFilter.h" +#include "itkMaskImageFilter.h" +#include "itkMaskNegatedImageFilter.h" +#include +#include + +namespace clitk +{ + + //-------------------------------------------------------------------- + template + MaskOfIntegratedIntensityGenericFilter::MaskOfIntegratedIntensityGenericFilter(): + ImageToImageGenericFilter("MaskOfIntegratedIntensity") + { + InitializeImageType<2>(); + InitializeImageType<3>(); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + template + void MaskOfIntegratedIntensityGenericFilter::InitializeImageType() + { + ADD_DEFAULT_IMAGE_TYPES(Dim); + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + template + void MaskOfIntegratedIntensityGenericFilter::SetArgsInfo(const args_info_type & a) + { + mArgsInfo=a; + this->SetIOVerbose(mArgsInfo.verbose_flag); + if (mArgsInfo.imagetypes_flag) this->PrintAvailableImageTypes(); + + this->SetInputFilename(mArgsInfo.input_arg); + this->SetOutputFilename(mArgsInfo.output_arg); + this->SetPercentage(mArgsInfo.percentage_arg); + + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + // https://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes + template + std::vector sort_indexes(const std::vector &v) { + + // initialize original index locations + std::vector idx(v.size()); + iota(idx.begin(), idx.end(), 0); + + // sort indexes based on comparing values in v + std::sort(idx.begin(), idx.end(), + [&v](size_t i1, size_t i2) {return v[i1] > v[i2];}); + + return idx; + } + //-------------------------------------------------------------------- + + + //-------------------------------------------------------------------- + // Update with the number of dimensions and the pixeltype + //-------------------------------------------------------------------- + template + template + void + MaskOfIntegratedIntensityGenericFilter::UpdateWithInputImageType() + { + // Main filter + typedef typename InputImageType::PixelType InputPixelType; + typedef itk::Image MaskImageType; + + // Reading input + typename InputImageType::Pointer input = this->template GetInput(0); + + typename MaskImageType::Pointer mask; + mask = MaskImageType::New(); + mask->SetRegions(input->GetLargestPossibleRegion()); + mask->SetOrigin(input->GetOrigin()); + mask->SetSpacing(input->GetSpacing()); + mask->Allocate(); + mask->FillBuffer(0); + + // Get a vector of all values (will be easier to sort) + // And compute total sum of values + std::vector values; + typedef itk::ImageRegionIterator IteratorInputType; + IteratorInputType iter(input, input->GetLargestPossibleRegion()); + iter.GoToBegin(); + double total = 0.0; + while (!iter.IsAtEnd()) { + values.push_back(iter.Get()); + total += iter.Get(); + ++iter; + } + + // Sort (reverse) + auto indices = sort_indexes(values); + + // Get max index of pixel to reach xx percent + double current = 0.0; + double max = GetPercentage()/100.0*total; + int i=0; + auto n = input->GetLargestPossibleRegion().GetNumberOfPixels(); + std::vector should_keep(values.size());; + std::fill(should_keep.begin(), should_keep.end(), 0); + while (current IteratorMaskType; + IteratorMaskType itm(mask, mask->GetLargestPossibleRegion()); + iter.GoToBegin(); + itm.GoToBegin(); + i = 0; + while (!iter.IsAtEnd()) { + if (should_keep[i]) itm.Set(1); + ++iter; + ++itm; + ++i; + } + + // Verbose option + if (this->m_IOVerbose) + std::cout << "Sum of pixel values : " << total << std::endl + << "Percentage : " << GetPercentage() << "%" << std::endl + << "Number of pixels : " << nb << "/" << n << std::endl + << "Number of pixels : " << nb/n*100.0 << "%" << std::endl; + + // Write/Save results + this->template SetNextOutput(mask); + } + //-------------------------------------------------------------------- + + +}//end clitk + +#endif //#define clitkMaskOfIntegratedIntensityGenericFilter_txx