1 // This is brl/bpro/core/vil_pro/processes/vil_two_planes_composite_process.cxx
2 #include <bprb/bprb_func_process.h>
3 //:
4 // \file
5 
6 #include <bprb/bprb_parameters.h>
7 #include "vil/vil_convert.h"
8 #include "vil/vil_image_view_base.h"
9 
10 //: Constructor
vil_two_planes_composite_process_cons(bprb_func_process & pro)11 bool vil_two_planes_composite_process_cons(bprb_func_process& pro)
12 {
13   bool ok=false;
14   std::vector<std::string> input_types(4);
15   input_types[0] = "vil_image_view_base_sptr"; //base image
16   input_types[1] = "vil_image_view_base_sptr"; //colorizing image
17   input_types[2] = "bool"; //use complement
18   input_types[3] = "float"; //scale factor
19   ok = pro.set_input_types(input_types);
20   if (!ok) return ok;
21 
22   //this process has one output
23   std::vector<std::string> output_types(1);
24   output_types[0] = "vil_image_view_base_sptr";
25   ok = pro.set_output_types(output_types);
26   if (!ok) return ok;
27   return true;
28 }
29 
30 //: Execute the process
vil_two_planes_composite_process(bprb_func_process & pro)31 bool vil_two_planes_composite_process(bprb_func_process& pro)
32 {
33   // Sanity check
34   if (!pro.verify_inputs()) {
35     std::cout << "vil_two_planes_composite_process: bad inputs" << std::endl;
36     return false;
37   }
38 
39   unsigned i=0;
40   //Retrieve image from input
41   vil_image_view_base_sptr img_1 = pro.get_input<vil_image_view_base_sptr>(i++);
42   vil_image_view_base_sptr img_2 = pro.get_input<vil_image_view_base_sptr>(i++);
43   bool comp = pro.get_input<bool>(2);
44   auto scale = pro.get_input<float>(3);
45 
46   // convert input images to float
47   vil_image_view<float> fimage1 = *vil_convert_cast(float(), img_1);
48   if (img_1->pixel_format() == VIL_PIXEL_FORMAT_BYTE)
49     vil_math_scale_values(fimage1,1.0/255.0);
50 
51   vil_image_view<float> fimage2 = *vil_convert_cast(float(), img_2);
52   if (img_2->pixel_format() == VIL_PIXEL_FORMAT_BYTE)
53     vil_math_scale_values(fimage2,1.0/255.0);
54 
55 #if 0
56   vil_image_view<vxl_byte> bimage1 = vil_convert_cast(vxl_byte(), img_1);
57   vil_image_view<vxl_byte> bimage2 = vil_convert_cast(vxl_byte(), img_2);
58 #endif
59   if (!(img_1->ni()==img_2->ni() && img_1->nj()==img_2->nj()))
60   {
61     std::cout<<"The images have different dimensions"<<std::endl;
62     return false;
63   }
64 
65   auto *out_img=new vil_image_view<float>(img_1->ni(),img_1->nj(),3);
66   unsigned nplanes1 = img_1->nplanes(), nplanes2 = img_2->nplanes();
67   if ((nplanes1!=1 && nplanes1!=3) ||
68       (nplanes2!=1 && nplanes2!=3))
69     return false;
70 
71   for (unsigned i=0;i<img_1->ni();i++)
72     for (unsigned j=0;j<img_1->nj();j++)
73     {
74       if (nplanes1==1&&nplanes2==1) {
75         float v = fimage2(i,j);
76         if (comp) v = 1.0f-v;
77         (*out_img)(i,j,0)=fimage1(i,j);
78         (*out_img)(i,j,1)=scale*v;
79         (*out_img)(i,j,2)=0;
80       }
81       if (nplanes1==1&&nplanes2==3) {
82         float v = fimage1(i,j);
83         if (comp) v = 1.0f-v;
84         (*out_img)(i,j,0)=static_cast<float>((fimage2(i,j,0)+ scale*v)/2.0);
85         (*out_img)(i,j,1)=fimage2(i,j,1);
86         (*out_img)(i,j,2)=fimage2(i,j,2);
87       }
88       if (nplanes1==3&&nplanes2==1) {
89         float v = fimage2(i,j);
90         if (comp) v = 1.0f-v;
91         (*out_img)(i,j,0)=static_cast<float>((scale*v+ fimage1(i,j,0))/2.0);
92         (*out_img)(i,j,1)=fimage1(i,j,1);
93         (*out_img)(i,j,2)=fimage1(i,j,2);
94       }
95       if (nplanes1==3&&nplanes2==3) {
96         float v0 = fimage2(i,j,0), v1 = fimage2(i,j,1), v2 = fimage2(i,j,2);
97         if (comp) { v0 = 1.0f-v0; v1 = 1.0f-v1; v2 = 1.0f-v2; }
98         (*out_img)(i,j,0)=static_cast<float>((scale*v0+ fimage1(i,j,0))/2.0);
99         (*out_img)(i,j,1)=static_cast<float>((scale*v1+ fimage1(i,j,1))/2.0);
100         (*out_img)(i,j,2)=static_cast<float>((scale*v2+ fimage1(i,j,2))/2.0);
101       }
102     }
103 
104   vil_image_view_base_sptr out_img_ptr=out_img;
105 
106   pro.set_output_val<vil_image_view_base_sptr>(0, out_img_ptr);
107   return true;
108 }
109