X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=filters%2FclitkImageFillRegionGenericFilter.cxx;h=dd5a51ab667d6db2b32b9bdff2d889ef577932fc;hb=8abe9edbdc63a33f8fbb1f321073b762e08be9aa;hp=59bbff4f85921a622b713b35b0b6f0a8b21d6c02;hpb=931a42358442f4ee4f314613c991c838d4b4e3b7;p=clitk.git diff --git a/filters/clitkImageFillRegionGenericFilter.cxx b/filters/clitkImageFillRegionGenericFilter.cxx index 59bbff4..dd5a51a 100644 --- a/filters/clitkImageFillRegionGenericFilter.cxx +++ b/filters/clitkImageFillRegionGenericFilter.cxx @@ -1,31 +1,39 @@ /*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de - l'Image). All rights reserved. See Doc/License.txt or - http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details. - - This software is distributed WITHOUT ANY WARRANTY; without even - the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. See the above copyright notices for more information. - -=========================================================================*/ + 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 CLITKIMAGEFILLREGIONGENERICFILTER_CXX #define CLITKIMAGEFILLREGIONGENERICFILTER_CXX - /** ------------------------------------------------------------------- * @file clitkImageFillRegionGenericFilter.cxx * @author David Sarrut * @date 23 Feb 2008 - * @brief + * @brief -------------------------------------------------------------------*/ #include "clitkImageFillRegionGenericFilter.h" //-------------------------------------------------------------------- -clitk::ImageFillRegionGenericFilter::ImageFillRegionGenericFilter() { +clitk::ImageFillRegionGenericFilter::ImageFillRegionGenericFilter(): + clitk::ImageToImageGenericFilter("ImageFillRegion") +{ + InitializeImageType<2>(); + InitializeImageType<3>(); mPixelValue = 0; m_IsCentered=false; mSphericRegion=false; @@ -34,10 +42,131 @@ clitk::ImageFillRegionGenericFilter::ImageFillRegionGenericFilter() { //-------------------------------------------------------------------- -void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector & radius, - std::vector & center) +template +void clitk::ImageFillRegionGenericFilter::InitializeImageType() +{ + // ADD_IMAGE_TYPE(Dim, char); + ADD_IMAGE_TYPE(Dim, short); + // ADD_IMAGE_TYPE(Dim, unsigned short); +// ADD_IMAGE_TYPE(Dim, int); + ADD_IMAGE_TYPE(Dim, float); + // ADD_IMAGE_TYPE(Dim, double); +} +//-------------------------------------------------------------------- + + + +//-------------------------------------------------------------------- +template +void clitk::ImageFillRegionGenericFilter::UpdateWithInputImageType() +{ + + // Typedef + typedef typename ImageType::PixelType PixelType; + static unsigned int Dim = ImageType::ImageDimension; + + // Spheric region + if (mSphericRegion) return Update_WithDimAndPixelType_SphericRegion(); + + // Read input + typename ImageType::Pointer input = GetInput(0); + + // Get pixel value in correct type + PixelType value = PixelTypeDownCast(mPixelValue); + + // Get region + typedef typename ImageType::RegionType RegionType; + typedef typename ImageType::SizeType SizeType; + typedef typename ImageType::IndexType IndexType; + RegionType region; + SizeType size; + IndexType start; + for(unsigned int i=0; i IteratorType; + IteratorType it(input, region); + it.GoToBegin(); + while (!it.IsAtEnd()) { + it.Set(value); + ++it; + } + + // Write results + SetNextOutput(input); +} +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +template +void clitk::ImageFillRegionGenericFilter::Update_WithDimAndPixelType_SphericRegion() { - mRadius.clear(); + + // Read input + typedef itk::Image ImageType; + //typename ImageType::Pointer input = clitk::readImage(mInputFilenames[0], mIOVerbose); + typename ImageType::Pointer input = GetInput(0); + + // Get pixel value in correct type + PixelType value = PixelTypeDownCast(mPixelValue); + + // Centered? + if(m_IsCentered) { + typename ImageType::SizeType size= input->GetLargestPossibleRegion().GetSize(); + typename ImageType::SpacingType spacing= input->GetSpacing(); + typename ImageType::PointType origin= input->GetOrigin(); + mCenter.resize(Dim); + for (unsigned int i=0; i IteratorType; + IteratorType it(input, input->GetLargestPossibleRegion()); + it.GoToBegin(); + + typename ImageType::PointType point; + //typename itk::Vector distance; + typename ImageType::IndexType index; + //bool inside; + double distance; + + while (!it.IsAtEnd()) { + // inside=true; + index=it.GetIndex(); + input->TransformIndexToPhysicalPoint(index, point); + distance=0.0; + for(unsigned int i=0; i(input); +} + +//-------------------------------------------------------------------- + + + +//-------------------------------------------------------------------- +void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector & radius, + std::vector & center) +{ + mRadius.clear(); mRadius.resize(radius.size()); std::copy(radius.begin(), radius.end(), mRadius.begin()); mCenter.clear(); @@ -47,8 +176,9 @@ void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector & m_IsCentered=false; } -void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector & radius) { - mRadius.clear(); +void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector & radius) +{ + mRadius.clear(); mRadius.resize(radius.size()); std::copy(radius.begin(), radius.end(), mRadius.begin()); m_IsCentered=true; @@ -57,25 +187,4 @@ void clitk::ImageFillRegionGenericFilter::SetSphericRegion(std::vector & //-------------------------------------------------------------------- -//-------------------------------------------------------------------- -void clitk::ImageFillRegionGenericFilter::Update () { - - // Load image header - itk::ImageIOBase::Pointer header = clitk::readImageHeader(mInputFilenames[0]); - - // Determine dim, pixel type, number of components - mDim = header->GetNumberOfDimensions(); - mPixelTypeName = header->GetComponentTypeAsString(header->GetComponentType()); - mNbOfComponents = header->GetNumberOfComponents(); - - // Switch by dimension - if (mDim == 2) { Update_WithDim<2>(); return; } - if (mDim == 3) { Update_WithDim<3>(); return; } - // if (mDim == 4) { Update_WithDim<4>(); return; } - - std::cerr << "Error, dimension of input image is " << mDim << ", but I only work with 2,3,4." << std::endl; - exit(0); -} -//-------------------------------------------------------------------- - #endif //define CLITKIMAGEFILLREGIONGENERICFILTER_CXX