#define clitkImageStatisticsGenericFilter_txx
#include "itkNthElementImageAdaptor.h"
+#include "itkJoinSeriesImageFilter.h"
/* =================================================
* @file clitkImageStatisticsGenericFilter.txx
* @brief
*
===================================================*/
+#include "clitkImageStatisticsGenericFilter.h"
namespace clitk
if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed short..." << std::endl;
UpdateWithDimAndPixelType<Dimension, signed short, Components>();
}
- // else if(PixelType == "unsigned_short"){
- // if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
- // UpdateWithDimAndPixelType<Dimension, unsigned short>();
- // }
+ else if(PixelType == "unsigned_short"){
+ if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_short..." << std::endl;
+ UpdateWithDimAndPixelType<Dimension, unsigned short, Components>();
+ }
else if (PixelType == "unsigned_char"){
if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_char..." << std::endl;
UpdateWithDimAndPixelType<Dimension, unsigned char, Components>();
}
+// else if (PixelType == "unsigned_int"){
+// if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and unsigned_int..." << std::endl;
+// UpdateWithDimAndPixelType<Dimension, unsigned int, Components>();
+// }
// else if (PixelType == "char"){
// if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and signed_char..." << std::endl;
// UpdateWithDimAndPixelType<Dimension, signed char>();
// }
+ else if(PixelType == "double"){
+ if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and double..." << std::endl;
+ UpdateWithDimAndPixelType<Dimension, double, Components>();
+ }
else {
if (m_Verbose) std::cout << "Launching filter in "<< Dimension <<"D and float..." << std::endl;
UpdateWithDimAndPixelType<Dimension, float, Components>();
{
// ImageTypes
+ typedef unsigned char LabelPixelType;
typedef itk::Image<itk::Vector<PixelType, Components>, Dimension> InputImageType;
- typedef itk::Image<unsigned int, Dimension> LabelImageType;
+ typedef itk::Image<LabelPixelType, Dimension> LabelImageType;
// Read the input
typedef itk::ImageFileReader<InputImageType> InputReaderType;
// Label image
typename LabelImageType::Pointer labelImage;
if (m_ArgsInfo.mask_given) {
- typedef itk::ImageFileReader<LabelImageType> 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<LabelPixelType, Dimension - 1> ReducedLabelImageType;
+ typedef itk::ImageFileReader<ReducedLabelImageType> LabelImageReaderType;
+ typedef itk::JoinSeriesImageFilter<ReducedLabelImageType, LabelImageType> 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<LabelImageType> LabelImageReaderType;
+ typename LabelImageReaderType::Pointer labelImageReader=LabelImageReaderType::New();
+ labelImageReader->SetFileName(m_ArgsInfo.mask_arg);
+ labelImageReader->Update();
+ labelImage= labelImageReader->GetOutput();
+ }
+
}
else {
labelImage=LabelImageType::New();