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