37 #ifndef VIGRA_INSPECTIMAGE_HXX
38 #define VIGRA_INSPECTIMAGE_HXX
42 #include "utilities.hxx"
43 #include "numerictraits.hxx"
44 #include "iteratortraits.hxx"
45 #include "functortraits.hxx"
46 #include "rgbvalue.hxx"
62 template <
class SrcIterator,
class SrcAccessor,
class Functor>
64 inspectLine(SrcIterator s,
65 SrcIterator send, SrcAccessor src,
72 template <
class SrcIterator,
class SrcAccessor,
73 class MaskIterator,
class MaskAccessor,
76 inspectLineIf(SrcIterator s,
77 SrcIterator send, SrcAccessor src,
78 MaskIterator m, MaskAccessor mask,
81 for(; s != send; ++s, ++m)
86 template <
class SrcIterator1,
class SrcAccessor1,
87 class SrcIterator2,
class SrcAccessor2,
90 inspectTwoLines(SrcIterator1 s1,
91 SrcIterator1 s1end, SrcAccessor1 src1,
92 SrcIterator2 s2, SrcAccessor2 src2,
95 for(; s1 != s1end; ++s1, ++s2)
96 f(src1(s1), src2(s2));
99 template <
class SrcIterator1,
class SrcAccessor1,
100 class SrcIterator2,
class SrcAccessor2,
101 class MaskIterator,
class MaskAccessor,
104 inspectTwoLinesIf(SrcIterator1 s1,
105 SrcIterator1 s1end, SrcAccessor1 src1,
106 SrcIterator2 s2, SrcAccessor2 src2,
107 MaskIterator m, MaskAccessor mask,
110 for(; s1 != s1end; ++s1, ++s2, ++m)
112 f(src1(s1), src2(s2));
182 template <
class ImageIterator,
class Accessor,
class Functor>
184 inspectImage(ImageIterator upperleft, ImageIterator lowerright,
185 Accessor a, Functor & f)
187 int w = lowerright.x - upperleft.x;
189 for(; upperleft.y<lowerright.y; ++upperleft.y)
191 inspectLine(upperleft.rowIterator(),
192 upperleft.rowIterator() + w, a, f);
196 template <
class ImageIterator,
class Accessor,
class Functor>
199 inspectImage(triple<ImageIterator, ImageIterator, Accessor> img,
207 template <
class T>
class UnaryAnalyser;
210 template <
class ImageIterator,
class Accessor,
class Functor>
213 inspectImage(ImageIterator upperleft, ImageIterator lowerright,
214 Accessor a, functor::UnaryAnalyser<Functor>
const & f)
217 const_cast<functor::UnaryAnalyser<Functor> &
>(f));
220 template <
class ImageIterator,
class Accessor,
class Functor>
223 inspectImage(triple<ImageIterator, ImageIterator, Accessor> img,
224 functor::UnaryAnalyser<Functor>
const & f)
227 const_cast<functor::UnaryAnalyser<Functor> &>(f));
310 template <
class ImageIterator,
class Accessor,
311 class MaskImageIterator,
class MaskAccessor,
class Functor>
314 ImageIterator lowerright, Accessor a,
315 MaskImageIterator mask_upperleft, MaskAccessor ma,
318 int w = lowerright.x - upperleft.x;
320 for(; upperleft.y<lowerright.y; ++upperleft.y, ++mask_upperleft.y)
322 inspectLineIf(upperleft.rowIterator(),
323 upperleft.rowIterator() + w, a,
324 mask_upperleft.rowIterator(), ma, f);
328 template <
class ImageIterator,
class Accessor,
329 class MaskImageIterator,
class MaskAccessor,
class Functor>
332 inspectImageIf(triple<ImageIterator, ImageIterator, Accessor> img,
333 pair<MaskImageIterator, MaskAccessor> mask,
337 mask.first, mask.second, f);
340 template <
class ImageIterator,
class Accessor,
341 class MaskImageIterator,
class MaskAccessor,
class Functor>
344 ImageIterator lowerright, Accessor a,
345 MaskImageIterator mask_upperleft, MaskAccessor ma,
346 functor::UnaryAnalyser<Functor>
const & f)
349 mask_upperleft, ma,
const_cast<functor::UnaryAnalyser<Functor> &
>(f));
352 template <
class ImageIterator,
class Accessor,
353 class MaskImageIterator,
class MaskAccessor,
class Functor>
355 inspectImageIf(triple<ImageIterator, ImageIterator, Accessor> img,
356 pair<MaskImageIterator, MaskAccessor> mask,
357 functor::UnaryAnalyser<Functor>
const & f)
360 mask.first, mask.second, const_cast<functor::UnaryAnalyser<Functor> &>(f));
441 template <
class ImageIterator1,
class Accessor1,
442 class ImageIterator2,
class Accessor2,
445 inspectTwoImages(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1,
446 ImageIterator2 upperleft2, Accessor2 a2,
449 int w = lowerright1.x - upperleft1.x;
451 for(; upperleft1.y<lowerright1.y; ++upperleft1.y, ++upperleft2.y)
453 inspectTwoLines(upperleft1.rowIterator(),
454 upperleft1.rowIterator() + w, a1,
455 upperleft2.rowIterator(), a2, f);
459 template <
class ImageIterator1,
class Accessor1,
460 class ImageIterator2,
class Accessor2,
465 pair<ImageIterator2, Accessor2> img2,
469 img2.first, img2.second, f);
472 template <
class ImageIterator1,
class Accessor1,
473 class ImageIterator2,
class Accessor2,
476 inspectTwoImages(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1,
477 ImageIterator2 upperleft2, Accessor2 a2,
478 functor::UnaryAnalyser<Functor>
const & f)
481 upperleft2, a2,
const_cast<functor::UnaryAnalyser<Functor> &
>(f));
484 template <
class ImageIterator1,
class Accessor1,
485 class ImageIterator2,
class Accessor2,
490 pair<ImageIterator2, Accessor2> img2,
491 functor::UnaryAnalyser<Functor>
const & f)
494 img2.first, img2.second, const_cast<functor::UnaryAnalyser<Functor> &>(f));
584 template <
class ImageIterator1,
class Accessor1,
585 class ImageIterator2,
class Accessor2,
586 class MaskImageIterator,
class MaskAccessor,
589 inspectTwoImagesIf(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1,
590 ImageIterator2 upperleft2, Accessor2 a2,
591 MaskImageIterator mupperleft, MaskAccessor mask,
594 int w = lowerright1.x - upperleft1.x;
596 for(; upperleft1.y<lowerright1.y; ++upperleft1.y, ++upperleft2.y, ++mupperleft.y)
598 inspectTwoLinesIf(upperleft1.rowIterator(),
599 upperleft1.rowIterator() + w, a1,
600 upperleft2.rowIterator(), a2,
601 mupperleft.rowIterator(), mask, f);
605 template <
class ImageIterator1,
class Accessor1,
606 class ImageIterator2,
class Accessor2,
607 class MaskImageIterator,
class MaskAccessor,
612 pair<ImageIterator2, Accessor2> img2,
613 pair<MaskImageIterator, MaskAccessor> m,
617 img2.first, img2.second,
622 template <
class ImageIterator1,
class Accessor1,
623 class ImageIterator2,
class Accessor2,
624 class MaskImageIterator,
class MaskAccessor,
627 inspectTwoImagesIf(ImageIterator1 upperleft1, ImageIterator1 lowerright1, Accessor1 a1,
628 ImageIterator2 upperleft2, Accessor2 a2,
629 MaskImageIterator mupperleft, MaskAccessor mask,
630 functor::UnaryAnalyser<Functor>
const & f)
635 const_cast<functor::UnaryAnalyser<Functor> &
>(f));
638 template <
class ImageIterator1,
class Accessor1,
639 class ImageIterator2,
class Accessor2,
640 class MaskImageIterator,
class MaskAccessor,
645 pair<ImageIterator2, Accessor2> img2,
646 pair<MaskImageIterator, MaskAccessor> m,
647 functor::UnaryAnalyser<Functor>
const & f)
650 img2.first, img2.second,
652 const_cast<functor::UnaryAnalyser<Functor> &>(f));
705 template <
class VALUETYPE>
797 template <
class VALUETYPE>
799 :
public FunctorTraitsBase<FindMinMax<VALUETYPE> >
802 typedef VigraTrueType isUnaryAnalyser;
847 template <
class VALUETYPE>
849 :
public UnaryReduceFunctorTag
871 sum_ = NumericTraits<result_type>::zero();
952 template <
class VALUETYPE>
971 typedef typename NumericTraits<VALUETYPE>::RealPromote
result_type;
975 typedef typename NumericTraits<VALUETYPE>::RealPromote
value_type;
980 : sum_(NumericTraits<
result_type>::zero()), count_(0)
988 sum_ = NumericTraits<result_type>::zero();
1029 return sum_ / (double)count_;
1036 return sum_ / (double)count_;
1043 template <
class VALUETYPE>
1044 class FunctorTraits<FindAverage<VALUETYPE> >
1045 :
public FunctorTraitsBase<FindAverage<VALUETYPE> >
1048 typedef VigraTrueType isInitializer;
1049 typedef VigraTrueType isUnaryAnalyser;
1105 template <
class VALUETYPE>
1128 typedef typename NumericTraits<VALUETYPE>::RealPromote
value_type;
1134 sumOfSquaredDifferences_(NumericTraits<
result_type>::zero()),
1143 mean_ = NumericTraits<result_type>::zero();
1144 sumOfSquaredDifferences_ = NumericTraits<result_type>::zero();
1155 sumOfSquaredDifferences_ += (count_-1.0)*t1*t2;
1173 sumOfSquaredDifferences_ +=
1174 (t1 * t1 * weight / count_) * (count_ - weight );
1181 double newCount = count_ + v.count_;
1182 sumOfSquaredDifferences_ += v.sumOfSquaredDifferences_ +
1183 count_ / newCount * v.count_ * (mean_ - v.mean_) * (mean_ - v.mean_);
1184 mean_ = (count_ * mean_ + v.count_ * v.mean_) / newCount;
1192 return (
unsigned int)count_;
1209 ? sumOfSquaredDifferences_ / (count_ - 1.0)
1210 : sumOfSquaredDifferences_ / count_;
1224 template <
class VALUETYPE>
1225 class FunctorTraits<FindAverageAndVariance<VALUETYPE> >
1226 :
public FunctorTraitsBase<FindAverageAndVariance<VALUETYPE> >
1229 typedef VigraTrueType isInitializer;
1230 typedef VigraTrueType isUnaryAnalyser;
1267 template <
class VALUETYPE>
1331 template <
class VALUETYPE>
1333 :
public FunctorTraitsBase<FindROISize<VALUETYPE> >
1336 typedef VigraTrueType isInitializer;
1337 typedef VigraTrueType isUnaryAnalyser;
1454 else if(otherRegion.
valid)
1481 class FunctorTraits<FindBoundingRectangle>
1482 :
public FunctorTraitsBase<FindBoundingRectangle>
1485 typedef VigraTrueType isInitializer;
1486 typedef VigraTrueType isUnaryAnalyser;
1525 template <
class VALUETYPE>
1570 template <
class VALUETYPE>
1572 :
public FunctorTraitsBase<LastValueFunctor<VALUETYPE> >
1575 typedef VigraTrueType isInitializer;
1576 typedef VigraTrueType isUnaryAnalyser;
1629 template <
class FUNCTOR,
class VALUETYPE>
1633 VALUETYPE start_, accumulator_;
1667 accumulator_(initial)
1673 { accumulator_ = start_; }
1682 accumulator_ = f_(accumulator_, v);
1689 template <
class T1,
class T2>
1692 accumulator_ = f_(accumulator_, v1, v2);
1698 {
return accumulator_; }
1701 template <
class FUNCTOR,
class VALUETYPE>
1702 ReduceFunctor<FUNCTOR, VALUETYPE>
1703 reduceFunctor(FUNCTOR
const & f, VALUETYPE
const & initial)
1705 return ReduceFunctor<FUNCTOR, VALUETYPE>(f, initial);
1708 template <
class FUNCTOR,
class VALUETYPE>
1709 class FunctorTraits<ReduceFunctor<FUNCTOR, VALUETYPE> >
1710 :
public FunctorTraitsBase<ReduceFunctor<FUNCTOR, VALUETYPE> >
1713 typedef VigraTrueType isInitializer;
1714 typedef VigraTrueType isUnaryAnalyser;
1715 typedef VigraTrueType isBinaryAnalyser;
1781 template <
class RegionStatistics,
class LabelType =
int>
1784 typedef std::vector<RegionStatistics> RegionArray;
1837 : regions(max_region_label+1)
1845 RegionArray newRegions(max_region_label+1);
1846 regions.swap(newRegions);
1853 RegionArray newRegions(regions.size());
1854 regions.swap(newRegions);
1861 regions[
static_cast<unsigned int>(label)](v);
1867 regions[
static_cast<unsigned int>(label1)](regions[static_cast<unsigned int>(label2)]);
1873 {
return size() - 1; }
1878 {
return regions.size(); }
1884 {
return regions[
static_cast<unsigned int>(label)](); }
1889 {
return regions[
static_cast<unsigned int>(label)]; }
1894 {
return regions[
static_cast<unsigned int>(label)]; }
1899 {
return regions.begin(); }
1904 {
return regions.begin(); }
1909 {
return regions.end(); }
1914 {
return regions.end(); }
1917 std::vector<RegionStatistics> regions;
1920 template <
class RegionStatistics,
class LabelType>
1921 class FunctorTraits<ArrayOfRegionStatistics<RegionStatistics, LabelType> >
1922 :
public FunctorTraitsBase<ArrayOfRegionStatistics<RegionStatistics, LabelType> >
1925 typedef VigraTrueType isUnaryFunctor;
1926 typedef VigraTrueType isBinaryAnalyser;
1933 #endif // VIGRA_INSPECTIMAGE_HXX