30 #ifndef _D_MORPHO_FILTER_HPP
31 #define _D_MORPHO_FILTER_HPP
33 #include "Core/include/DImage.h"
34 #include "DMorphImageOperations.hxx"
36 #include "Base/include/private/DImageArith.hpp"
37 #include "Morpho/include/DMorphoInstance.h"
38 #include "DHitOrMiss.hpp"
71 const StrElt &se = DEFAULT_SE)
73 ASSERT_ALLOCATED(&imIn, &imOut);
74 ASSERT_SAME_SIZE(&imIn, &imOut);
84 ASSERT((
dilate(imIn, *imTmp, se) == RES_OK));
85 ASSERT((
erode(*imTmp, imOut, se) == RES_OK));
110 return close(imIn, imOut, DEFAULT_SE(seSize));
124 const StrElt &se = DEFAULT_SE)
126 ASSERT_ALLOCATED(&imIn, &imOut);
127 ASSERT_SAME_SIZE(&imIn, &imOut);
137 ASSERT((
erode(imIn, *imTmp, se) == RES_OK));
138 ASSERT((
dilate(*imTmp, imOut, se) == RES_OK));
163 return open(imIn, imOut, DEFAULT_SE(seSize));
182 const StrElt &se = DEFAULT_SE)
184 ASSERT_ALLOCATED(&imIn, &imOut);
185 ASSERT_SAME_SIZE(&imIn, &imOut);
190 for (UINT i = 1; i <= se.size; i++) {
191 ASSERT((
close(tmpIm, imOut, se(i)) == RES_OK));
192 ASSERT((
open(imOut, tmpIm, se(i)) == RES_OK));
194 ASSERT((
copy(tmpIm, imOut) == RES_OK));
212 const StrElt &se = DEFAULT_SE)
214 ASSERT_ALLOCATED(&imIn, &imOut);
215 ASSERT_SAME_SIZE(&imIn, &imOut);
220 for (UINT i = 1; i <= se.size; i++) {
221 ASSERT((
open(tmpIm, imOut, se(i)) == RES_OK));
222 ASSERT((
close(imOut, tmpIm, se(i)) == RES_OK));
224 ASSERT((
copy(tmpIm, imOut) == RES_OK));
230 template <
class T>
class meanFunct :
public MorphImageFunctionBase<T, T>
233 typedef MorphImageFunctionBase<T, T> parentClass;
235 virtual inline void processPixel(
size_t pointOffset,
236 vector<int> &dOffsetList)
239 vector<int>::iterator dOffset = dOffsetList.begin();
240 while (dOffset != dOffsetList.end()) {
241 meanVal += double(parentClass::pixelsIn[pointOffset + *dOffset]);
244 parentClass::pixelsOut[pointOffset] =
245 T(
meanVal /
double(dOffsetList.size()));
259 const StrElt &se = DEFAULT_SE)
261 ASSERT_ALLOCATED(&imIn, &imOut);
262 ASSERT_SAME_SIZE(&imIn, &imOut);
266 ASSERT((f._exec(imIn, imOut, se) == RES_OK));
272 template <
class T>
class medianFunct :
public MorphImageFunctionBase<T, T>
275 typedef MorphImageFunctionBase<T, T> parentClass;
277 virtual inline void processPixel(
size_t pointOffset,
278 vector<int> &dOffsetList)
281 vector<int>::iterator dOffset = dOffsetList.begin();
282 while (dOffset != dOffsetList.end()) {
283 vals.push_back(parentClass::pixelsIn[pointOffset + *dOffset]);
286 sort(vals.begin(), vals.end());
287 parentClass::pixelsOut[pointOffset] = vals[dOffsetList.size() / 2];
301 const StrElt &se = DEFAULT_SE)
303 ASSERT_ALLOCATED(&imIn, &imOut);
304 ASSERT_SAME_SIZE(&imIn, &imOut);
308 ASSERT((f._exec(imIn, imOut, se) == RES_OK));
314 template <
class T>
class rankFunct :
public MorphImageFunctionBase<T, T>
317 typedef MorphImageFunctionBase<T, T> parentClass;
319 rankFunct(
double per) : MorphImageFunctionBase<T, T>(), percentile(per)
322 virtual inline void processPixel(
size_t pointOffset,
323 vector<int> &dOffsetList)
326 vector<int>::iterator dOffset = dOffsetList.begin();
327 while (dOffset != dOffsetList.end()) {
328 vals.push_back(parentClass::pixelsIn[pointOffset + *dOffset]);
331 sort(vals.begin(), vals.end());
332 parentClass::pixelsOut[pointOffset] =
333 vals[
static_cast<int>(dOffsetList.size() * this->percentile)];
350 const StrElt &se = DEFAULT_SE)
352 ASSERT_ALLOCATED(&imIn, &imOut);
353 ASSERT_SAME_SIZE(&imIn, &imOut);
355 rankFunct<T> f(percentile);
357 ASSERT((f._exec(imIn, imOut, se) == RES_OK));
Definition: DBaseImage.h:386
Main Image class.
Definition: DImage.hpp:57
Definition: DMorphImageOperations.hpp:145
Base structuring element.
Definition: DStructuringElement.h:68
RES_T median(const Image< T > &imIn, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Median filter.
Definition: DMorphoFilter.hpp:300
RES_T rank(const Image< T > &imIn, Image< T > &imOut, double percentile, const StrElt &se=DEFAULT_SE)
Rank filter.
Definition: DMorphoFilter.hpp:349
RES_T close(const Image< T > &imIn, Image< T > &imOut, UINT seSize)
close() - Morphological grayscale closing using the default structuring element but being able to set...
Definition: DMorphoFilter.hpp:108
RES_T asfOpen(const Image< T > &imIn, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Alternate Sequential Filter beginning by an opening.
Definition: DMorphoFilter.hpp:211
RES_T asfClose(const Image< T > &imIn, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Alternate Sequential Filter beginning by a closing.
Definition: DMorphoFilter.hpp:181
RES_T mean(const Image< T > &imIn, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Mean filter.
Definition: DMorphoFilter.hpp:258
RES_T open(const Image< T > &imIn, Image< T > &imOut, UINT seSize)
open() - Morphological grayscale opening using the default structuring element but being able to set ...
Definition: DMorphoFilter.hpp:161
Vector_double meanVal(const Image< T > &imIn, bool onlyNonZero=false)
meanVal() - Mean value and standard deviation
Definition: DMeasures.hpp:211
RES_T erode(const Image< T > &imIn, Image< T > &imOut, const StrElt &se=DEFAULT_SE, const T borderVal=ImDtTypes< T >::max())
erode() - Morphological grayscale erosion
Definition: DMorphoBase.hpp:112
RES_T dilate(const Image< T > &imIn, Image< T > &imOut, const StrElt &se=DEFAULT_SE, const T borderVal=ImDtTypes< T >::min())
dilate() - Morphological grayscale dilation
Definition: DMorphoBase.hpp:65