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