00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_DATA_STRETCH_HH
00027 # define MLN_DATA_STRETCH_HH
00028
00037
00038 # include <mln/estim/min_max.hh>
00039 # include <mln/value/int_u.hh>
00040 # include <mln/fun/v2v/linear.hh>
00041 # include <mln/data/transform.hh>
00042
00043
00044 # include <mln/value/internal/encoding.hh>
00045 # include <iomanip>
00046 namespace mln
00047 {
00048
00049 namespace data
00050 {
00051
00062 template <typename V, typename I>
00063 mln_ch_value(I, V)
00064 stretch(const V& v, const Image<I>& input);
00065
00066
00067 # ifndef MLN_INCLUDE_ONLY
00068
00069 namespace impl
00070 {
00071
00078
00079 template <typename V, typename I>
00080 inline
00081 mln_ch_value(I, V)
00082 stretch(const V& v, const Image<I>& input)
00083 {
00084 trace::entering("data::impl::stretch");
00085
00086 (void) v;
00087 mlc_converts_to(float, V)::check();
00088
00089 mln_ch_value(I, V) output;
00090
00091 mln_value(I) min_, max_;
00092 estim::min_max(input, min_, max_);
00093 if (max_ != min_)
00094 {
00095
00096
00097 double
00098 min = double(min_),
00099 max = double(max_),
00100 epsilon = mln_epsilon(float),
00101 M = mln_max(V) + 0.5f - epsilon,
00102 m = 0.0f - 0.5f + epsilon,
00103 a = (M - m) / (max - min),
00104 b = (m * max - M * min) / (max - min);
00105 fun::v2v::linear_sat<mln_value(I), double, V> f(a, b);
00106 output = data::transform(input, f);
00107 }
00108 else
00109 {
00110 initialize(output, input);
00111 trace::warning("output has no significative data!");
00112 }
00113
00114 trace::exiting("data::impl::stretch");
00115 return output;
00116 }
00117
00118 }
00119
00120
00121
00122
00123
00124 template <typename V, typename I>
00125 inline
00126 mln_ch_value(I, V)
00127 stretch(const V& v, const Image<I>& input)
00128 {
00129 trace::entering("data::stretch");
00130
00131 (void) v;
00132 mln_precondition(exact(input).is_valid());
00133
00134 mln_ch_value(I, V) output = impl::stretch(V(), input);
00135
00136 trace::exiting("data::stretch");
00137 return output;
00138 }
00139
00140 # endif // ! MLN_INCLUDE_ONLY
00141
00142 }
00143
00144 }
00145
00146
00147 #endif // ! MLN_DATA_STRETCH_HH