18 #ifndef __otbVectorizationPathListFilter_txx
19 #define __otbVectorizationPathListFilter_txx
30 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
34 this->SetNumberOfRequiredInputs(2);
35 this->SetNumberOfInputs(2);
36 m_AmplitudeThreshold = 1.0;
39 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
47 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
53 if (this->GetNumberOfInputs() < 1)
60 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
68 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
70 ::InputDirectionType *
74 if (this->GetNumberOfInputs() < 2)
84 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
93 typedef typename OffsetVectorType::iterator OffsetIteratorType;
101 flagImage->SetRegions(modPtr->GetLargestPossibleRegion());
102 flagImage->Allocate();
103 flagImage->FillBuffer(
false);
110 for (modIt.GoToBegin(), dirIt.GoToBegin(), flagIt.GoToBegin();
111 (!modIt.IsAtEnd()) && (!dirIt.IsAtEnd()) && (!flagIt.IsAtEnd());
112 ++modIt, ++dirIt, ++flagIt)
114 if ((modIt.Get() > m_AmplitudeThreshold) && (!flagIt.Get()))
123 double totalAmplitude = 0;
129 for (flagReverse = 0; flagReverse < 2; ++flagReverse)
132 nDirIt.SetLocation(dirIt.GetIndex());
133 nFlagIt.SetLocation(flagIt.GetIndex());
137 modPtr->TransformIndexToPhysicalPoint(nModIt.GetIndex(), point);
138 modPtr->TransformPhysicalPointToContinuousIndex(point, vertex);
139 if (flagReverse == 0)
145 pathTempDirect->AddVertex(vertex);
150 offsetVector = GetThreeNeighborOffsetFromDirection(nDirIt.GetCenterPixel(), flagReverse);
151 OffsetIteratorType vecIt = offsetVector.begin();
152 bool flagFound =
false;
153 while (vecIt != offsetVector.end() && !flagFound)
155 flagFound = nModIt.GetPixel(*vecIt) > 0
156 && !nFlagIt.GetPixel(*vecIt);
164 for (vecIt = offsetVector.begin(); vecIt != offsetVector.end(); ++vecIt)
166 double currentAmplitude = nModIt.GetPixel(*vecIt);
167 modPtr->TransformIndexToPhysicalPoint(nModIt.GetIndex(*vecIt), tmpPoint);
168 point[0] += currentAmplitude * tmpPoint[0];
169 point[1] += currentAmplitude * tmpPoint[1];
170 totalAmplitude += currentAmplitude;
172 point[0] = point[0] / totalAmplitude;
173 point[1] = point[1] / totalAmplitude;
174 modPtr->TransformPhysicalPointToContinuousIndex(point, vertex);
175 if (flagReverse == 0)
179 pathTempDirect->AddVertex(vertex);
186 pathTempReverse->AddVertex(vertex);
189 nFlagIt.SetCenterPixel(
true);
192 if (modPtr->TransformPhysicalPointToIndex(point, newIndex))
195 nModIt.SetLocation(newIndex);
196 nDirIt.SetLocation(newIndex);
197 nFlagIt.SetLocation(newIndex);
199 if (nModIt.GetCenterPixel() == 0)
204 if (nFlagIt.GetCenterPixel())
225 unsigned int numberVertex = 0;
228 if (vertexReverseIt != vertexReverse->Begin())
231 while (vertexReverseIt != vertexReverse->Begin())
233 path->AddVertex(vertexReverseIt.Value());
237 path->AddVertex(vertexReverseIt.Value());
241 while (vertexDirectIt != vertexDirect->End())
243 path->AddVertex(vertexDirectIt.Value());
250 if (numberVertex > 3)
252 outPtr->PushBack(path);
264 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
270 int neighborhoodNumber = 0;
276 neighborhoodNumber = (int) (direction / (
CONST_PI_4) -1);
281 neighborhoodNumber = (neighborhoodNumber + 4);
287 neighborhoodNumber = (neighborhoodNumber + 4) % 8;
290 switch (neighborhoodNumber)
295 offset.push_back(tmpOffset);
298 offset.push_back(tmpOffset);
301 offset.push_back(tmpOffset);
305 offset.push_back(tmpOffset);
308 offset.push_back(tmpOffset);
311 offset.push_back(tmpOffset);
314 offset.push_back(tmpOffset);
317 offset.push_back(tmpOffset);
324 offset.push_back(tmpOffset);
327 offset.push_back(tmpOffset);
330 offset.push_back(tmpOffset);
334 offset.push_back(tmpOffset);
337 offset.push_back(tmpOffset);
340 offset.push_back(tmpOffset);
343 offset.push_back(tmpOffset);
346 offset.push_back(tmpOffset);
352 offset.push_back(tmpOffset);
355 offset.push_back(tmpOffset);
358 offset.push_back(tmpOffset);
362 offset.push_back(tmpOffset);
365 offset.push_back(tmpOffset);
368 offset.push_back(tmpOffset);
371 offset.push_back(tmpOffset);
374 offset.push_back(tmpOffset);
380 offset.push_back(tmpOffset);
383 offset.push_back(tmpOffset);
386 offset.push_back(tmpOffset);
390 offset.push_back(tmpOffset);
393 offset.push_back(tmpOffset);
396 offset.push_back(tmpOffset);
399 offset.push_back(tmpOffset);
402 offset.push_back(tmpOffset);
408 offset.push_back(tmpOffset);
411 offset.push_back(tmpOffset);
414 offset.push_back(tmpOffset);
418 offset.push_back(tmpOffset);
421 offset.push_back(tmpOffset);
424 offset.push_back(tmpOffset);
427 offset.push_back(tmpOffset);
430 offset.push_back(tmpOffset);
436 offset.push_back(tmpOffset);
439 offset.push_back(tmpOffset);
442 offset.push_back(tmpOffset);
446 offset.push_back(tmpOffset);
449 offset.push_back(tmpOffset);
452 offset.push_back(tmpOffset);
455 offset.push_back(tmpOffset);
458 offset.push_back(tmpOffset);
464 offset.push_back(tmpOffset);
467 offset.push_back(tmpOffset);
470 offset.push_back(tmpOffset);
474 offset.push_back(tmpOffset);
477 offset.push_back(tmpOffset);
480 offset.push_back(tmpOffset);
483 offset.push_back(tmpOffset);
486 offset.push_back(tmpOffset);
492 offset.push_back(tmpOffset);
495 offset.push_back(tmpOffset);
498 offset.push_back(tmpOffset);
502 offset.push_back(tmpOffset);
505 offset.push_back(tmpOffset);
508 offset.push_back(tmpOffset);
511 offset.push_back(tmpOffset);
514 offset.push_back(tmpOffset);
526 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
532 int neighborhoodNumber = 0;
538 neighborhoodNumber = (int) (direction / (
CONST_PI_4) -1);
543 neighborhoodNumber = (neighborhoodNumber + 4);
549 neighborhoodNumber = (neighborhoodNumber + 4) % 8;
553 switch (neighborhoodNumber)
558 offset.push_back(tmpOffset);
561 offset.push_back(tmpOffset);
564 offset.push_back(tmpOffset);
571 offset.push_back(tmpOffset);
574 offset.push_back(tmpOffset);
577 offset.push_back(tmpOffset);
584 offset.push_back(tmpOffset);
587 offset.push_back(tmpOffset);
590 offset.push_back(tmpOffset);
597 offset.push_back(tmpOffset);
600 offset.push_back(tmpOffset);
603 offset.push_back(tmpOffset);
610 offset.push_back(tmpOffset);
613 offset.push_back(tmpOffset);
616 offset.push_back(tmpOffset);
623 offset.push_back(tmpOffset);
626 offset.push_back(tmpOffset);
629 offset.push_back(tmpOffset);
636 offset.push_back(tmpOffset);
639 offset.push_back(tmpOffset);
642 offset.push_back(tmpOffset);
649 offset.push_back(tmpOffset);
652 offset.push_back(tmpOffset);
655 offset.push_back(tmpOffset);
665 template <
class TInputModulus,
class TInputDirection,
class TOutputPath>
670 Superclass::PrintSelf(os, indent);