18 #include "itkImageRegionIterator.h" 24 #include <itkLabelStatisticsImageFilter.h> 25 #include <itkMinimumMaximumImageCalculator.h> 31 this->SetNumberOfIndexedInputs(3);
32 this->SetNumberOfRequiredInputs(1);
43 this->SetNthInput(1, nonconstMask );
50 this->SetNthInput(2, nonconstMask );
65 Superclass::GenerateInputRequestedRegion();
77 itkDebugMacro(<<
"GenerateOutputInformation()");
79 output->Initialize(input->GetPixelType(), *input->GetTimeGeometry());
80 output->SetPropertyList(input->GetPropertyList()->Clone());
83 template <
typename TPixel,
unsigned int VImageDimension >
87 typedef itk::Image<TPixel, VImageDimension>
ImageType;
88 typedef itk::Image<int, VImageDimension> MaskType;
89 typedef itk::LabelStatisticsImageFilter<ImageType, MaskType> FilterType;
90 typedef itk::MinimumMaximumImageCalculator<ImageType> MinMaxComputerType;
92 typename MaskType::Pointer itkMask0 = MaskType::New();
93 typename MaskType::Pointer itkMask1 = MaskType::New();
97 typename ImageType::Pointer outImage = ImageType::New();
100 typename MinMaxComputerType::Pointer minMaxComputer = MinMaxComputerType::New();
101 minMaxComputer->SetImage(itkImage);
102 minMaxComputer->Compute();
104 typename FilterType::Pointer labelStatisticsImageFilter = FilterType::New();
105 labelStatisticsImageFilter->SetUseHistograms(
true);
106 labelStatisticsImageFilter->SetHistogramParameters(256, minMaxComputer->GetMinimum(),minMaxComputer->GetMaximum());
107 labelStatisticsImageFilter->SetInput( itkImage );
109 labelStatisticsImageFilter->SetLabelInput(itkMask0);
110 labelStatisticsImageFilter->Update();
111 double median0 = labelStatisticsImageFilter->GetMedian(1);
112 double mean0 = labelStatisticsImageFilter->GetMean(1);
115 auto histo = labelStatisticsImageFilter->GetHistogram(1);
116 double maxFrequency=0;
117 for (
auto hIter=histo->Begin();hIter!=histo->End();++hIter)
119 if (maxFrequency < hIter.GetFrequency())
121 maxFrequency = hIter.GetFrequency();
122 modulo0 = (histo->GetBinMin(0,hIter.GetInstanceIdentifier()) + histo->GetBinMax(0,hIter.GetInstanceIdentifier())) / 2.0;
126 labelStatisticsImageFilter->SetLabelInput(itkMask1);
127 labelStatisticsImageFilter->Update();
128 double median1 = labelStatisticsImageFilter->GetMedian(1);
129 double mean1 = labelStatisticsImageFilter->GetMean(1);
132 auto histo = labelStatisticsImageFilter->GetHistogram(1);
133 double maxFrequency=0;
134 for (
auto hIter=histo->Begin();hIter!=histo->End();++hIter)
136 if (maxFrequency < hIter.GetFrequency())
138 maxFrequency = hIter.GetFrequency();
139 modulo1 = (histo->GetBinMin(0,hIter.GetInstanceIdentifier()) + histo->GetBinMax(0,hIter.GetInstanceIdentifier())) / 2.0;
151 value0=median0;
break;
153 value0=modulo0;
break;
160 value1=median1;
break;
162 value1=modulo1;
break;
167 if (scaling < 0.0001)
170 itk::ImageRegionIterator<ImageType> inIter(itkImage, itkImage->GetLargestPossibleRegion());
171 itk::ImageRegionIterator<ImageType> outIter(outImage, outImage->GetLargestPossibleRegion());
172 while (! inIter.IsAtEnd())
174 TPixel value = inIter.Value();
175 outIter.Set((value - offset) / scaling);
void SetRequestedRegionToLargestPossibleRegion() override
void InternalComputeMask(itk::Image< TPixel, VImageDimension > *itkImage)
NormalizationBase m_Area1
itk::Image< unsigned char, 3 > ImageType
void GenerateInputRequestedRegion() override
const mitk::Image * GetMask1() const
NormalizationBase m_Area2
void GenerateData() override
Image class for storing images.
#define AccessByItk(mitkImage, itkImageTypeFunction)
Access a MITK image by an ITK image.
void GenerateOutputInformation() override
void SetMask2(const mitk::Image *mask)
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.
const mitk::Image * GetMask2() const
void SetMask1(const mitk::Image *mask)
MRNormTwoRegionsBasedFilter()
~MRNormTwoRegionsBasedFilter() override