/*
Copyright (C) 2006 Pedro Felzenszwalb

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
*/

/* simple filters */

#ifndef FILTER_H
#define FILTER_H

#include <algorithm>
#include <cmath>
#include <vector>
#include "third_party/segment/image.h"
#include "third_party/segment/misc.h"
#include "third_party/segment/convolve.h"
#include "third_party/segment/imconv.h"

#define WIDTH 4.0

/* normalize mask so it integrates to one */
static void normalize(std::vector<float> *mask) {
  int len = mask->size();
  float sum = 0;
  for (int i = 1; i < len; i++) {
    sum += (float)fabs((*mask)[i]);
  }
  sum = 2 * sum + (float)fabs((*mask)[0]);
  for (int i = 0; i < len; i++) {
    (*mask)[i] /= sum;
  }
}

/* make filters */
#define MAKE_FILTER(name, fun)                         \
  static std::vector<float> make_##name(float sigma) { \
    sigma = std::max(sigma, 0.01F);                    \
    int len = (int)ceil(sigma * WIDTH) + 1;            \
    std::vector<float> mask(len);                      \
    for (int i = 0; i < len; i++) {                    \
      mask[i] = fun;                                   \
    }                                                  \
    return mask;                                       \
  }

MAKE_FILTER(fgauss, (float)exp(-0.5 * square(i / sigma)));

/* convolve image with gaussian filter */
static image<float> *smooth(image<float> *src, float sigma) {
  std::vector<float> mask = make_fgauss(sigma);
  normalize(&mask);

  image<float> *tmp = new image<float>(src->height(), src->width(), false);
  image<float> *dst = new image<float>(src->width(), src->height(), false);
  convolve_even(src, tmp, mask);
  convolve_even(tmp, dst, mask);

  delete tmp;
  return dst;
}

/* convolve image with gaussian filter */
image<float> *smooth(image<uchar> *src, float sigma) {
  image<float> *tmp = imageUCHARtoFLOAT(src);
  image<float> *dst = smooth(tmp, sigma);
  delete tmp;
  return dst;
}

#endif
