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)23bool 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)41bool 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