1 // This is brl/bpro/core/brip_pro/processes/brip_image_mutual_info_process.cxx
2 #include <bprb/bprb_func_process.h>
3 //:
4 // \file
5 // \brief  process to compute mutual information between two images
6 // \verbatim
7 //  Modifications
8 //
9 // \endverbatim
10 
11 #include <brip/brip_mutual_info.h>
12 #include "vil/vil_convert.h"
13 #include "vil/vil_image_view_base.h"
14 
15 //: global variables
16 namespace brip_image_mutual_info_process_globals
17 {
18   constexpr unsigned n_inputs_ = 5;
19   constexpr unsigned n_outputs_ = 1;
20 }
21 
22 //: constructor
brip_image_mutual_info_process_cons(bprb_func_process & pro)23 bool brip_image_mutual_info_process_cons(bprb_func_process& pro)
24 {
25   using namespace brip_image_mutual_info_process_globals;
26   // inputs
27   std::vector<std::string> input_types_(n_inputs_);
28   input_types_[0] = "vil_image_view_base_sptr";  // input image 1
29   input_types_[1] = "vil_image_view_base_sptr";  // input image 2
30   input_types_[2] = "double";                    // histogram min value
31   input_types_[3] = "double";                    // histogram max value
32   input_types_[4] = "unsigned";                  // number of bins in histogram
33   // outputs
34   std::vector<std::string> output_types_(n_outputs_);
35   output_types_[0] = "double";  // mutual information between two input images
36 
37   return pro.set_input_types(input_types_) && pro.set_output_types(output_types_);
38 }
39 
40 //: execute the process
brip_image_mutual_info_process(bprb_func_process & pro)41 bool brip_image_mutual_info_process(bprb_func_process& pro)
42 {
43   using namespace brip_image_mutual_info_process_globals;
44 
45   // sanity check
46   if (!pro.verify_inputs()) {
47     std::cout << pro.name() << ": Wrong Inputs!!!" << std::endl;
48     return false;
49   }
50 
51   // get the inputs
52   unsigned in_i = 0;
53   vil_image_view_base_sptr img_ptr_a = pro.get_input<vil_image_view_base_sptr>(in_i++);
54   vil_image_view_base_sptr img_ptr_b = pro.get_input<vil_image_view_base_sptr>(in_i++);
55   auto min = pro.get_input<double>(in_i++);
56   auto max = pro.get_input<double>(in_i++);
57   auto n_bins = pro.get_input<unsigned>(in_i++);
58 
59   // cast to float images
60   vil_image_view<float> image_a = *(vil_convert_cast(float(), img_ptr_a));
61   vil_image_view<float> image_b = *(vil_convert_cast(float(), img_ptr_b));
62 
63   double mutual_info = brip_mutual_info(image_a, image_b, min, max, n_bins);
64 
65   // output
66   pro.set_output_val<double>(0, mutual_info);
67   return true;
68 }
69