36 template <
typename A,
typename B>
37 void __assert_type_equal (A& a, B& b)
39 static_assert(
sizeof(A) == 0);
43 void __assert_type_equal (A& , A& )
47 #define ASSERT_TYPE_EQUAL(A, B) \
50 __assert_type_equal(a,b); \
53 template <
template <
typename>
class Data,
typename T>
55 static Data<float> *apply(
const Data<T>&
input,
double m,
double v)
57 Data<float> *result =
new Data<float>(
input.get_size());
58 double invv = 1.0 / v;
59 transform(
input.begin(),
input.end(), result->begin(),
68 template <
template <
typename>
class Data>
69 struct __eval<Data, bool> {
70 static Data<float> *apply(
const Data<bool>&
input,
double m,
double v)
72 Data<float> *result =
new Data<float>(
input.get_size());
73 float rtrue = (1.0 - m) / v;
74 float rfalse = - m / v;
75 transform(
input.begin(),
input.end(), result->begin(),
76 [rtrue, rfalse](
bool x) {
93 template <
class Image>
94 struct FNormalizer:
public TFilter<Image *> {
95 template <
typename T,
template <
typename>
class Data>
96 typename FNormalizer::result_type operator ()(
const Data<T>& image)
const
98 ASSERT_TYPE_EQUAL(Image,
typename Data<T>::Super);
101 typename Data<T>::const_iterator i = image.begin();
102 typename Data<T>::const_iterator e = image.end();
110 double n = image.size();
112 double v = sqrt((sum2 - n * m * m) / (n - 1));
113 mia::cvdebug() <<
"FNormalizer: avg = " << m <<
" var = " << v <<
"\n";
118 return __eval<Data, T>::apply(image, m, v);
134 template <
class Image>
137 FNormalizer<Image> n;
138 return std::shared_ptr<Image >(
mia::filter(n, image));