X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkImageStatisticsGenericFilter.txx;h=fabc429aef76a65c60c9fc5d031a80635ed8e6b3;hb=69e0d4a169d9b95536a0f45377bdb208814cf89b;hp=a0d2abfc609e101ece56b5b1e6606f13939f0064;hpb=cd04d8c797defe2fdaff3d1fa09928b22dd6edc4;p=clitk.git diff --git a/tools/clitkImageStatisticsGenericFilter.txx b/tools/clitkImageStatisticsGenericFilter.txx index a0d2abf..fabc429 100644 --- a/tools/clitkImageStatisticsGenericFilter.txx +++ b/tools/clitkImageStatisticsGenericFilter.txx @@ -1,7 +1,7 @@ /*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Authors belong to: + 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 @@ -21,16 +21,9 @@ #include "itkNthElementImageAdaptor.h" #include "itkJoinSeriesImageFilter.h" -/* ================================================= - * @file clitkImageStatisticsGenericFilter.txx - * @author - * @date - * - * @brief - * - ===================================================*/ #include "clitkImageStatisticsGenericFilter.h" - +#include "clitkCropLikeImageFilter.h" +#include "clitkResampleImageWithOptionsFilter.h" namespace clitk { @@ -39,36 +32,28 @@ namespace clitk // Update with the number of dimensions //------------------------------------------------------------------- template - void + void ImageStatisticsGenericFilter::UpdateWithDim(std::string PixelType) { if (m_Verbose) std::cout << "Image was detected to be "<(); + UpdateWithDimAndPixelType(); } - else if(PixelType == "unsigned_short"){ + else if(PixelType == "unsigned_short"){ if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl; - UpdateWithDimAndPixelType(); + UpdateWithDimAndPixelType(); } - - else if (PixelType == "unsigned_char"){ + + else if (PixelType == "unsigned_char"){ if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl; UpdateWithDimAndPixelType(); } - -// else if (PixelType == "unsigned_int"){ -// if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_int..." << std::endl; -// UpdateWithDimAndPixelType(); -// } - // else if (PixelType == "char"){ - // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl; - // UpdateWithDimAndPixelType(); - // } - else if(PixelType == "double"){ + + else if(PixelType == "double"){ if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and double..." << std::endl; - UpdateWithDimAndPixelType(); + UpdateWithDimAndPixelType(); } else { if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl; @@ -80,8 +65,8 @@ namespace clitk //------------------------------------------------------------------- // Update with the number of dimensions and the pixeltype //------------------------------------------------------------------- - template - void + template + void ImageStatisticsGenericFilter::UpdateWithDimAndPixelType() { @@ -89,20 +74,20 @@ namespace clitk typedef unsigned char LabelPixelType; typedef itk::Image, Dimension> InputImageType; typedef itk::Image LabelImageType; - + // Read the input typedef itk::ImageFileReader InputReaderType; typename InputReaderType::Pointer reader = InputReaderType::New(); reader->SetFileName( m_InputFileName); reader->Update(); typename InputImageType::Pointer input= reader->GetOutput(); - + typedef itk::NthElementImageAdaptor InputImageAdaptorType; typedef itk::Image OutputImageType; typename InputImageAdaptorType::Pointer input_adaptor = InputImageAdaptorType::New(); input_adaptor->SetImage(input); - + // Filter typedef itk::LabelStatisticsImageFilter StatisticsImageFilterType; typename StatisticsImageFilterType::Pointer statisticsFilter=StatisticsImageFilterType::New(); @@ -114,17 +99,18 @@ namespace clitk int maskDimension, maskComponents; std::string maskPixelType; ReadImageDimensionAndPixelType(m_ArgsInfo.mask_arg, maskDimension, maskPixelType, maskComponents); + if (maskDimension == Dimension - 1) { // Due to a limitation of filter itk::LabelStatisticsImageFilter, InputImageType and LabelImageType // must have the same image dimension. However, we want to support label images with Dl = Di - 1, // so we need to replicate the label image as many times as the size along dimension Di. - if (m_Verbose) + if (m_Verbose) std::cout << "Replicating label image to match input image's dimension... " << std::endl; - + typedef itk::Image ReducedLabelImageType; typedef itk::ImageFileReader LabelImageReaderType; typedef itk::JoinSeriesImageFilter JoinImageFilterType; - + typename LabelImageReaderType::Pointer labelImageReader=LabelImageReaderType::New(); labelImageReader->SetFileName(m_ArgsInfo.mask_arg); labelImageReader->Update(); @@ -133,7 +119,7 @@ namespace clitk typename InputImageType::SizeType size = input->GetLargestPossibleRegion().GetSize(); for (unsigned int i = 0; i < size[Dimension - 1]; i++) joinFilter->PushBackInput(labelImageReader->GetOutput()); - + joinFilter->Update(); labelImage = joinFilter->GetOutput(); } @@ -143,14 +129,47 @@ namespace clitk labelImageReader->SetFileName(m_ArgsInfo.mask_arg); labelImageReader->Update(); labelImage= labelImageReader->GetOutput(); + + // Check mask sampling/size + if (!HaveSameSizeAndSpacing(labelImage, input)) { + if (m_ArgsInfo.allow_resize_flag) { + if (m_ArgsInfo.verbose_flag) { + std::cout << "Resize mask image like input" << std::endl; + } + typedef clitk::ResampleImageWithOptionsFilter ResamplerType; + typename ResamplerType::Pointer resampler = ResamplerType::New(); + resampler->SetInput(labelImage); + resampler->SetOutputSpacing(input->GetSpacing()); + resampler->SetOutputOrigin(labelImage->GetOrigin()); + resampler->SetGaussianFilteringEnabled(false); + resampler->Update(); + labelImage = resampler->GetOutput(); + //writeImage(labelImage, "test1.mha"); + + typedef clitk::CropLikeImageFilter FilterType; + typename FilterType::Pointer crop = FilterType::New(); + crop->SetInput(labelImage); + crop->SetCropLikeImage(input); + crop->Update(); + labelImage = crop->GetOutput(); + //writeImage(labelImage, "test2.mha"); + + } + else { + std::cerr << "Mask image has a different size/spacing than input. Abort. (Use option to resize)" << std::endl; + exit(-1); + } + } + } } - else { + else { labelImage=LabelImageType::New(); labelImage->SetRegions(input->GetLargestPossibleRegion()); labelImage->SetOrigin(input->GetOrigin()); labelImage->SetSpacing(input->GetSpacing()); + labelImage->SetDirection(input->GetDirection()); labelImage->Allocate(); labelImage->FillBuffer(m_ArgsInfo.label_arg[0]); } @@ -166,20 +185,20 @@ namespace clitk unsigned int firstComponent = 0, lastComponent = 0; if (m_ArgsInfo.channel_arg == -1) { - firstComponent = 0; + firstComponent = 0; lastComponent = Components - 1; } else { firstComponent = m_ArgsInfo.channel_arg; lastComponent = m_ArgsInfo.channel_arg; } - + for (unsigned int c=firstComponent; c<=lastComponent; c++) { if (m_Verbose) std::cout << std::endl << "Processing channel " << c << std::endl; - + input_adaptor->SelectNthElement(c); input_adaptor->Update(); - + for (unsigned int k=0; k< numberOfLabels; k++) { label=m_ArgsInfo.label_arg[k]; @@ -218,7 +237,7 @@ namespace clitk std::cout<GetSum(label)<GetBoundingBox(label).size(); i++) std::cout<GetBoundingBox(label)[i]<<" "; std::cout<