37#ifndef VIGRA_FLATMORPHOLOGY_HXX
38#define VIGRA_FLATMORPHOLOGY_HXX
43#include "multi_shape.hxx"
161 int radius,
float rank)
163 vigra_precondition((
rank >= 0.0) && (
rank <= 1.0),
164 "discRankOrderFilter(): Rank must be between 0 and 1"
167 vigra_precondition(radius >= 0,
168 "discRankOrderFilter(): Radius must be >= 0.");
180 for(
i=1;
i<=radius; ++
i)
186 int w = lowerright1.x - upperleft1.x;
187 int h = lowerright1.y - upperleft1.y;
192 for(y=0; y<
h; ++y, ++
ys.y, ++
yd.y)
256 for(x=1; x<w; ++x, ++
xs.x, ++
xd.x)
265 yy = (
y1 < radius) ?
y1 : radius;
278 yy = (
y0 < radius) ?
y0 : radius;
293 yy = (
y1 < radius) ?
y1 : radius;
306 yy = (
y0 < radius) ?
y0 : radius;
372template <
class SrcIterator,
class SrcAccessor,
373 class DestIterator,
class DestAccessor>
376 pair<DestIterator, DestAccessor> dest,
377 int radius,
float rank)
380 dest.first, dest.second,
384template <
class T1,
class S1,
388 MultiArrayView<2, T2, S2> dest,
389 int radius,
float rank)
391 vigra_precondition(src.shape() == dest.shape(),
392 "discRankOrderFilter(): shape mismatch between input and output.");
459 vigra_precondition(radius >= 0,
"discErosion(): Radius must be >= 0.");
462 upperleft2,
da, radius, 0.0);
465template <
class SrcIterator,
class SrcAccessor,
466 class DestIterator,
class DestAccessor>
468discErosion(triple<SrcIterator, SrcIterator, SrcAccessor> src,
469 pair<DestIterator, DestAccessor> dest,
472 vigra_precondition(radius >= 0,
"discErosion(): Radius must be >= 0.");
475 dest.first, dest.second,
479template <
class T1,
class S1,
483 MultiArrayView<2, T2, S2> dest,
486 vigra_precondition(src.shape() == dest.shape(),
487 "discErosion(): shape mismatch between input and output.");
488 discErosion(srcImageRange(src), destImage(dest), radius);
552 vigra_precondition(radius >= 0,
"discDilation(): Radius must be >= 0.");
555 upperleft2,
da, radius, 1.0);
558template <
class SrcIterator,
class SrcAccessor,
559 class DestIterator,
class DestAccessor>
561discDilation(triple<SrcIterator, SrcIterator, SrcAccessor> src,
562 pair<DestIterator, DestAccessor> dest,
565 vigra_precondition(radius >= 0,
"discDilation(): Radius must be >= 0.");
568 dest.first, dest.second,
572template <
class T1,
class S1,
576 MultiArrayView<2, T2, S2> dest,
579 vigra_precondition(src.shape() == dest.shape(),
580 "discDilation(): shape mismatch between input and output.");
581 discDilation(srcImageRange(src), destImage(dest), radius);
645 vigra_precondition(radius >= 0,
"discMedian(): Radius must be >= 0.");
648 upperleft2,
da, radius, 0.5);
651template <
class SrcIterator,
class SrcAccessor,
652 class DestIterator,
class DestAccessor>
654discMedian(triple<SrcIterator, SrcIterator, SrcAccessor> src,
655 pair<DestIterator, DestAccessor> dest,
658 vigra_precondition(radius >= 0,
"discMedian(): Radius must be >= 0.");
661 dest.first, dest.second,
665template <
class T1,
class S1,
668discMedian(MultiArrayView<2, T1, S1>
const & src,
669 MultiArrayView<2, T2, S2> dest,
672 vigra_precondition(src.shape() == dest.shape(),
673 "discMedian(): shape mismatch between input and output.");
674 discMedian(srcImageRange(src), destImage(dest), radius);
804 int radius,
float rank)
806 vigra_precondition((
rank >= 0.0) && (
rank <= 1.0),
807 "discRankOrderFilter(): Rank must be between 0 and 1"
810 vigra_precondition(radius >= 0,
"discRankOrderFilter(): Radius must be >= 0.");
822 for(
i=1;
i<=radius; ++
i)
828 int w = lowerright1.x - upperleft1.x;
829 int h = lowerright1.y - upperleft1.y;
835 for(y=0; y<
h; ++y, ++
ys.y, ++
yd.y, ++
ym.y)
913 for(x=1; x<w; ++x, ++
xs.x, ++
xd.x, ++
xm.x)
922 yy = (
y1 < radius) ?
y1 : radius;
939 yy = (
y0 < radius) ?
y0 : radius;
958 yy = (
y1 < radius) ?
y1 : radius;
975 yy = (
y0 < radius) ?
y0 : radius;
1053template <
class SrcIterator,
class SrcAccessor,
1054 class MaskIterator,
class MaskAccessor,
1055 class DestIterator,
class DestAccessor>
1058 pair<MaskIterator, MaskAccessor> mask,
1059 pair<DestIterator, DestAccessor> dest,
1060 int radius,
float rank)
1063 mask.first, mask.second,
1064 dest.first, dest.second,
1068template <
class T1,
class S1,
1073 MultiArrayView<2, TM, SM>
const & mask,
1074 MultiArrayView<2, T2, S2> dest,
1075 int radius,
float rank)
1077 vigra_precondition(src.shape() == mask.shape() && src.shape() == dest.shape(),
1078 "discRankOrderFilterWithMask(): shape mismatch between input and output.");
1155 vigra_precondition(radius >= 0,
"discErosionWithMask(): Radius must be >= 0.");
1163template <
class SrcIterator,
class SrcAccessor,
1164 class MaskIterator,
class MaskAccessor,
1165 class DestIterator,
class DestAccessor>
1168 pair<MaskIterator, MaskAccessor> mask,
1169 pair<DestIterator, DestAccessor> dest,
1172 vigra_precondition(radius >= 0,
"discErosionWithMask(): Radius must be >= 0.");
1175 mask.first, mask.second,
1176 dest.first, dest.second,
1180template <
class T1,
class S1,
1185 MultiArrayView<2, TM, SM>
const & mask,
1186 MultiArrayView<2, T2, S2> dest,
1189 vigra_precondition(src.shape() == mask.shape() && src.shape() == dest.shape(),
1190 "discErosionWithMask(): shape mismatch between input and output.");
1264 vigra_precondition(radius >= 0,
"discDilationWithMask(): Radius must be >= 0.");
1272template <
class SrcIterator,
class SrcAccessor,
1273 class MaskIterator,
class MaskAccessor,
1274 class DestIterator,
class DestAccessor>
1277 pair<MaskIterator, MaskAccessor> mask,
1278 pair<DestIterator, DestAccessor> dest,
1281 vigra_precondition(radius >= 0,
"discDilationWithMask(): Radius must be >= 0.");
1284 mask.first, mask.second,
1285 dest.first, dest.second,
1289template <
class T1,
class S1,
1294 MultiArrayView<2, TM, SM>
const & mask,
1295 MultiArrayView<2, T2, S2> dest,
1298 vigra_precondition(src.shape() == mask.shape() && src.shape() == dest.shape(),
1299 "discDilationWithMask(): shape mismatch between input and output.");
1373 vigra_precondition(radius >= 0,
"discMedianWithMask(): Radius must be >= 0.");
1381template <
class SrcIterator,
class SrcAccessor,
1382 class MaskIterator,
class MaskAccessor,
1383 class DestIterator,
class DestAccessor>
1386 pair<MaskIterator, MaskAccessor> mask,
1387 pair<DestIterator, DestAccessor> dest,
1390 vigra_precondition(radius >= 0,
"discMedianWithMask(): Radius must be >= 0.");
1393 mask.first, mask.second,
1394 dest.first, dest.second,
1398template <
class T1,
class S1,
1403 MultiArrayView<2, TM, SM>
const & mask,
1404 MultiArrayView<2, T2, S2> dest,
1407 vigra_precondition(src.shape() == mask.shape() && src.shape() == dest.shape(),
1408 "discMedianWithMask(): shape mismatch between input and output.");
Two dimensional difference vector.
Definition diff2d.hxx:186
Class for a single RGB value.
Definition rgbvalue.hxx:128
void discMedian(...)
Apply median filter with disc of given radius to image.
void discMedianWithMask(...)
Apply median filter with disc of given radius to image using a mask.
void discRankOrderFilterWithMask(...)
Apply rank order filter with disc structuring function to the image using a mask.
void discErosionWithMask(...)
Apply erosion (minimum) filter with disc of given radius to image using a mask.
void discRankOrderFilter(...)
Apply rank order filter with disc structuring function to the image.
void discErosion(...)
Apply erosion (minimum) filter with disc of given radius to image.
void discDilationWithMask(...)
Apply dilation (maximum) filter with disc of given radius to image using a mask.
void discDilation(...)
Apply dilation (maximum) filter with disc of given radius to image.