21 #ifndef mia_core_histogram_hh
22 #define mia_core_histogram_hh
31 #include <boost/type_traits.hpp>
72 size_t index(T x)
const;
79 T
value(
size_t k)
const;
111 size_t index(
unsigned char x)
const;
114 unsigned char value(
size_t k)
const;
131 template <
typename Feeder>
139 typedef std::pair<typename Feeder::value_type, size_t>
value_type;
141 typedef std::pair<typename Feeder::value_type, typename Feeder::value_type>
range_type;
163 void push(
typename Feeder::value_type x);
170 void push(
typename Feeder::value_type x,
size_t count);
178 template <
typename Iterator>
202 typename Feeder::value_type
median()
const;
205 typename Feeder::value_type
MAD()
const;
222 std::vector<size_t> m_histogram;
227 template <
typename T>
232 m_step(( double(max) - double(min) ) / double(bins - 1)),
233 m_inv_step(double(bins - 1) / (double(max) - double(min)))
237 template <
typename T>
243 template <
typename T>
246 double val = floor(m_inv_step * (x - m_min) + 0.5);
254 template <
typename T>
257 return k * m_step + m_min;
281 template <
typename Feeder>
284 m_histogram(f.size()),
289 template <
typename Feeder>
291 m_feeder(org.m_feeder),
292 m_histogram(m_feeder.size()),
295 size_t n = (size_t)(org.m_n * (1.0 - perc));
298 while (n > m_n && i < m_histogram.size()) {
299 m_n += org.m_histogram[i];
300 m_histogram[i] = org.m_histogram[i];
306 template <
typename Feeder>
309 return m_histogram.size();
312 template <
typename Feeder>
316 ++m_histogram[m_feeder.index(x)];
319 template <
typename Feeder>
320 template <
typename Iterator>
329 template <
typename Feeder>
333 m_histogram[m_feeder.index(x)] += count;
336 template <
typename Feeder>
339 return m_histogram.begin();
342 template <
typename Feeder>
345 return m_histogram.end();
348 template <
typename Feeder>
351 assert(idx < m_histogram.size());
352 return m_histogram[idx];
355 template <
typename Feeder>
358 float n_2 = m_n / 2.0f;
362 sum += m_histogram[k++];
364 return m_feeder.value(k-1);
367 template <
typename Feeder>
370 typedef typename Feeder::value_type T;
376 for (
size_t k = 0; k < size(); ++k) {
377 T v = m_feeder.value(k);
378 help.
push(v > m ? v - m : m -v, m_histogram[k]);
384 template <
typename Feeder>
387 if (idx < m_histogram.size())
388 return value_type(m_feeder.value(idx), m_histogram[idx]);
393 template <
typename Feeder>
399 for (
size_t i = 0; i < size(); ++i) {
401 sum += value.first * value.second;
406 template <
typename Feeder>
413 for (
size_t i = 0; i < size(); ++i) {
415 sum += value.first * value.second;
416 sum2 += value.first * value.first * value.second;
418 return sqrt((sum2 - sum * sum / m_n) / (m_n - 1));
421 template <
typename Feeder>
425 assert(
remove >= 0.0 &&
remove < 49.0);
426 long remove_count =
static_cast<long>(
remove * m_n / 100.0);
428 range_type result(m_feeder.value(0), m_feeder.value(m_histogram.size() - 1));
430 if (remove_count > 0) {
432 long counted_pixels_low = 0;
434 while (counted_pixels_low < remove_count && low_end < (
long)m_histogram.size())
435 counted_pixels_low += m_histogram[++low_end];
437 result.first = m_feeder.value(low_end);
439 long high_end = m_histogram.size();
440 long counted_pixels_high = 0;
441 while (counted_pixels_high <= remove_count && high_end > 0)
442 counted_pixels_high += m_histogram[--high_end];
443 cvdebug() <<
" int range = " << low_end <<
", " << high_end <<
" removing " << remove_count <<
" pixels at each end\n";
444 result.second = m_feeder.value(high_end);