1 // This is brl/bseg/bvxm/bvxm_mog_grey_processor.h
2 #ifndef bvxm_mog_grey_processor_h_
3 #define bvxm_mog_grey_processor_h_
4 //:
5 // \file
6 // \brief A class for a grey-scale-mixture-of-gaussian processor
7 //
8 // \author Isabel Restrepo
9 // \date Jan. 14, 2008
10 // \verbatim
11 //  Modifications
12 //   02/11/2008  DEC  Changed prob() to prob_density(), added prob_range
13 //   04/17/2008  Ozge C. Ozcanli added most_probable_mode_color() method
14 //   12/10/2008  Ozge C. Ozcanli added sample() method
15 //   Added the get_light_bin() virtual function which is useful in multiple mixture of gaussian case
16 //   to return the appropriate bin number from the lighting direction
17 // \endverbatim
18 
19 #include "grid/bvxm_voxel_slab.h"
20 
21 #include <bsta/algo/bsta_adaptive_updater.h>
22 #include <bsta/bsta_distribution.h>
23 #include <bsta/bsta_gauss_sf1.h>
24 #include <bsta/bsta_attributes.h>
25 #include <bsta/bsta_mixture_fixed.h>
26 #include <bsta/bsta_gaussian_indep.h>
27 
28 
29 // The mix_gauss_type contains the same data as mix_gauss plus an
30 // extra attribute that indicate the number of observations
31 
32 class  bvxm_mog_grey_processor
33 {
34  protected:
35   static const unsigned n_gaussian_modes_ = 3;
36 
37   typedef bsta_num_obs<bsta_gauss_sf1> gauss_type;
38   typedef bsta_mixture_fixed<gauss_type, n_gaussian_modes_> mix_gauss;
39   typedef bsta_num_obs<mix_gauss> mix_gauss_type;
40  public:
41 
42   typedef mix_gauss_type apm_datatype;
43   typedef float obs_datatype;
44   typedef float obs_mathtype;
45 
46   bvxm_mog_grey_processor() = default;
47   virtual ~bvxm_mog_grey_processor() = default;
48 
49   bvxm_voxel_slab<float>  prob_density(bvxm_voxel_slab<mix_gauss_type> const& appear,
50                                        bvxm_voxel_slab<float> const& obs);
51 
52   bool  region_prob_density(bvxm_voxel_slab<float> &probabilities,
53                             bvxm_voxel_slab<mix_gauss_type> const& appear,
54                             bvxm_voxel_slab<float> const& obs,
55                             bvxm_voxel_slab<float> const& mask);
56 
57   bvxm_voxel_slab<float> prob_range(bvxm_voxel_slab<mix_gauss_type> const& appear,
58                                     bvxm_voxel_slab<float> const& obs_min,
59                                     bvxm_voxel_slab<float> const& obs_max);
60 
61   bool update( bvxm_voxel_slab<mix_gauss_type> &appear,
62                bvxm_voxel_slab<float> const& obs,
63                bvxm_voxel_slab<float> const& weight);
64 
65   bvxm_voxel_slab<float> expected_color( bvxm_voxel_slab<mix_gauss_type> const& appear);
66   bvxm_voxel_slab<float> most_probable_mode_color(bvxm_voxel_slab<mix_gauss_type > const& appear);
67 
68   bvxm_voxel_slab<float> sample(bvxm_voxel_slab<mix_gauss_type > const& appear);
69 
70 
71   // bin number is always 0 for the simple mixture of gaussian case
get_light_bin(unsigned int,const vnl_vector<float> &)72   virtual unsigned int get_light_bin(unsigned int /*num_light_bins*/, const vnl_vector<float>& /*light*/) { return 0; }
73 };
74 
75 #endif // bvxm_mog_grey_processor_h_
76