13 #ifndef itkMultiHistogramFilter_cpp 14 #define itkMultiHistogramFilter_cpp 18 #include <itkNeighborhoodIterator.h> 19 #include <itkImageRegionIterator.h> 20 #include <itkImageIterator.h> 21 #include "itkMinimumMaximumImageCalculator.h" 23 template<
class TInputImageType,
class TOuputImageType>
25 m_Delta(0.6), m_Offset(-3.0), m_Bins(11), m_Size(5), m_UseImageIntensityRange(false)
27 this->SetNumberOfRequiredOutputs(m_Bins);
28 this->SetNumberOfRequiredInputs(0);
30 for (
int i = 0; i < m_Bins; ++i)
36 template<
class TInputImageType,
class TOuputImageType>
40 typedef itk::MinimumMaximumImageCalculator <TInputImageType>
41 ImageCalculatorFilterType;
43 if (m_UseImageIntensityRange)
45 typename ImageCalculatorFilterType::Pointer imageCalculatorFilter
46 = ImageCalculatorFilterType::New();
47 imageCalculatorFilter->SetImage(this->GetInput(0));
48 imageCalculatorFilter->Compute();
50 m_Offset = imageCalculatorFilter->GetMinimum();
51 m_Delta = 1.0*(imageCalculatorFilter->GetMaximum() - imageCalculatorFilter->GetMinimum()) / (1.0*m_Bins);
55 for (
int i = 0; i < m_Bins; ++i)
60 template<
class TInputImageType,
class TOuputImageType>
65 double delta = m_Delta;
67 typedef itk::ImageRegionIterator<TInputImageType> IteratorType;
68 typedef itk::ConstNeighborhoodIterator<TInputImageType> ConstIteratorType;
70 typename TInputImageType::SizeType size; size.Fill(m_Size);
74 std::vector<IteratorType> iterVector;
75 for (
int i = 0; i < m_Bins; ++i)
77 IteratorType iter(this->GetOutput(i), outputRegionForThread);
78 iterVector.push_back(iter);
81 ConstIteratorType inputIter(size, input, outputRegionForThread);
82 while (!inputIter.IsAtEnd())
84 for (
int i = 0; i < m_Bins; ++i)
89 for (
unsigned int i = 0; i < inputIter.Size(); ++i)
91 double value = inputIter.GetPixel(i);
94 auto pos = (int)(value);
96 iterVector[pos].Value() += 1;
99 for (
int i = 0; i < m_Bins; ++i)
107 template<
class TInputImageType,
class TOuputImageType>
108 itk::ProcessObject::DataObjectPointer
111 itk::ProcessObject::DataObjectPointer output;
112 output = ( TOuputImageType::New() ).GetPointer();
116 template<
class TInputImageType,
class TOuputImageType>
120 output->SetRegions(input->GetLargestPossibleRegion());
124 #endif //itkMultiHistogramFilter_cpp
void CreateOutputImage(InputImagePointer input, OutputImagePointer output)
void ThreadedGenerateData(const OutputImageRegionType &outputRegionForThread, ThreadIdType threadId) override
TInputImageType::ConstPointer InputImagePointer
void BeforeThreadedGenerateData(void) override
itk::ProcessObject::DataObjectPointer MakeOutput(itk::ProcessObject::DataObjectPointerArraySizeType) override
TOuputImageType::Pointer OutputImagePointer
TOuputImageType::RegionType OutputImageRegionType