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.