| /* |

| 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 |

| */ |

| |

| /* convolution */ |

| |

| #ifndef CONVOLVE_H |

| #define CONVOLVE_H |

| |

| #include <vector> |

| #include <algorithm> |

| #include <cmath> |

| #include "third_party/segment/image.h" |

| |

| /* convolve src with mask. dst is flipped! */ |

| static void convolve_even(image<float> *src, image<float> *dst, |

| const std::vector<float> &mask) { |

| int width = src->width(); |

| int height = src->height(); |

| int len = mask.size(); |

| |

| for (int y = 0; y < height; y++) { |

| for (int x = 0; x < width; x++) { |

| float sum = mask[0] * imRef(src, x, y); |

| for (int i = 1; i < len; i++) { |

| sum += mask[i] * (imRef(src, std::max(x - i, 0), y) + |

| imRef(src, std::min(x + i, width - 1), y)); |

| } |

| imRef(dst, y, x) = sum; |

| } |

| } |

| } |

| |

| #endif |