37 #ifndef VIGRA_LOCALMINMAX_HXX
38 #define VIGRA_LOCALMINMAX_HXX
42 #include "utilities.hxx"
43 #include "stdimage.hxx"
44 #include "initimage.hxx"
45 #include "labelimage.hxx"
46 #include "pixelneighborhood.hxx"
59 template <
class SrcIterator,
class SrcAccessor,
60 class DestIterator,
class DestAccessor,
61 class DestValue,
class Neighborhood,
64 localMinMax(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
65 DestIterator dul, DestAccessor da,
66 DestValue marker, Neighborhood,
69 int w = slr.x - sul.x - 2;
70 int h = slr.y - sul.y - 2;
77 for(y=0; y<h; ++y, ++sul.y, ++dul.y)
80 DestIterator dx = dul;
82 for(x=0; x<w; ++x, ++sx.x, ++dx.x)
84 typename SrcAccessor::value_type v = sa(sx);
85 NeighborhoodCirculator<SrcIterator, Neighborhood> sc(sx);
86 for(i = 0; i < Neighborhood::DirectionCount; ++i, ++sc)
88 if(!compare(v, sa(sc)))
92 if(i == Neighborhood::DirectionCount)
185 template <
class SrcIterator,
class SrcAccessor,
186 class DestIterator,
class DestAccessor,
187 class DestValue,
class Neighborhood>
189 localMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
190 DestIterator dul, DestAccessor da,
191 DestValue marker, Neighborhood neighborhood)
193 detail::localMinMax(sul, slr, sa, dul, da, marker, neighborhood,
194 std::less<typename SrcAccessor::value_type>());
197 template <
class SrcIterator,
class SrcAccessor,
198 class DestIterator,
class DestAccessor,
class DestValue>
200 localMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
201 DestIterator dul, DestAccessor da,
207 template <
class SrcIterator,
class SrcAccessor,
208 class DestIterator,
class DestAccessor>
210 localMinima(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
211 DestIterator dul, DestAccessor da)
214 NumericTraits<typename DestAccessor::value_type>::one(),
218 template <
class SrcIterator,
class SrcAccessor,
219 class DestIterator,
class DestAccessor,
220 class DestValue,
class Neighborhood>
222 localMinima(triple<SrcIterator, SrcIterator, SrcAccessor> src,
223 pair<DestIterator, DestAccessor> dest,
224 DestValue marker, Neighborhood neighborhood)
227 dest.first, dest.second, marker, neighborhood);
230 template <
class SrcIterator,
class SrcAccessor,
231 class DestIterator,
class DestAccessor,
class DestValue>
233 localMinima(triple<SrcIterator, SrcIterator, SrcAccessor> src,
234 pair<DestIterator, DestAccessor> dest,
241 template <
class SrcIterator,
class SrcAccessor,
242 class DestIterator,
class DestAccessor>
244 localMinima(triple<SrcIterator, SrcIterator, SrcAccessor> src,
245 pair<DestIterator, DestAccessor> dest)
248 dest.first, dest.second,
249 NumericTraits<typename DestAccessor::value_type>::one(),
335 template <
class SrcIterator,
class SrcAccessor,
336 class DestIterator,
class DestAccessor,
337 class DestValue,
class Neighborhood>
339 localMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
340 DestIterator dul, DestAccessor da,
341 DestValue marker, Neighborhood neighborhood)
343 detail::localMinMax(sul, slr, sa, dul, da, marker, neighborhood,
344 std::greater<typename SrcAccessor::value_type>());
347 template <
class SrcIterator,
class SrcAccessor,
348 class DestIterator,
class DestAccessor,
class DestValue>
350 localMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
351 DestIterator dul, DestAccessor da,
357 template <
class SrcIterator,
class SrcAccessor,
358 class DestIterator,
class DestAccessor>
360 localMaxima(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
361 DestIterator dul, DestAccessor da)
364 NumericTraits<typename DestAccessor::value_type>::one(),
368 template <
class SrcIterator,
class SrcAccessor,
369 class DestIterator,
class DestAccessor,
370 class DestValue,
class Neighborhood>
372 localMaxima(triple<SrcIterator, SrcIterator, SrcAccessor> src,
373 pair<DestIterator, DestAccessor> dest,
374 DestValue marker, Neighborhood neighborhood)
377 dest.first, dest.second, marker, neighborhood);
380 template <
class SrcIterator,
class SrcAccessor,
381 class DestIterator,
class DestAccessor,
class DestValue>
383 localMaxima(triple<SrcIterator, SrcIterator, SrcAccessor> src,
384 pair<DestIterator, DestAccessor> dest,
391 template <
class SrcIterator,
class SrcAccessor,
392 class DestIterator,
class DestAccessor>
394 localMaxima(triple<SrcIterator, SrcIterator, SrcAccessor> src,
395 pair<DestIterator, DestAccessor> dest)
398 dest.first, dest.second,
399 NumericTraits<typename DestAccessor::value_type>::one(),
405 template <
class SrcIterator,
class SrcAccessor,
406 class DestIterator,
class DestAccessor,
class DestValue,
407 class Neighborhood,
class Compare,
class Equal>
409 extendedLocalMinMax(SrcIterator sul, SrcIterator slr, SrcAccessor sa,
410 DestIterator dul, DestAccessor da, DestValue marker,
411 Neighborhood , Compare compare, Equal equal)
413 typedef typename SrcAccessor::value_type SrcType;
415 int w = slr.x - sul.x;
416 int h = slr.y - sul.y;
420 BasicImage<int> labels(w,h);
422 int number_of_regions =
423 labelImage(sul, slr, sa, labels.upperLeft(), labels.accessor(),
424 (Neighborhood::DirectionCount == 8), equal);
427 std::vector<unsigned char> isExtremum(number_of_regions+1, (
unsigned char)1);
429 BasicImage<int>::traverser ly = labels.upperLeft();
431 for(y=0; y<h; ++y, ++sul.y, ++ly.y)
433 SrcIterator sx = sul;
434 BasicImage<int>::traverser lx(ly);
436 for(x=0; x<w; ++x, ++sx.x, ++lx.x)
439 if(x == 0 || y == 0 || x == w-1 || y == h-1)
447 NeighborhoodCirculator<SrcIterator, Neighborhood> sc(sx);
448 NeighborhoodCirculator<BasicImage<int>::traverser, Neighborhood> lc(lx);
449 for(i=0; i<Neighborhood::DirectionCount; ++i, ++sc, ++lc)
451 if(lab != *lc && compare(sa(sc),v))
458 ly = labels.upperLeft();
459 for(y=0; y<h; ++y, ++dul.y, ++ly.y)
461 DestIterator xd = dul;
462 BasicImage<int>::Iterator lx(ly);
464 for(x=0; x<w; ++x, ++xd.x, ++lx.x)
596 template <
class SrcIterator,
class SrcAccessor,
597 class DestIterator,
class DestAccessor,
class DestValue,
598 class Neighborhood,
class EqualityFunctor>
601 DestIterator dul, DestAccessor da, DestValue marker,
602 Neighborhood neighborhood, EqualityFunctor equal)
604 typedef typename SrcAccessor::value_type SrcType;
606 detail::extendedLocalMinMax(sul, slr, sa, dul, da,
607 marker, neighborhood,
608 std::less<SrcType>(), equal);
611 template <
class SrcIterator,
class SrcAccessor,
612 class DestIterator,
class DestAccessor,
class DestValue,
616 DestIterator dul, DestAccessor da, DestValue marker,
617 Neighborhood neighborhood)
619 typedef typename SrcAccessor::value_type SrcType;
622 marker, neighborhood, std::equal_to<SrcType>());
625 template <
class SrcIterator,
class SrcAccessor,
626 class DestIterator,
class DestAccessor,
class DestValue>
629 DestIterator dul, DestAccessor da, DestValue marker)
631 typedef typename SrcAccessor::value_type SrcType;
637 template <
class SrcIterator,
class SrcAccessor,
638 class DestIterator,
class DestAccessor>
641 DestIterator dul, DestAccessor da)
644 NumericTraits<typename DestAccessor::value_type>::one());
647 template <
class SrcIterator,
class SrcAccessor,
648 class DestIterator,
class DestAccessor,
class DestValue,
649 class Neighborhood,
class EqualityFunctor>
652 pair<DestIterator, DestAccessor> dest,
653 DestValue marker, Neighborhood neighborhood,
654 EqualityFunctor equal)
657 dest.first, dest.second, marker, neighborhood, equal);
660 template <
class SrcIterator,
class SrcAccessor,
661 class DestIterator,
class DestAccessor,
class DestValue,
665 pair<DestIterator, DestAccessor> dest,
666 DestValue marker, Neighborhood neighborhood)
669 dest.first, dest.second, marker, neighborhood);
672 template <
class SrcIterator,
class SrcAccessor,
673 class DestIterator,
class DestAccessor,
class DestValue>
676 pair<DestIterator, DestAccessor> dest,
680 dest.first, dest.second, marker);
683 template <
class SrcIterator,
class SrcAccessor,
684 class DestIterator,
class DestAccessor>
687 pair<DestIterator, DestAccessor> dest)
690 dest.first, dest.second);
815 template <
class SrcIterator,
class SrcAccessor,
816 class DestIterator,
class DestAccessor,
class DestValue,
817 class Neighborhood,
class EqualityFunctor>
820 DestIterator dul, DestAccessor da, DestValue marker,
821 Neighborhood neighborhood, EqualityFunctor equal)
823 typedef typename SrcAccessor::value_type SrcType;
825 detail::extendedLocalMinMax(sul, slr, sa, dul, da,
826 marker, neighborhood,
827 std::greater<SrcType>(), equal);
830 template <
class SrcIterator,
class SrcAccessor,
831 class DestIterator,
class DestAccessor,
class DestValue,
835 DestIterator dul, DestAccessor da, DestValue marker,
836 Neighborhood neighborhood)
838 typedef typename SrcAccessor::value_type SrcType;
841 marker, neighborhood, std::equal_to<SrcType>());
844 template <
class SrcIterator,
class SrcAccessor,
845 class DestIterator,
class DestAccessor,
class DestValue>
848 DestIterator dul, DestAccessor da, DestValue marker)
850 typedef typename SrcAccessor::value_type SrcType;
856 template <
class SrcIterator,
class SrcAccessor,
857 class DestIterator,
class DestAccessor>
860 DestIterator dul, DestAccessor da)
863 NumericTraits<typename DestAccessor::value_type>::one());
866 template <
class SrcIterator,
class SrcAccessor,
867 class DestIterator,
class DestAccessor,
class DestValue,
868 class Neighborhood,
class EqualityFunctor>
871 pair<DestIterator, DestAccessor> dest,
872 DestValue marker, Neighborhood neighborhood,
873 EqualityFunctor equal)
876 dest.first, dest.second, marker, neighborhood, equal);
879 template <
class SrcIterator,
class SrcAccessor,
880 class DestIterator,
class DestAccessor,
class DestValue,
884 pair<DestIterator, DestAccessor> dest,
885 DestValue marker, Neighborhood neighborhood)
888 dest.first, dest.second, marker, neighborhood);
891 template <
class SrcIterator,
class SrcAccessor,
892 class DestIterator,
class DestAccessor,
class DestValue>
895 pair<DestIterator, DestAccessor> dest,
899 dest.first, dest.second, marker);
902 template <
class SrcIterator,
class SrcAccessor,
903 class DestIterator,
class DestAccessor>
906 pair<DestIterator, DestAccessor> dest)
909 dest.first, dest.second);
916 #endif // VIGRA_LOCALMINMAX_HXX