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