1 // This is brl/bpro/core/vil_pro/processes/vil_mask_image_using_ids_process.cxx
2 #include <iostream>
3 #include <string>
4 #include <bprb/bprb_func_process.h>
5 //:
6 // \file  Mask all ids except the given one in an image using another id image (should be exactly same size)
7 
8 #include "../vil_math_functors.h"
9 #include "vil/vil_convert.h"
10 #include <bprb/bprb_parameters.h>
11 #ifdef _MSC_VER
12 #  include "vcl_msvc_warnings.h"
13 #endif
14 #include "vil/vil_image_view_base.h"
15 #include "vil/vil_transform.h"
16 #include "vil/vil_math.h"
17 
18 //: Constructor
vil_mask_image_using_ids_process_cons(bprb_func_process & pro)19 bool vil_mask_image_using_ids_process_cons(bprb_func_process& pro)
20 {
21   //input
22   bool ok=false;
23   std::vector<std::string> input_types;
24   input_types.emplace_back("vil_image_view_base_sptr");  // input
25   input_types.emplace_back("vil_image_view_base_sptr");  // mask image
26   input_types.emplace_back("unsigned");   // input id (all the other ids will be masked)
27   ok = pro.set_input_types(input_types);
28   if (!ok) return ok;
29 
30   //output
31   std::vector<std::string> output_types;
32   output_types.emplace_back("vil_image_view_base_sptr");  // output
33   ok = pro.set_output_types(output_types);
34   if (!ok) return ok;
35   return true;
36 }
37 
38 
39 //: Execute the process
vil_mask_image_using_ids_process(bprb_func_process & pro)40 bool vil_mask_image_using_ids_process(bprb_func_process& pro)
41 {
42   // Sanity check
43   if (pro.n_inputs()< 3) {
44     std::cout << "vil_map_image_binary_process: The input number should be 3" << std::endl;
45     return false;
46   }
47 
48   unsigned i=0;
49   vil_image_view_base_sptr image_sptr = pro.get_input<vil_image_view_base_sptr>(i++);
50   vil_image_view_base_sptr mask_image_sptr = pro.get_input<vil_image_view_base_sptr>(i++);
51   auto idi = pro.get_input<unsigned>(i++);
52   auto id = (unsigned char)idi;
53 
54   unsigned ni = image_sptr->ni();
55   unsigned nj = image_sptr->nj();
56   if (ni != mask_image_sptr->ni() || nj != mask_image_sptr->nj()) {
57     std::cerr << "In vil_mask_image_using_ids_process() - incompatible input images!\n";
58     return false;
59   }
60 
61   vil_image_view<float> image(image_sptr);
62   vil_image_view<vxl_byte> mask_image(mask_image_sptr);
63   vil_image_view<float> out_image(ni, nj);
64   out_image.fill(-100000);
65 
66   vil_image_view<float> dest(ni, nj);
67   for (unsigned i = 0; i < ni; i++)
68     for (unsigned j = 0; j < nj; j++) {
69       if (id == mask_image(i,j))
70         out_image(i,j) = image(i,j);
71     }
72 
73   vil_image_view_base_sptr out_image_sptr = new vil_image_view<float>(out_image);
74   pro.set_output_val<vil_image_view_base_sptr>(0, out_image_sptr);
75   return true;
76 }
77