18 #ifndef __otbFrostImageFilter_txx
19 #define __otbFrostImageFilter_txx
39 template <
class TInputImage,
class TOutputImage>
45 template <
class TInputImage,
class TOutputImage>
47 itk::InvalidRequestedRegionError)
50 Superclass::GenerateInputRequestedRegion();
56 if (!inputPtr || !outputPtr)
63 typename TInputImage::RegionType inputRequestedRegion;
64 inputRequestedRegion = inputPtr->GetRequestedRegion();
67 inputRequestedRegion.PadByRadius(m_Radius);
70 if (inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()))
72 inputPtr->SetRequestedRegion(inputRequestedRegion);
81 inputPtr->SetRequestedRegion(inputRequestedRegion);
85 std::ostringstream msg;
86 msg << static_cast<const char *>(this->GetNameOfClass())
87 <<
"::GenerateInputRequestedRegion()";
89 e.
SetDescription(
"Requested region is (at least partially) outside the largest possible region.");
95 template<
class TInputImage,
class TOutputImage>
108 typename OutputImageType::Pointer output = this->GetOutput();
109 typename InputImageType::ConstPointer input = this->GetInput();
116 faceList = bC(input, outputRegionForThread, m_Radius);
124 double Mean, Variance;
133 for (fit = faceList.begin(); fit != faceList.end(); ++fit)
136 unsigned int neighborhoodSize = bit.
Size();
143 sum = itk::NumericTraits<InputRealType>::Zero;
144 sum2 = itk::NumericTraits<InputRealType>::Zero;
145 for (i = 0; i < neighborhoodSize; ++i)
147 dPixel =
static_cast<double>(bit.
GetPixel(i));
149 sum2 += dPixel * dPixel;
151 Mean = sum / double(neighborhoodSize);
152 Variance = sum2 / double(neighborhoodSize) - Mean * Mean;
160 Alpha = m_Deramp * Variance / (Mean * Mean);
166 const int rad_x = m_Radius[0];
167 const int rad_y = m_Radius[1];
169 for (
int x = -rad_x; x <= rad_x; ++x)
171 for (
int y = -rad_y; y <= rad_y; ++y)
173 double Dist = vcl_sqrt(static_cast<double>(x * x + y * y));
177 dPixel =
static_cast<double>(bit.
GetPixel(off));
179 CoefFilter = Alpha * vcl_exp(-Alpha * Dist);
180 NormFilter += CoefFilter;
181 FrostFilter += (CoefFilter * dPixel);
185 if (NormFilter == 0.) dPixel = 0.;
186 else dPixel = FrostFilter / NormFilter;
188 it.
Set(static_cast<OutputPixelType>(dPixel));
192 progress.CompletedPixel();
201 template <
class TInputImage,
class TOutput>
205 Superclass::PrintSelf(os, indent);
206 os << indent <<
"Radius: " << m_Radius << std::endl;