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