37#ifndef VIGRA_LABELIMAGE_HXX
38#define VIGRA_LABELIMAGE_HXX
43#include "stdimage.hxx"
44#include "union_find.hxx"
45#include "sized_int.hxx"
46#include "multi_shape.hxx"
195 typedef typename DestAccessor::value_type LabelType;
201 const Diff2D neighbor[] = {
208 const int left = 0, top = 2,
topright = 3;
231 for(y = 0; y !=
h; ++y, ++
ys.y, ++
yd.y)
238 for(x = 0; x != w; ++x, ++
xs.x, ++
xd.x)
247 LabelType neighborIndex = label.findIndex(
da(
xd,neighbor[
i]));
253 neighborIndex = label.makeUnion(
da(
xd, neighbor[
j]), neighborIndex);
257 da.set(neighborIndex,
xd);
264 da.set(label.makeNewIndex(),
xd);
271 unsigned int count = label.makeContiguous();
274 for(y=0; y !=
h; ++y, ++
yd.y)
276 typename DestIterator::row_iterator
xd =
yd.rowIterator();
277 for(x = 0; x != w; ++x, ++
xd)
279 da.set(label.findLabel(
da(
xd)),
xd);
285template <
class SrcIterator,
class SrcAccessor,
286 class DestIterator,
class DestAccessor>
288unsigned int labelImage(SrcIterator upperlefts,
289 SrcIterator lowerrights, SrcAccessor sa,
290 DestIterator upperleftd, DestAccessor da,
291 bool eight_neighbors)
293 return labelImage(upperlefts, lowerrights, sa,
294 upperleftd, da, eight_neighbors,
295 std::equal_to<typename SrcAccessor::value_type>());
298template <
class SrcIterator,
class SrcAccessor,
299 class DestIterator,
class DestAccessor,
300 class EqualityFunctor>
302labelImage(triple<SrcIterator, SrcIterator, SrcAccessor> src,
303 pair<DestIterator, DestAccessor> dest,
304 bool eight_neighbors, EqualityFunctor equal)
306 return labelImage(src.first, src.second, src.third,
307 dest.first, dest.second, eight_neighbors, equal);
310template <
class SrcIterator,
class SrcAccessor,
311 class DestIterator,
class DestAccessor>
313labelImage(triple<SrcIterator, SrcIterator, SrcAccessor> src,
314 pair<DestIterator, DestAccessor> dest,
315 bool eight_neighbors)
317 return labelImage(src.first, src.second, src.third,
318 dest.first, dest.second, eight_neighbors,
319 std::equal_to<typename SrcAccessor::value_type>());
322template <
class T1,
class S1,
324 class EqualityFunctor>
326labelImage(MultiArrayView<2, T1, S1>
const & src,
327 MultiArrayView<2, T2, S2> dest,
328 bool eight_neighbors, EqualityFunctor equal)
330 vigra_precondition(src.shape() == dest.shape(),
331 "labelImage(): shape mismatch between input and output.");
333 destImage(dest), eight_neighbors, equal);
336template <
class T1,
class S1,
339labelImage(MultiArrayView<2, T1, S1>
const & src,
340 MultiArrayView<2, T2, S2> dest,
341 bool eight_neighbors)
344 destImage(dest), eight_neighbors,
345 std::equal_to<T1>());
502 const Diff2D neighbor[] = {
509 const int left = 0, top = 2,
topright = 3;
520 TmpImage::Iterator
xt(
yt);
525 for(y = 0; y !=
h; ++y, ++
ys.y, ++
yt.y)
532 for(x = 0; x != w; ++x, ++
xs.x, ++
xt.x)
558 while(neighborIndex != label[neighborIndex])
560 neighborIndex = label[neighborIndex];
603 for(y=0; y !=
h; ++y, ++
yd.y)
606 for(x = 0; x != w; ++x, ++
xd.x, ++
i)
608 if(label[
i] == -1)
continue;
616 label[
i] = label[label[
i]];
618 da.set(label[
i]+1,
xd);
625template <
class SrcIterator,
class SrcAccessor,
626 class DestIterator,
class DestAccessor,
630 SrcIterator upperlefts,
631 SrcIterator lowerrights, SrcAccessor sa,
632 DestIterator upperleftd, DestAccessor da,
633 bool eight_neighbors,
634 ValueType background_value)
638 eight_neighbors, background_value,
639 std::equal_to<typename SrcAccessor::value_type>());
642template <
class SrcIterator,
class SrcAccessor,
643 class DestIterator,
class DestAccessor,
644 class ValueType,
class EqualityFunctor>
647 pair<DestIterator, DestAccessor> dest,
648 bool eight_neighbors,
649 ValueType background_value, EqualityFunctor equal)
652 dest.first, dest.second,
653 eight_neighbors, background_value, equal);
656template <
class SrcIterator,
class SrcAccessor,
657 class DestIterator,
class DestAccessor,
661 pair<DestIterator, DestAccessor> dest,
662 bool eight_neighbors,
663 ValueType background_value)
666 dest.first, dest.second,
667 eight_neighbors, background_value,
668 std::equal_to<typename SrcAccessor::value_type>());
671template <
class T1,
class S1,
673 class ValueType,
class EqualityFunctor>
676 MultiArrayView<2, T2, S2> dest,
677 bool eight_neighbors,
678 ValueType background_value, EqualityFunctor equal)
680 vigra_precondition(src.shape() == dest.shape(),
681 "labelImageWithBackground(): shape mismatch between input and output.");
684 eight_neighbors, background_value, equal);
687template <
class T1,
class S1,
692 MultiArrayView<2, T2, S2> dest,
693 bool eight_neighbors,
694 ValueType background_value)
696 vigra_precondition(src.shape() == dest.shape(),
697 "labelImageWithBackground(): shape mismatch between input and output.");
700 eight_neighbors, background_value,
701 std::equal_to<T1>());
711enum EdgeImageLabelPolicy { CopyRegionLabels, EdgeOverlayOnly };
871 EdgeImageLabelPolicy
labelPolicy = CopyRegionLabels)
886 for(y=0; y<
h-1; ++y, ++
iy.y, dy.y+=2)
891 for(x=0; x<w-1; ++x, ++
ix.x, dx.x+=2)
905 da.set(
sa(
ix), dx, right);
913 da.set(
sa(
ix), dx, bottom);
928 da.set(
sa(
ix), dx, bottom);
935 for(x=0; x<w-1; ++x, ++
ix.x, dx.x+=2)
947 da.set(
sa(
ix), dx, right);
956 const Diff2D dist[] = {right, top, left, bottom };
958 for(y=0; y<
h-1; ++y, dy.y+=2)
962 for(x=0; x<w-1; ++x, dx.x+=2)
975template <
class SrcIterator,
class SrcAccessor,
976 class DestIterator,
class DestAccessor,
class DestValue>
979 pair<DestIterator, DestAccessor> dest,
980 DestValue edge_marker,
981 EdgeImageLabelPolicy labelPolicy = CopyRegionLabels)
984 dest.first, dest.second,
985 edge_marker, labelPolicy);
988template <
class T1,
class S1,
989 class T2,
class S2,
class DestValue>
992 MultiArrayView<2, T2, S2> dest,
993 DestValue edge_marker,
994 EdgeImageLabelPolicy labelPolicy = CopyRegionLabels)
996 vigra_precondition(2*src.shape()-Shape2(1) == dest.shape(),
997 "regionImageToCrackEdgeImage(): shape mismatch between input and output.");
1141 const Diff2D bottom(0,1);
1147 for(y=0; y<
h-1; ++y, ++
iy.y, ++dy.y)
1152 for(x=0; x<w-1; ++x, ++
ix.x, ++dx.x)
1173 for(x=0; x<w-1; ++x, ++
ix.x, ++dx.x)
1182template <
class SrcIterator,
class SrcAccessor,
1183 class DestIterator,
class DestAccessor,
class DestValue>
1186 pair<DestIterator, DestAccessor> dest,
1187 DestValue edge_marker)
1190 dest.first, dest.second,
1194template <
class T1,
class S1,
1195 class T2,
class S2,
class DestValue>
1198 MultiArrayView<2, T2, S2> dest,
1199 DestValue edge_marker)
1201 vigra_precondition(src.shape() == dest.shape(),
1202 "regionImageToEdgeImage(): shape mismatch between input and output.");
Two dimensional difference vector.
Definition diff2d.hxx:186
Class for a single RGB value.
Definition rgbvalue.hxx:128
iterator begin()
Definition tinyvector.hxx:861
detail::SelectBiggestIntegerType< detail::SignedIntTypes >::type IntBiggest
the biggest signed integer type of the system
Definition sized_int.hxx:188
unsigned int labelImageWithBackground(...)
Find the connected components of a segmented image, excluding the background from labeling.
void regionImageToEdgeImage(...)
Transform a labeled image into an edge image.
void regionImageToCrackEdgeImage(...)
Transform a labeled image into a crack edge (interpixel edge) image.
unsigned int labelImage(...)
Find the connected components of a segmented image.