1 // This is brl/bpro/core/brip_pro/processes/brip_phase_correlation_process.cxx
2 #include <bprb/bprb_func_process.h>
3 //:
4 // \file
5 // \brief  process to compute an image translation via phase correlation to align the two images
6 // \verbatim
7 //  Modifications
8 //
9 // \endverbatim
10 
11 #include <brip/brip_phase_correlation.h>
12 #include "vil/vil_convert.h"
13 #include "vil/vil_image_view_base.h"
14 #include "vil/vil_save.h"
15 //: global variables
16 namespace brip_phase_correlation_process_globals
17 {
18   constexpr unsigned n_inputs_ = 5;
19   constexpr unsigned n_outputs_ = 4;
20 }
21 
22 //: constructor
brip_phase_correlation_process_cons(bprb_func_process & pro)23 bool brip_phase_correlation_process_cons(bprb_func_process& pro)
24 {
25   using namespace brip_phase_correlation_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] = "float";                    // gauss sigma
31   input_types_[3] = "float";                    // peak_radius
32   input_types_[4] = "float";                  // alpha
33   // outputs
34   std::vector<std::string> output_types_(n_outputs_);
35   output_types_[0] = "float";  // tu
36   output_types_[1] = "float";  // tv
37   output_types_[2] = "float";  // confidence
38   output_types_[3] = "vil_image_view_base_sptr";  // correlation output
39 
40   return pro.set_input_types(input_types_) && pro.set_output_types(output_types_);
41 }
42 
43 //: execute the process
brip_phase_correlation_process(bprb_func_process & pro)44 bool brip_phase_correlation_process(bprb_func_process& pro)
45 {
46   using namespace brip_phase_correlation_process_globals;
47 
48   // sanity check
49   if (!pro.verify_inputs()) {
50     std::cout << pro.name() << ": Wrong Inputs!!!" << std::endl;
51     return false;
52   }
53 
54   // get the inputs
55   unsigned in_i = 0;
56   vil_image_view_base_sptr img_ptr_a = pro.get_input<vil_image_view_base_sptr>(in_i++);
57   vil_image_view_base_sptr img_ptr_b = pro.get_input<vil_image_view_base_sptr>(in_i++);
58   auto gauss_sigma = pro.get_input<float>(in_i++);
59   auto peak_radius = pro.get_input<float>(in_i++);
60   auto alpha = pro.get_input<float>(in_i++);
61 
62   // cast to float images
63   vil_image_view<float> image_a = *(vil_convert_cast(float(), img_ptr_a));
64   vil_image_view<float> image_b = *(vil_convert_cast(float(), img_ptr_b));
65 
66   // replace NAN values with proper fill value (0.0f)
67   for (unsigned i = 0; i < image_a.ni(); i++)
68     for (unsigned j = 0; j < image_a.nj(); j++)
69       if (image_a(i,j) != image_a(i,j)) // test for std::numeric_limits<float>::quiet_NaN())
70         image_a(i,j) = 0.0f;
71 
72   for (unsigned i = 0; i < image_b.ni(); i++)
73     for (unsigned j = 0; j < image_b.nj(); j++)
74       if (image_b(i,j) != image_b(i,j)) // test for std::numeric_limits<float>::quiet_NaN())
75         image_b(i,j) = 0.0f;
76   //vil_save(image_a, "C:/projects/SatTel/Kandahar/scene_60/image_a.tif");
77   //vil_save(image_b, "C:/projects/SatTel/Kandahar/scene_60/image_b.tif");
78   brip_phase_correlation bpco(image_a, image_b, gauss_sigma, peak_radius, alpha);
79   bool good = bpco.compute();
80   if(!good) {
81     std::cout << "In brip_phase_correlation_process -- compute() failed\n";
82     return false;
83   }
84 
85   vil_image_view<float> ortho_corr = bpco.correlation_array();
86   float tu , tv, conf;
87   if(!bpco.translation(tu, tv, conf)) {
88     std::cout << "In brip_phase_correlation_process -- registration failed\n";
89     return false;
90   }
91   pro.set_output_val<float>(0, tu);
92   pro.set_output_val<float>(1, tv);
93   pro.set_output_val<float>(2, conf);
94   pro.set_output_val<vil_image_view_base_sptr>(3, new vil_image_view<float>(ortho_corr));
95   return true;
96 }
97