Listing 5: Generalized convolution and morphological erosion operations.

template<size_t _SubWidth, size_t _SubHeight, typename _KernelIterator>
    struct Convolution  {
    Convolution(_KernelIterator kernel) : kernel_(kernel)    {
    }
    template<typename SubWindow> inline 
      std::iterator_traits<SubWindow>::value_type
      operator()(SubWindow &in) {
        typename std::iterator_traits<_KernelIterator>::value_type tmp = 0;
        return std::inner_product(in.begin(),in.end(),kernel_,tmp);
    }
   _KernelIterator kernel_;
};
template<size_t _SubWidth, size_t _SubHeight> struct Erode  {
    template<typename SubWindow> inline bool
      operator()(SubWindow &in)    {
        const typename SubWindow::iterator m = std::min_element(in.begin(),
                                                                in.end());
        return (*m == 0);
    }
};