Skip to content
Snippets Groups Projects
Commit 7ec6cb85 authored by Angelos Tzotsos's avatar Angelos Tzotsos
Browse files

BUG: Split Ternary Filter to 2 parts

parent a85e7ac3
No related branches found
No related tags found
No related merge requests found
......@@ -67,7 +67,8 @@ public:
TPanImageType::ImageDimension> InternalImageType;
/** Single band Xs image type */
typedef otb::Image<TXsImageType::PixelType,
typedef typename TXsImageType::PixelType XsPixelType;
typedef otb::Image<XsPixelType,
TXsImageType::ImageDimension> XsBandImageType;
/** Internal image type used as Xs smoothing and local standard deviation filter output */
......@@ -122,19 +123,38 @@ private:
* This functor applies the LMVM
* operation. It is intended for internal use only.
*/
class FusionFunctor
class FusionFunctor1
{
public:
// Implement the fusion as a six arguments operator
typename TOutputImageType::PixelType operator()(const typename TXsImageType::PixelType& xsPixel,
const TInternalPrecision& smoothPanchroPixel,
const typename InternalVectorImageType::PixelType& smoothXsPixel,
typename TOutputImageType::PixelType operator()(const TInternalPrecision& smoothPanchroPixel,
const typename InternalVectorImageType::PixelType& stdXsPixel,
const TInternalPrecision& stdPanchroPixel,
const typename TPanImageType::PixelType& sharpPanchroPixel) const
{
// Build output pixel
typename TOutputImageType::PixelType output(xsPixel.Size());
typename TOutputImageType::PixelType output(stdXsPixel.Size());
// Perform fusion for each band with appropriate casting
for(unsigned int i = 0; i < stdXsPixel.Size(); ++i)
{
output[i] = static_cast<typename TOutputImageType::InternalPixelType>(
(sharpPanchroPixel - (smoothPanchroPixel * stdXsPixel[i])));
}
// Returns the output pixel
return output;
}
};
class FusionFunctor2
{
public:
// Implement the fusion as a six arguments operator
typename TOutputImageType::PixelType operator()(const typename TOutputImageType::PixelType& functor1Pixel,
const typename InternalVectorImageType::PixelType& smoothXsPixel,
const TInternalPrecision& stdPanchroPixel) const
{
// Build output pixel
typename TOutputImageType::PixelType output(smoothXsPixel.Size());
TInternalPrecision scale = 1.;
......@@ -144,10 +164,10 @@ private:
}
// Perform fusion for each band with appropriate casting
for(unsigned int i = 0; i < xsPixel.Size(); ++i)
for(unsigned int i = 0; i < smoothXsPixel.Size(); ++i)
{
output[i] = static_cast<typename TOutputImageType::InternalPixelType>(
(((sharpPanchroPixel - (smoothPanchroPixel * stdXsPixel[i])) * scale) + smoothXsPixel[i]));
((functor1Pixel[i] * scale) + smoothXsPixel[i]));
}
// Returns the output pixel
return output;
......@@ -158,17 +178,25 @@ private:
* Typedef of the TernaryFunctorImageFilter applying the fusion functor to
* p, p_smooth, p_std, xs_smooth, xs_std and xs.
*/
typedef itk::TernaryFunctorImageFilter<TXsImageType,
InternalImageType,
InternalVectorImageType,
typedef itk::TernaryFunctorImageFilter<InternalImageType,
InternalVectorImageType,
InternalImageType,
TPanImageType,
TOutputImageType,
FusionFunctor> FusionFilterType;
FusionFunctor1> FusionStep1FilterType;
/** Pointer to the fusion filter */
typename FusionFilterType::Pointer m_FusionFilter;
typename FusionStep1FilterType::Pointer m_FusionStep1Filter;
typedef itk::TernaryFunctorImageFilter<TOutputImageType,
InternalVectorImageType,
InternalImageType,
TOutputImageType,
FusionFunctor2> FusionStep2FilterType;
/** Pointer to the fusion filter */
typename FusionStep1FilterType::Pointer m_FusionStep2Filter;
/** Typedef of the convolution filter performing Pan smoothing */
typedef otb::ConvolutionImageFilter
......
......@@ -50,7 +50,8 @@ LmvmPanSharpeningFusionImageFilter
m_Filter.Fill(1);
// Instantiate fusion filter
m_FusionFilter = FusionFilterType::New();
m_FusionStep1Filter = FusionStep1FilterType::New();
m_FusionStep2Filter = FusionStep2FilterType::New();
// Set-up progress reporting
m_ProgressAccumulator = itk::ProgressAccumulator::New();
......@@ -59,7 +60,8 @@ LmvmPanSharpeningFusionImageFilter
m_ProgressAccumulator->RegisterInternalFilter(m_PanNoiseFilter, 0.2);
m_ProgressAccumulator->RegisterInternalFilter(m_XsVectorConvolutionFilter, 0.2);
m_ProgressAccumulator->RegisterInternalFilter(m_XsVectorNoiseFilter, 0.2);
m_ProgressAccumulator->RegisterInternalFilter(m_FusionFilter, 0.2);
m_ProgressAccumulator->RegisterInternalFilter(m_FusionStep1Filter, 0.1);
m_ProgressAccumulator->RegisterInternalFilter(m_FusionStep2Filter, 0.1);
}
template <class TPanImageType, class TXsImageType, class TOutputImageType, class TInternalPrecision>
......@@ -151,17 +153,18 @@ LmvmPanSharpeningFusionImageFilter
m_XsVectorNoiseFilter->SetFilter(m_XsNoiseFilter);
m_FusionFilter->SetInput1(this->GetXsInput());
m_FusionFilter->SetInput2(m_PanConvolutionFilter->GetOutput());
m_FusionFilter->SetInput3(m_XsVectorConvolutionFilter->GetOutput());
m_FusionFilter->SetInput4(m_XsVectorNoiseFilter->GetOutput());
m_FusionFilter->SetInput5(m_PanNoiseFilter->GetOutput());
m_FusionFilter->SetInput6(this->GetPanInput());
m_FusionStep1Filter->SetInput2(m_XsVectorNoiseFilter->GetOutput());
m_FusionStep1Filter->SetInput1(m_PanConvolutionFilter->GetOutput());
m_FusionStep1Filter->SetInput3(this->GetPanInput());
m_FusionStep2Filter->SetInput1(m_FusionStep1Filter->GetOutput());
m_FusionStep2Filter->SetInput3(m_PanNoiseFilter->GetOutput());
m_FusionStep2Filter->SetInput2(m_XsVectorConvolutionFilter->GetOutput());
// Wire composite filter
m_FusionFilter->GraftOutput(this->GetOutput());
m_FusionFilter->Update();
this->GraftOutput(m_FusionFilter->GetOutput());
m_FusionStep2Filter->GraftOutput(this->GetOutput());
m_FusionStep2Filter->Update();
this->GraftOutput(m_FusionStep2Filter->GetOutput());
}
template <class TPanImageType, class TXsImageType, class TOutputImageType, class TInternalPrecision>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment