18 #ifndef __otbTouziEdgeDetectorImageFilter_txx
19 #define __otbTouziEdgeDetectorImageFilter_txx
40 template <
class TInputImage,
class TOutputImage,
class TOutputImageDirection>
46 template <
class TInputImage,
class TOutputImage,
class TOutputImageDirection>
48 TOutputImageDirection>::GenerateInputRequestedRegion() throw (
49 itk::InvalidRequestedRegionError)
52 Superclass::GenerateInputRequestedRegion();
58 if (!inputPtr || !outputPtr)
65 typename TInputImage::RegionType inputRequestedRegion;
66 inputRequestedRegion = inputPtr->GetRequestedRegion();
69 inputRequestedRegion.PadByRadius(m_Radius);
72 if (inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()))
74 inputPtr->SetRequestedRegion(inputRequestedRegion);
83 inputPtr->SetRequestedRegion(inputRequestedRegion);
87 std::ostringstream msg;
88 msg << static_cast<const char *>(this->GetNameOfClass())
89 <<
"::GenerateInputRequestedRegion()";
91 e.
SetDescription(
"Requested region is (at least partially) outside the largest possible region.");
102 template <
class TInputImage,
class TOutputImage,
class TOutputImageDirection>
108 typename OutputImageDirectionType::RegionType region;
109 typename OutputImageType::Pointer output = this->GetOutput();
113 region.SetSize(output->GetRequestedRegion().GetSize());
114 region.SetIndex(output->GetRequestedRegion().GetIndex());
115 direction->SetRegions(region);
116 direction->SetOrigin(output->GetOrigin());
117 direction->SetSpacing(output->GetSpacing());
118 direction->Allocate();
121 template <
class TInputImage,
class TOutputImage,
class TOutputImageDirection>
136 typename OutputImageType::Pointer output = this->GetOutput();
137 typename InputImageType::ConstPointer input = this->GetInput();
138 typename OutputImageDirectionType::Pointer outputDir = this->GetOutputDirection();
145 faceList = bC(input, outputRegionForThread, m_Radius);
150 typename TInputImage::IndexType bitIndex;
155 const int NB_DIR = 4;
157 const int NB_REGION = 2;
159 double Theta[NB_DIR];
167 double Sum[NB_DIR][NB_REGION];
173 double R_theta[NB_DIR];
174 double Sum_R_theta = 0.;
178 double Dir_contour = 0.;
193 for (fit = faceList.begin(); fit != faceList.end(); ++fit)
199 unsigned int neighborhoodSize = bit.
Size();
217 for (
int dir = 0; dir < NB_DIR; ++dir)
219 for (
int m = 0; m < NB_REGION; m++)
228 for (i = 0; i < neighborhoodSize; ++i)
238 if (y < yc) Sum[0][0] +=
static_cast<double>(bit.
GetPixel(i));
239 else if (y > yc) Sum[0][1] +=
static_cast<double>(bit.
GetPixel(i));
242 if ((y - yc) < (x - xc)) Sum[1][0] +=
static_cast<double>(bit.
GetPixel(i));
243 else if ((y - yc) > (x - xc)) Sum[1][1] +=
static_cast<double>(bit.
GetPixel(i));
246 if (x > xc) Sum[2][0] +=
static_cast<double>(bit.
GetPixel(i));
247 else if (x < xc) Sum[2][1] +=
static_cast<double>(bit.
GetPixel(i));
250 if ((y - yc) > -(x - xc)) Sum[3][0] +=
static_cast<double>(bit.
GetPixel(i));
251 else if ((y - yc) < -(x - xc)) Sum[3][1] +=
static_cast<double>(bit.
GetPixel(i));
256 for (
int dir = 0; dir < NB_DIR; ++dir)
259 M1 = Sum[dir][0] /
static_cast<double>(m_Radius[0] * (2 * m_Radius[0] + 1));
260 M2 = Sum[dir][1] /
static_cast<double>(m_Radius[0] * (2 * m_Radius[0] + 1));
263 if ((M1 != 0) && (M2 != 0)) R_theta[dir] =
static_cast<double>(1 - std::min((M1 / M2), (M2 / M1)));
264 else R_theta[dir] = 0.;
267 R_contour =
static_cast<double>(std::max(R_contour, R_theta[dir]));
270 if (M2 > M1) sign = +1;
273 Dir_contour += sign * Theta[dir] * R_theta[dir];
274 Sum_R_theta += R_theta[dir];
279 it.
Set(static_cast<OutputPixelType>(R_contour));
282 if (Sum_R_theta != 0.) Dir_contour = Dir_contour / Sum_R_theta;
285 it_dir.
Set(static_cast<OutputPixelDirectionType>(Dir_contour));
290 progress.CompletedPixel();
300 template <
class TInputImage,
class TOutputImage,
class TOutputImageDirection>
305 Superclass::PrintSelf(os, indent);
306 os << indent <<
"Radius: " << m_Radius << std::endl;