8 #ifndef VIGRA_MEDIANFILTER_HXX 
    9 #define VIGRA_MEDIANFILTER_HXX 
   14 #include "applywindowfunction.hxx" 
  103 template<
class VALUETYPE>
 
  107     MedianFunctor(Diff2D window_shape)
 
  108     : m_window_shape(window_shape),
 
  109       m_buffer(window_shape.x*window_shape.y)
 
  113     template <
class SrcIterator,  
class SrcAccessor, 
class DestIterator,  
class DestAccessor>
 
  114     void operator()(SrcIterator s, SrcAccessor s_acc, DestIterator d, DestAccessor d_acc)
 
  116         SrcIterator s_ul = s - m_window_shape/2,
 
  117                     s_lr = s_ul + m_window_shape;
 
  119         std::fill(m_buffer.begin(), m_buffer.end(), VALUETYPE());
 
  121         SrcIterator ys = s_ul;
 
  124         typename std::vector<VALUETYPE>::iterator iter = m_buffer.begin(),
 
  125                                                   median_iter = m_buffer.begin()+m_buffer.size()/2;
 
  127         for( ; ys.y != s_lr.y; ys.y++)
 
  129             for(xs = ys; xs.x != s_lr.x; xs.x++, iter++)
 
  135         std::nth_element(m_buffer.begin(), median_iter, m_buffer.end());
 
  136         d_acc.set(*median_iter,d);
 
  139     Diff2D windowShape()
 const 
  141         return m_window_shape;
 
  145     Diff2D m_window_shape;
 
  146     std::vector<VALUETYPE> m_buffer;    
 
  150 template <
class SrcIterator, 
class SrcAccessor, 
 
  151           class DestIterator, 
class DestAccessor>
 
  152 inline void medianFilter(SrcIterator s_ul,  SrcIterator s_lr,   SrcAccessor s_acc,
 
  153                          DestIterator d_ul, DestAccessor d_acc, 
 
  155                          BorderTreatmentMode border = BORDER_TREATMENT_REPEAT)
 
  157     MedianFunctor<typename SrcIterator::value_type> func(window_shape);
 
  161 template <
class SrcIterator, 
class SrcAccessor, 
 
  162           class DestIterator, 
class DestAccessor>
 
  163 inline void medianFilter(triple<SrcIterator, SrcIterator, SrcAccessor> s,
 
  164                          pair<DestIterator, DestAccessor> d, 
 
  166                          BorderTreatmentMode border = BORDER_TREATMENT_REPEAT)
 
  174 template <
class T1, 
class S1, 
 
  176 inline void medianFilter(MultiArrayView<2, T1, S1> 
const & src,
 
  177                          MultiArrayView<2, T2, S2> dest, 
 
  179                          BorderTreatmentMode border = BORDER_TREATMENT_REPEAT)
 
  181     vigra_precondition(src.shape() == dest.shape(),
 
  182                         "vigra::medianFilter(): shape mismatch between input and output.");
 
  193 #endif //VIGRA_MEDIANFILTER_HXX 
void medianFilter(...)
This function calculates the median of a window of given size for the complete image. 
doxygen_overloaded_function(template<...> void separableConvolveBlockwise) template< unsigned int N
Separated convolution on ChunkedArrays. 
void applyWindowFunction(...)
Apply a window function to each pixels of a given image.