1 // This is brl/bpro/core/vil_pro/processes/vil_resample_process.cxx
2 #include <bprb/bprb_func_process.h>
3 //:
4 // \file
5 
6 #include "vil/vil_math.h"
7 #include "vil/vil_convert.h"
8 #include "vil/vil_resample_bilin.h"
9 #include <bprb/bprb_parameters.h>
10 #include "vil/vil_image_view_base.h"
11 
12 //: Constructor
vil_resample_process_cons(bprb_func_process & pro)13 bool vil_resample_process_cons(bprb_func_process& pro)
14 {
15   //input
16   bool ok=false;
17   std::vector<std::string> input_types(4);
18   input_types[0] = "vil_image_view_base_sptr"; // input image
19   input_types[1] = "int"; // ni of target image
20   input_types[2] = "int"; // nj of target image
21   input_types[3] = "vcl_string"; //output type
22   ok = pro.set_input_types(input_types);
23   if (!ok) return ok;
24 
25   //output
26   std::vector<std::string> output_types(1);
27   output_types[0] = "vil_image_view_base_sptr"; // gauss smoothed image(float)
28   ok = pro.set_output_types(output_types);
29 
30   //default arguments - returns float
31   brdb_value_sptr idx = new brdb_value_t<std::string>("float");
32   pro.set_input(3, idx);
33   return ok;
34 }
35 
36 //: Execute the process
vil_resample_process(bprb_func_process & pro)37 bool vil_resample_process(bprb_func_process& pro)
38 {
39   // Sanity check
40   if (!pro.verify_inputs())
41     return false;
42 
43   // get the inputs
44   //Retrieve image from input
45   vil_image_view_base_sptr input_image =
46     pro.get_input<vil_image_view_base_sptr>(0);
47 
48   //Retieve target ni
49   int tni = pro.get_input<int>(1);
50 
51   //Retieve target nj
52   int tnj = pro.get_input<int>(2);
53 
54   //Retrieve output type
55   std::string out_type = pro.get_input<std::string>(3);
56 
57   ////////////////////////////////////////////////////////////////////
58   //Convert to float image
59   ////////////////////////////////////////////////////////////////////
60   vil_image_view<float> fimage;
61   if (input_image->pixel_format() == VIL_PIXEL_FORMAT_RGBA_BYTE ) {
62     vil_image_view_base_sptr plane_image = vil_convert_to_n_planes(4, input_image);
63     fimage = *vil_convert_cast(float(), plane_image);
64     vil_math_scale_values(fimage, 1.0/255.0);
65   }
66   else {
67     //can use convert cast
68     fimage = *vil_convert_cast(float(), input_image);
69 
70     // convert input image to float in range from 0 to 1
71     if (input_image->pixel_format() == VIL_PIXEL_FORMAT_BYTE)
72       vil_math_scale_values(fimage,1.0/255.0);
73     if (input_image->pixel_format() == VIL_PIXEL_FORMAT_UINT_16)
74       vil_math_scale_values(fimage,1.0/65536);
75   }
76 
77   ////////////////////////////////////////////////////////////////////
78   //resample image
79   ////////////////////////////////////////////////////////////////////
80   unsigned nplanes = fimage.nplanes();
81   auto* out_img = new vil_image_view<float>(tni, tnj, nplanes);
82   vil_resample_bilin(fimage, *out_img, tni, tnj);
83 
84   ////////////////////////////////////////////////////////////////////
85   //return image of same type (convert back)
86   ////////////////////////////////////////////////////////////////////
87   if (out_type=="float") {
88       pro.set_output_val<vil_image_view_base_sptr>(0, out_img);
89       return true;
90   }
91   else if (out_type=="byte") {
92       vil_math_scale_values( *out_img, 255.0 );
93       auto* bimage = new vil_image_view<vxl_byte>(tni, tnj, nplanes);
94       vil_convert_cast(*out_img, *bimage);
95       pro.set_output_val<vil_image_view_base_sptr>(0, bimage);
96       delete out_img;
97       return true;
98   }
99   else if (out_type=="uint16") {
100       vil_math_scale_values( *out_img, 65535.0 );
101       auto* bimage = new vil_image_view<vxl_uint_16>(tni, tnj, nplanes);
102       vil_convert_cast(*out_img, *bimage);
103       pro.set_output_val<vil_image_view_base_sptr>(0, bimage);
104       delete out_img;
105       return true;
106   }
107   else if (out_type=="rgba") {
108       vil_math_scale_values(*out_img, 255.0);
109       auto* bimage = new vil_image_view<vxl_byte>(tni, tnj, nplanes);
110       vil_convert_cast(*out_img, *bimage);
111       pro.set_output_val<vil_image_view_base_sptr>(0, vil_convert_to_component_order(bimage));
112       delete out_img;
113       return true;
114   }
115 
116   //default - return float imgae
117   std::cout<<"vil_resample_process::unrecognized output type, returning float image"<<std::endl;
118   pro.set_output_val<vil_image_view_base_sptr>(0, out_img);
119   return true;
120 }
121