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); } };