X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkImageStatisticsGenericFilter.txx;h=d1b0d4c4abf845ce98e50054e8d259093523e37a;hb=20c4d89862ca9a9f4be92f312db7c6572e24075e;hp=cf05bb65d642eb61680a3b49039c8619f4c0b5db;hpb=b96634936966a5da8c3d6ebb72b8954fb53b800a;p=clitk.git diff --git a/tools/clitkImageStatisticsGenericFilter.txx b/tools/clitkImageStatisticsGenericFilter.txx index cf05bb6..d1b0d4c 100644 --- a/tools/clitkImageStatisticsGenericFilter.txx +++ b/tools/clitkImageStatisticsGenericFilter.txx @@ -19,6 +19,7 @@ #define clitkImageStatisticsGenericFilter_txx #include "itkNthElementImageAdaptor.h" +#include "itkJoinSeriesImageFilter.h" /* ================================================= * @file clitkImageStatisticsGenericFilter.txx @@ -28,6 +29,7 @@ * @brief * ===================================================*/ +#include "clitkImageStatisticsGenericFilter.h" namespace clitk @@ -76,8 +78,9 @@ namespace clitk { // ImageTypes + typedef unsigned char LabelPixelType; typedef itk::Image, Dimension> InputImageType; - typedef itk::Image LabelImageType; + typedef itk::Image LabelImageType; // Read the input typedef itk::ImageFileReader InputReaderType; @@ -100,11 +103,40 @@ namespace clitk // Label image typename LabelImageType::Pointer labelImage; if (m_ArgsInfo.mask_given) { - typedef itk::ImageFileReader LabelImageReaderType; - typename LabelImageReaderType::Pointer labelImageReader=LabelImageReaderType::New(); - labelImageReader->SetFileName(m_ArgsInfo.mask_arg); - labelImageReader->Update(); - labelImage= labelImageReader->GetOutput(); + 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) + 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(); + + typename JoinImageFilterType::Pointer joinFilter = JoinImageFilterType::New(); + 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(); + } + else { + typedef itk::ImageFileReader LabelImageReaderType; + typename LabelImageReaderType::Pointer labelImageReader=LabelImageReaderType::New(); + labelImageReader->SetFileName(m_ArgsInfo.mask_arg); + labelImageReader->Update(); + labelImage= labelImageReader->GetOutput(); + } + } else { labelImage=LabelImageType::New();