An error occurred while loading the file. Please try again.
-
remi cresson authored9e8f08ce
/*=========================================================================
Copyright (c) Remi Cresson (IRSTEA). All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __MeanResampleImageFilter_hxx
#define __MeanResampleImageFilter_hxx
#include <otbMeanResampleImageFilter.h>
#include "itkProgressReporter.h"
namespace otb
{
/**
*
*/
template <class TImage>
MeanResampleImageFilter<TImage>
::MeanResampleImageFilter()
{
m_StepX = 1;
m_StepY = 1;
m_NoDataValue = 0;
}
template <class TImage>
void
MeanResampleImageFilter<TImage>
::GenerateOutputInformation()
{
Superclass::GenerateOutputInformation();
// Grab input image
ImageType * inputImage = static_cast<ImageType * >(
Superclass::ProcessObject::GetInput(0) );
ImageType * outputPtr = this->GetOutput();
// The new output image has the same origin
ImagePointType origin = inputImage->GetOrigin();
origin[0] += 0.5 * inputImage->GetSignedSpacing()[0] * (m_StepX - 1);
origin[1] += 0.5 * inputImage->GetSignedSpacing()[1] * (m_StepY - 1);
outputPtr->SetOrigin ( origin );
// New spacing for the output image
ImageSpacingType spacing = inputImage->GetSignedSpacing();
spacing[0] *= m_StepX;
spacing[1] *= m_StepY;
outputPtr->SetSignedSpacing (spacing);
// New size for the output image
ImageRegionType inRegion = inputImage->GetLargestPossibleRegion();
ImageRegionType outRegion;
outRegion.SetIndex(0, 0);
outRegion.SetIndex(1, 0);
outRegion.SetSize (0, inRegion.GetSize()[0] / m_StepX);
outRegion.SetSize (1, inRegion.GetSize()[1] / m_StepY);
outputPtr->SetLargestPossibleRegion( outRegion );
}
template <class TImage>
void
MeanResampleImageFilter<TImage>
::GenerateInputRequestedRegion()
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
{
// Output requested region
const ImageRegionType outRegion = this->GetOutput()->GetRequestedRegion();
// Grab input image
ImageType * inputImage = static_cast<ImageType * >(
Superclass::ProcessObject::GetInput(0) );
ImageRegionType inRegion;
inRegion.SetIndex(0, outRegion.GetIndex()[0] * m_StepX);
inRegion.SetIndex(1, outRegion.GetIndex()[1] * m_StepY);
inRegion.SetSize (0, outRegion.GetSize()[0] * m_StepX);
inRegion.SetSize (1, outRegion.GetSize()[1] * m_StepY);
inRegion.Crop(inputImage->GetLargestPossibleRegion());
inputImage->SetRequestedRegion(inRegion);
}
/**
*
*/
template <class TImage>
void
MeanResampleImageFilter<TImage>
::ThreadedGenerateData(const ImageRegionType& outputRegionForThread, itk::ThreadIdType threadId)
{
// Support progress methods/callbacks
itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels() );
// Iterate through the thread region
OutputImageIteratorType outputIt(this->GetOutput(), outputRegionForThread);
// Grab input image
ImageType * inputImage = static_cast<ImageType * >(
Superclass::ProcessObject::GetInput(0) );
for ( outputIt.GoToBegin(); !outputIt.IsAtEnd(); ++outputIt)
{
// sum
float accum = 0.0;
float npix = 0.0;
for (unsigned int x = 0; x < m_StepX ; x++)
for (unsigned int y = 0; y < m_StepY ; y++)
{
ImageIndexType index = outputIt.GetIndex();
index[0] *= m_StepX;
index[1] *= m_StepY;
index[0] += x;
index[1] += y;
if (inputImage->GetLargestPossibleRegion().IsInside(index))
{
float pixVal = inputImage->GetPixel(index);
if (pixVal != m_NoDataValue)
{
accum += pixVal;
npix += 1.0;
}
}
}
// normalize
if (npix > 0.0)
accum /= npix;
outputIt.Set(accum);
progress.CompletedPixel();
141142143144145146147148
} // Next pixel
}
}
#endif