21 #ifndef otbSpectralAngleDistanceImageFilter_hxx
22 #define otbSpectralAngleDistanceImageFilter_hxx
25 #include "itkImageRegionIterator.h"
26 #include "itkProgressReporter.h"
35 template <
class TInputImage,
class TOutputImage>
38 this->DynamicMultiThreadingOn();
43 template <
class TInputImage,
class TOutputImage>
46 if (this->GetInput()->GetNumberOfComponentsPerPixel() == 1)
48 itkExceptionMacro(<<
"Not valid input image : mono channel image gives a nul output image.");
52 template <
class TInputImage,
class TOutputImage>
56 if (m_ReferencePixel.Size() == 0)
58 itkExceptionMacro(<<
"Reference pixel is not set!");
61 InputImageConstPointerType inputPtr = this->GetInput();
62 OutputImagePointerType outputPtr = this->GetOutput();
66 if (m_ReferencePixel.GetSize() != inputPtr->GetNumberOfComponentsPerPixel())
68 itkExceptionMacro(<<
"Reference pixel size (" << m_ReferencePixel.GetSize() <<
" and input image pixel size (" << inputPtr->GetNumberOfComponentsPerPixel()
75 InputImageRegionType inputRegionForThread;
76 this->CallCopyOutputRegionToInputRegion(inputRegionForThread, outputRegionForThread);
79 itk::ImageRegionConstIterator<InputImageType> inputIt(inputPtr, inputRegionForThread);
80 itk::ImageRegionIterator<OutputImageType> outputIt(outputPtr, outputRegionForThread);
85 while (!inputIt.IsAtEnd() && !outputIt.IsAtEnd())
88 double scalarProd = 0.0;
89 double normProd = 0.0;
90 double normProd1 = 0.0;
91 double normProd2 = 0.0;
92 InputPixelType pixel = inputIt.Get();
93 for (
unsigned int i = 0; i < pixel.Size(); ++i)
95 scalarProd += pixel[i] * m_ReferencePixel[i];
96 normProd1 += pixel[i] * pixel[i];
97 normProd2 += m_ReferencePixel[i] * m_ReferencePixel[i];
99 normProd = normProd1 * normProd2;
107 dist = std::acos(scalarProd / std::sqrt(normProd));
114 outputIt.Set(
static_cast<OutputPixelType
>(dist));
void DynamicThreadedGenerateData(const OutputImageRegionType &outputRegionForThread) override
SpectralAngleDistanceImageFilter()
void BeforeThreadedGenerateData() override
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.