18 #include "itkImageRegionIterator.h" 24 #include <itkLabelStatisticsImageFilter.h> 25 #include <itkMinimumMaximumImageCalculator.h> 30 this->SetNumberOfIndexedInputs(2);
31 this->SetNumberOfRequiredInputs(1);
42 this->SetNthInput(1, nonconstMask );
52 Superclass::GenerateInputRequestedRegion();
64 itkDebugMacro(<<
"GenerateOutputInformation()");
66 output->Initialize(input->GetPixelType(), *input->GetTimeGeometry());
67 output->SetPropertyList(input->GetPropertyList()->Clone());
70 template <
typename TPixel,
unsigned int VImageDimension >
74 typedef itk::Image<TPixel, VImageDimension>
ImageType;
75 typedef itk::Image<int, VImageDimension> MaskType;
76 typedef itk::LabelStatisticsImageFilter<ImageType, MaskType> FilterType;
77 typedef itk::MinimumMaximumImageCalculator<ImageType> MinMaxComputerType;
79 typename MaskType::Pointer itkMask0 = MaskType::New();
82 typename ImageType::Pointer outImage = ImageType::New();
85 typename MinMaxComputerType::Pointer minMaxComputer = MinMaxComputerType::New();
86 minMaxComputer->SetImage(itkImage);
87 minMaxComputer->Compute();
88 double min = minMaxComputer->GetMinimum();
89 double max = minMaxComputer->GetMaximum();
93 typename FilterType::Pointer labelStatisticsImageFilter = FilterType::New();
94 labelStatisticsImageFilter->SetUseHistograms(
true);
95 labelStatisticsImageFilter->SetHistogramParameters(2048, min, max);
96 labelStatisticsImageFilter->SetInput(itkImage);
98 labelStatisticsImageFilter->SetLabelInput(itkMask0);
99 labelStatisticsImageFilter->Update();
100 auto histo = labelStatisticsImageFilter->GetHistogram(1);
101 min = histo->Quantile(0, 0.02);
102 max = histo->Quantile(0, 0.98);
106 typename FilterType::Pointer labelStatisticsImageFilter = FilterType::New();
107 labelStatisticsImageFilter->SetUseHistograms(
true);
108 labelStatisticsImageFilter->SetHistogramParameters(256, min, max);
109 labelStatisticsImageFilter->SetInput( itkImage );
111 labelStatisticsImageFilter->SetLabelInput(itkMask0);
112 labelStatisticsImageFilter->Update();
113 double median0 = labelStatisticsImageFilter->GetMedian(1);
114 double mean0 = labelStatisticsImageFilter->GetMean(1);
115 double stddev = labelStatisticsImageFilter->GetSigma(1);
118 auto histo = labelStatisticsImageFilter->GetHistogram(1);
119 double maxFrequency=0;
120 for (
auto hIter=histo->Begin();hIter!=histo->End();++hIter)
122 if (maxFrequency < hIter.GetFrequency())
124 maxFrequency = hIter.GetFrequency();
125 modulo0 = (histo->GetBinMin(0,hIter.GetInstanceIdentifier()) + histo->GetBinMax(0,hIter.GetInstanceIdentifier())) / 2.0;
136 value0=median0;
break;
138 value0=modulo0;
break;
141 double offset = value0+m_TargetValue;
142 double scaling = stddev*m_TargetWidth;
143 if (scaling < 0.0001)
146 itk::ImageRegionIterator<ImageType> inIter(itkImage, itkImage->GetLargestPossibleRegion());
147 itk::ImageRegionIterator<ImageType> outIter(outImage, outImage->GetLargestPossibleRegion());
148 while (! inIter.IsAtEnd())
150 TPixel value = inIter.Value();
160 outIter.Set((value - offset) / scaling);
void SetRequestedRegionToLargestPossibleRegion() override
void GenerateData() override
itk::Image< unsigned char, 3 > ImageType
void SetMask(const mitk::Image *mask)
MRNormLinearStatisticBasedFilter()
void InternalComputeMask(itk::Image< TPixel, VImageDimension > *itkImage)
~MRNormLinearStatisticBasedFilter() override
Image class for storing images.
#define AccessByItk(mitkImage, itkImageTypeFunction)
Access a MITK image by an ITK image.
const mitk::Image * GetMask() const
InputImageType * GetInput(void)
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
mitk::Image::Pointer mask
OutputType * GetOutput()
Get the output data of this image source object.
void GenerateInputRequestedRegion() override
NormalizationBase m_CenterMode
void GenerateOutputInformation() override