Listing 2: STL-compliant median filter.
// functor
template<size_t SubWindowWidth> struct MedianFiltering {
template<typename SubWindow>
inline unsigned char operator()(SubWindow &in) {
std::copy(in.begin(), in.end(), tmp.begin());
std::nth_element(tmp.begin(),
tmp.begin() + (SubWindowWidth * SubWindowWidth) / 2,
tmp.end());
return data[(SubWindowWidth * SubWindowWidth) / 2];
}
unsigned char tmp[SubWindowWidth * SubWindowWidth];
};
// process all pixels
int main(...) {
std::transform(windowsBegin(in), windowsEnd(in),
sequentialBegin(out), MedianFiltering());
}