1 #ifndef vil_threshold_hxx_
2 #define vil_threshold_hxx_
3 //:
4 // \file
5 // \brief Apply thresholds to image data
6 // \author Tim Cootes
7 
8 #include "vil_threshold.h"
9 
10 //: Apply threshold such that dest(i,j,p)=true if src(i,j,p)>=t
11 template<class srcT>
vil_threshold_above(const vil_image_view<srcT> & src,vil_image_view<bool> & dest,srcT t)12 void vil_threshold_above(const vil_image_view<srcT>& src,
13                          vil_image_view<bool>& dest,  srcT t)
14 {
15   unsigned ni = src.ni(),nj = src.nj(),np = src.nplanes();
16   dest.set_size(ni,nj,np);
17 
18   std::ptrdiff_t istepA=src.istep(),jstepA=src.jstep(),pstepA = src.planestep();
19   std::ptrdiff_t istepB=dest.istep(),jstepB=dest.jstep(),pstepB = dest.planestep();
20   const srcT* planeA = src.top_left_ptr();
21   bool* planeB = dest.top_left_ptr();
22   for (unsigned p=0;p<np;++p,planeA += pstepA,planeB += pstepB)
23   {
24     const srcT* rowA   = planeA;
25     bool* rowB   = planeB;
26     for (unsigned j=0;j<nj;++j,rowA += jstepA,rowB += jstepB)
27     {
28       const srcT* pixelA = rowA;
29       bool* pixelB = rowB;
30       for (unsigned i=0;i<ni;++i,pixelA+=istepA,pixelB+=istepB)
31         *pixelB = *pixelA>=t;
32     }
33   }
34 }
35 
36 //: Apply threshold such that dest(i,j,p)=true if src(i,j,p)<=t
37 template<class srcT>
vil_threshold_below(const vil_image_view<srcT> & src,vil_image_view<bool> & dest,srcT t)38 void vil_threshold_below(const vil_image_view<srcT>& src,
39                          vil_image_view<bool>& dest,  srcT t)
40 {
41   unsigned ni = src.ni(),nj = src.nj(),np = src.nplanes();
42   dest.set_size(ni,nj,np);
43 
44   std::ptrdiff_t istepA=src.istep(),jstepA=src.jstep(),pstepA = src.planestep();
45   std::ptrdiff_t istepB=dest.istep(),jstepB=dest.jstep(),pstepB = dest.planestep();
46   const srcT* planeA = src.top_left_ptr();
47   bool* planeB = dest.top_left_ptr();
48   for (unsigned p=0;p<np;++p,planeA += pstepA,planeB += pstepB)
49   {
50     const srcT* rowA   = planeA;
51     bool* rowB   = planeB;
52     for (unsigned j=0;j<nj;++j,rowA += jstepA,rowB += jstepB)
53     {
54       const srcT* pixelA = rowA;
55       bool* pixelB = rowB;
56       for (unsigned i=0;i<ni;++i,pixelA+=istepA,pixelB+=istepB)
57         *pixelB = *pixelA<=t;
58     }
59   }
60 }
61 
62 //: Apply threshold such that dest(i,j,p)=true if t0<=src(i,j,p)<=t1
63 template<class srcT>
vil_threshold_inside(const vil_image_view<srcT> & src,vil_image_view<bool> & dest,srcT t0,srcT t1)64 void vil_threshold_inside(const vil_image_view<srcT>& src,
65                           vil_image_view<bool>& dest,  srcT t0, srcT t1)
66 {
67   unsigned ni = src.ni(),nj = src.nj(),np = src.nplanes();
68   dest.set_size(ni,nj,np);
69 
70   std::ptrdiff_t istepA=src.istep(),jstepA=src.jstep(),pstepA = src.planestep();
71   std::ptrdiff_t istepB=dest.istep(),jstepB=dest.jstep(),pstepB = dest.planestep();
72   const srcT* planeA = src.top_left_ptr();
73   bool* planeB = dest.top_left_ptr();
74   for (unsigned p=0;p<np;++p,planeA += pstepA,planeB += pstepB)
75   {
76     const srcT* rowA   = planeA;
77     bool* rowB   = planeB;
78     for (unsigned j=0;j<nj;++j,rowA += jstepA,rowB += jstepB)
79     {
80       const srcT* pixelA = rowA;
81       bool* pixelB = rowB;
82       for (unsigned i=0;i<ni;++i,pixelA+=istepA,pixelB+=istepB)
83         *pixelB = (t0<=*pixelA) && (*pixelA<=t1);
84     }
85   }
86 }
87 
88 //: Apply threshold such that dest(i,j,p)=true if src(i,j,p)<=t0 or src(i,j,p)>=t1
89 template<class srcT>
vil_threshold_outside(const vil_image_view<srcT> & src,vil_image_view<bool> & dest,srcT t0,srcT t1)90 void vil_threshold_outside(const vil_image_view<srcT>& src,
91                            vil_image_view<bool>& dest,  srcT t0, srcT t1)
92 {
93   unsigned ni = src.ni(),nj = src.nj(),np = src.nplanes();
94   dest.set_size(ni,nj,np);
95 
96   std::ptrdiff_t istepA=src.istep(),jstepA=src.jstep(),pstepA = src.planestep();
97   std::ptrdiff_t istepB=dest.istep(),jstepB=dest.jstep(),pstepB = dest.planestep();
98   const srcT* planeA = src.top_left_ptr();
99   bool* planeB = dest.top_left_ptr();
100   for (unsigned p=0;p<np;++p,planeA += pstepA,planeB += pstepB)
101   {
102     const srcT* rowA   = planeA;
103     bool* rowB   = planeB;
104     for (unsigned j=0;j<nj;++j,rowA += jstepA,rowB += jstepB)
105     {
106       const srcT* pixelA = rowA;
107       bool* pixelB = rowB;
108       for (unsigned i=0;i<ni;++i,pixelA+=istepA,pixelB+=istepB)
109         *pixelB = (*pixelA<=t0) || (*pixelA>=t1);
110     }
111   }
112 }
113 
114 #undef VIL_THRESHOLD_INSTANTIATE
115 #define VIL_THRESHOLD_INSTANTIATE(srcT) \
116 template void vil_threshold_above(const vil_image_view<srcT >& src, \
117                                   vil_image_view<bool >& dest,  srcT t); \
118 template void vil_threshold_below(const vil_image_view<srcT >& src, \
119                                   vil_image_view<bool >& dest,  srcT t); \
120 template void vil_threshold_inside(const vil_image_view<srcT >& src, \
121                                    vil_image_view<bool >& dest,  srcT t0, srcT t1); \
122 template void vil_threshold_outside(const vil_image_view<srcT >& src, \
123                                     vil_image_view<bool >& dest,  srcT t0, srcT t1)
124 
125 #endif // vil_threshold_hxx_
126