21#ifndef mia_core_histogram_hh
22#define mia_core_histogram_hh
31#include <boost/type_traits.hpp>
73 size_t index(T x)
const;
80 T
value(
size_t k)
const;
113 size_t index(
unsigned char x)
const;
116 unsigned char value(
size_t k)
const;
133template <
typename Feeder>
142 typedef std::pair<typename Feeder::value_type, size_t>
value_type;
144 typedef std::pair<typename Feeder::value_type, typename Feeder::value_type>
range_type;
166 void push(
typename Feeder::value_type x);
173 void push(
typename Feeder::value_type x,
size_t count);
181 template <
typename Iterator>
205 typename Feeder::value_type
median()
const;
208 typename Feeder::value_type
MAD()
const;
231 std::vector<size_t> m_histogram;
241 m_step(( double(max) - double(min) ) / double(bins - 1)),
242 m_inv_step(double(bins - 1) / (double(max) - double(min)))
255 double val = floor(m_inv_step * (x - m_min) + 0.5);
269 return k * m_step + m_min;
293template <
typename Feeder>
296 m_histogram(f.size()),
301template <
typename Feeder>
303 m_feeder(org.m_feeder),
304 m_histogram(m_feeder.size()),
307 size_t n = (size_t)(org.m_n * (1.0 - perc));
310 while (n > m_n && i < m_histogram.size()) {
311 m_n += org.m_histogram[i];
312 m_histogram[i] = org.m_histogram[i];
318template <
typename Feeder>
321 return m_histogram.size();
324template <
typename Feeder>
328 ++m_histogram[m_feeder.index(x)];
331template <
typename Feeder>
332template <
typename Iterator>
341template <
typename Feeder>
345 m_histogram[m_feeder.index(x)] += count;
348template <
typename Feeder>
351 return m_histogram.begin();
354template <
typename Feeder>
357 return m_histogram.end();
360template <
typename Feeder>
363 assert(idx < m_histogram.size());
364 return m_histogram[idx];
367template <
typename Feeder>
370 float n_2 = m_n / 2.0f;
375 sum += m_histogram[k++];
377 return m_feeder.value(k > 0 ? k - 1 : k);
380template <
typename Feeder>
383 typedef typename Feeder::value_type T;
388 for (
size_t k = 0; k < size(); ++k) {
389 T v = m_feeder.value(k);
390 help.
push(v > m ? v - m : m - v, m_histogram[k]);
397template <
typename Feeder>
400 if (idx < m_histogram.size())
401 return value_type(m_feeder.value(idx), m_histogram[idx]);
406template <
typename Feeder>
414 for (
size_t i = 0; i < size(); ++i) {
416 sum += value.first * value.second;
422template <
typename Feeder>
425 double mu = average();
430 for (
size_t i = 0; i < size(); ++i) {
431 const auto value = at(i);
432 sum1 += value.first * value.second;
433 sum2 += value.first * value.first * value.second;
434 double h = (value.first - mu);
437 sum3 += h * value.second;
440 double sigma2 = (sum2 - sum1 * sum1 / m_n) / m_n;
441 double mu4 = sum3 / m_n;
442 return mu4 / (sigma2 * sigma2) - 3;
445template <
typename Feeder>
448 double mu = average();
453 for (
size_t i = 0; i < size(); ++i) {
454 const auto value = at(i);
455 sum1 += value.first * value.second;
456 sum2 += value.first * value.first * value.second;
457 double h = (value.first - mu);
458 sum3 += h * h * h * value.second;
461 double sigma2 = (sum2 - sum1 * sum1 / m_n) / m_n;
462 double mu4 = sum3 / m_n;
463 return mu4 / (sigma2 * sqrt(sigma2));
466template <
typename Feeder>
475 for (
size_t i = 0; i < size(); ++i) {
477 sum += value.first * value.second;
478 sum2 += value.first * value.first * value.second;
481 return sqrt((sum2 - sum * sum / m_n) / (m_n - 1));
484template <
typename Feeder>
488 assert(remove >= 0.0 && remove < 49.0);
489 long remove_count =
static_cast<long>(remove * m_n / 100.0);
490 range_type result(m_feeder.value(0), m_feeder.value(m_histogram.size() - 1));
492 if (remove_count > 0) {
494 long counted_pixels_low = 0;
496 while (counted_pixels_low < remove_count && low_end < (
long)m_histogram.size())
497 counted_pixels_low += m_histogram[++low_end];
499 result.first = m_feeder.value(low_end);
500 long high_end = m_histogram.size();
501 long counted_pixels_high = 0;
503 while (counted_pixels_high <= remove_count && high_end > 0)
504 counted_pixels_high += m_histogram[--high_end];
506 cvdebug() <<
" int range = " << low_end <<
", " << high_end <<
" removing " << remove_count <<
" pixels at each end\n";
507 result.second = m_feeder.value(high_end);
unsigned char value_type
typedef for generic programming
THistogramFeeder(unsigned char min, unsigned char max, size_t bins)
Construct the feeder, the parameters are ignored.
size_t index(unsigned char x) const
unsigned char value(size_t k) const
A class to normalize and quantizize input data to a given histogram range with its given number of bi...
T value_type
typedef for generic programming
THistogramFeeder(T min, T max, size_t bins)
a simple histogram that uses an instance of THistogramFeeder as input converter
Feeder::value_type median() const
std::vector< size_t >::const_iterator const_iterator
STL iterator.
void push_range(Iterator begin, Iterator end)
range_type get_reduced_range(double remove) const
const_iterator end() const
THistogram(const Feeder &f)
std::pair< typename Feeder::value_type, size_t > value_type
A type for the value-index pair.
void push(typename Feeder::value_type x)
const_iterator begin() const
double excess_kurtosis() const
Feeder::value_type MAD() const
const value_type at(size_t idx) const
size_t operator[](size_t idx) const
std::pair< typename Feeder::value_type, typename Feeder::value_type > range_type
#define NS_MIA_BEGIN
conveniance define to start the mia namespace
#define NS_MIA_END
conveniance define to end the mia namespace
THistogramFeeder< unsigned char > CUBHistogramFeeder
typedef for the unsigned byte histogram feeder specialization