33 #include "DMorphImageOperations.hpp"
34 #include "DMorphoHierarQ.hpp"
35 #include "Core/include/DImage.h"
36 #include "Base/include/private/DImageHistogram.hpp"
37 #include "Morpho/include/private/DMorphoMaxTreeCriteria.hpp"
56 typedef size_t Offset_T;
57 typedef UINT32 Label_T;
59 template <
class T,
class CriterionT,
class Offset_T = size_t,
60 class Label_T = UINT32>
64 size_t GRAY_LEVEL_NBR;
70 vector<Label_T> children;
71 vector<Label_T> brothers;
72 vector<CriterionT> criteria;
73 vector<Label_T> labels;
89 labels.resize(GRAY_LEVEL_NBR);
113 levels.resize(levels.size() + 1024 * 1024);
114 children.resize(children.size() + 1024 * 1024);
115 brothers.resize(brothers.size() + 1024 * 1024);
116 criteria.resize(criteria.size() + 1024 * 1024);
119 T initialize(
const Image<T> &imIn, Label_T *img_eti,
const StrElt &se)
124 sePtsNbr = sePts.size();
130 for (vector<IntPoint>::const_iterator it = se.points.begin();
131 it != se.points.end(); it++) {
132 if (it->x != 0 || it->y != 0 || it->z != 0) {
133 sePts.push_back(*it);
134 dOffsets.push_back(it->x + it->y * imSize[0] +
135 it->z * imSize[0] * imSize[1]);
139 sePtsNbr = sePts.size();
146 typename ImDtTypes<T>::lineType pix = img->
getPixels();
152 if (pix[i] < minValue) {
155 if (minValue == tMinV)
163 levels[curLabel] = minValue;
168 img_eti[minOff] = curLabel;
169 labels[minValue] = curLabel;
170 labels[minValue] = curLabel;
173 hq.push(minValue, minOff);
185 getCriterion(curLabel).initialize();
196 int nextLowerLabel(T valeur)
198 if (curLabel + 256 > levels.size())
201 getLevel(curLabel) = valeur;
203 for (i = valeur - 1; labels[i] == 0; i--)
206 getChild(curLabel) = getChild(labels[i]);
207 getChild(labels[i]) = curLabel;
208 getBrother(curLabel) = getBrother(getChild(curLabel));
209 getBrother(getChild(curLabel)) = 0;
210 getCriterion(curLabel).reset();
214 int nextHigherLabel(T parent_valeur, T valeur)
216 if (curLabel + 256 > levels.size())
219 getLevel(curLabel) = valeur;
220 getBrother(curLabel) = getChild(labels[parent_valeur]);
221 getChild(labels[parent_valeur]) = curLabel;
222 getCriterion(curLabel).reset();
226 bool subFlood(
typename ImDtTypes<T>::lineType imgPix, Label_T *img_eti,
227 Offset_T p, Offset_T p_suiv)
231 if (imgPix[p_suiv] > imgPix[p]) {
233 for (j = imgPix[p] + 1; j < imgPix[p_suiv]; j++)
235 indice = img_eti[p_suiv] = labels[j] =
236 nextHigherLabel(imgPix[p], imgPix[p_suiv]);
238 }
else if (labels[imgPix[p_suiv]] == 0) {
239 indice = img_eti[p_suiv] = labels[imgPix[p_suiv]] =
240 nextLowerLabel(imgPix[p_suiv]);
242 indice = img_eti[p_suiv] = labels[imgPix[p_suiv]];
248 getCriterion(indice).update(x, y, z);
249 hq.push(imgPix[p_suiv], p_suiv);
251 if (imgPix[p_suiv] > imgPix[p]) {
252 hq.push(imgPix[p], p);
258 void flood(
const Image<T> &img, UINT *img_eti,
unsigned int level)
262 typename ImDtTypes<T>::lineType imgPix = img.
getPixels();
265 while ((hq.getHigherLevel() >= level) && !hq.isEmpty()) {
270 bool oddLine = oddSE && ((y0) % 2);
276 for (UINT i = 0; i < sePtsNbr; i++) {
283 x += (((y + 1) % 2) != 0);
285 if (x >= 0 && x < (
int) imSize[0] && y >= 0 && y < (int) imSize[1] &&
286 z >= 0 && z < (
int) imSize[2]) {
287 p_suiv = p + dOffsets[i];
289 p_suiv += (((y + 1) % 2) != 0);
291 if (img_eti[p_suiv] == 0) {
292 if (subFlood(imgPix, img_eti, p, p_suiv))
306 vector<IntPoint> sePts;
309 vector<int> dOffsets;
312 inline CriterionT &getCriterion(
const Label_T node)
314 return criteria[node];
317 inline T &getLevel(
const Label_T node)
322 inline Label_T &getChild(
const Label_T node)
324 return children[node];
327 inline Label_T &getBrother(
const Label_T node)
329 return brothers[node];
332 inline Label_T getLabelMax()
337 inline int getImWidth()
342 inline int getImHeight()
347 int build(
const Image<T> &img, Label_T *img_eti,
const StrElt &se)
349 T minValue = initialize(img, img_eti, se);
352 flood(img, img_eti, minValue);
353 updateCriteria(labels[minValue]);
355 return labels[minValue];
364 void updateCriteria(
const int node)
366 Label_T child = getChild(node);
368 updateCriteria(child);
369 getCriterion(node).merge(&getCriterion(child));
370 child = getBrother(child);
380 template <
class T,
class CriterionT,
class Offset_T,
class Label_T,
383 T *transformee_node, Attr_T *indicatrice_node,
int node,
384 int nParent, T prev_residue, Attr_T stop, UINT delta,
395 cNode = tree.getCriterion(node).getAttributeValue();
397 lNode = tree.getLevel(node);
401 cParent = tree.getCriterion(nParent).getAttributeValue();
403 lParent = tree.getLevel(nParent);
407 if ((cParent - cNode) <= delta) {
412 current_residue = prev_residue + lNode - lParent;
414 current_residue = lNode - lParent;
417 transformee_node[node] = transformee_node[nParent];
418 indicatrice_node[node] = indicatrice_node[nParent];
423 if (current_residue > transformee_node[node]) {
426 transformee_node[node] = current_residue;
427 if (!(isPrevMaxT && flag)) {
428 indicatrice_node[node] = cNode + 1;
432 indicatrice_node[node] = 0;
434 child = tree.getChild(node);
436 ComputeDeltaUO(tree, transformee_node, indicatrice_node, child, node,
437 current_residue, stop, delta, isMaxT);
438 child = tree.getBrother(child);
442 template <
class T1,
class T2>
443 void compute_max(MaxTree2<T1, HeightCriterion, size_t, UINT32> &tree,
444 T1 *transformee_node, T2 *indicatrice_node, UINT32 node,
445 T2 stop, T1 max_tr, T2 max_in, T2 hauteur_parent,
446 T1 valeur_parent, T1 previous_value)
452 T2 hauteur = tree.getCriterion(node).getAttributeValue();
455 m = (hauteur == hauteur_parent) ? tree.getLevel(node) - previous_value
456 : tree.getLevel(node) - valeur_parent;
457 if (hauteur >= stop) {
460 transformee_node[node] = max_node;
462 indicatrice_node[node] = 0;
463 child = tree.getChild(node);
467 max_criterion = hauteur;
470 max_criterion = max_in;
472 transformee_node[node] = max_node;
473 indicatrice_node[node] = max_criterion + 1;
474 child = tree.getChild(node);
476 if (hauteur == hauteur_parent) {
481 if (hauteur_parent > stop)
482 compute_max(tree, transformee_node, indicatrice_node, child, stop,
483 max_node, max_criterion, hauteur, tree.getLevel(node),
486 compute_max(tree, transformee_node, indicatrice_node, child, stop,
487 max_node, max_criterion, hauteur,
488 tree.getLevel(node) , previous_value);
489 child = tree.getBrother(child);
497 compute_max(tree, transformee_node, indicatrice_node, child, stop,
498 max_node, max_criterion, hauteur, tree.getLevel(node),
500 child = tree.getBrother(child);
505 template <
class T1,
class T2>
506 void compute_contrast(MaxTree2<T1, HeightCriterion, size_t, UINT32> &tree,
507 T1 *transformee_node, T2 *indicatrice_node, UINT32 root,
508 T2 stopSize, UINT delta = 0)
514 transformee_node[root] = 0;
515 indicatrice_node[root] = 0;
517 hauteur = tree.getCriterion(root).getAttributeValue();
518 child = tree.getChild(root);
523 compute_max(tree, transformee_node, indicatrice_node, child, stopSize,
524 (T1) 0, (T2) 0, hauteur, tree.getLevel(root),
525 tree.getLevel(root));
526 child = tree.getBrother(child);
531 ComputeDeltaUO(tree, transformee_node, indicatrice_node, child,
533 stopSize , delta, 0 );
535 child = tree.getBrother(child);
555 template <
class T1,
class T2>
558 T2 stopSize = 0, UINT delta = 0)
560 ASSERT_ALLOCATED(&imIn, &imTrans, &imIndic);
561 ASSERT_SAME_SIZE(&imIn, &imTrans, &imIndic);
567 UINT *img_eti =
new UINT[imSize]();
570 UINT32 root = tree.build(imIn, img_eti, se);
574 T1 *transformee_node =
new T1[tree.getLabelMax()]();
575 T2 *indicatrice_node =
new T2[tree.getLabelMax()]();
577 compute_contrast(tree, transformee_node, indicatrice_node, root, stopSize,
580 typename ImDtTypes<T1>::lineType transformeePix = imTrans.
getPixels();
583 for (
int i = 0; i < imSize; i++) {
584 transformeePix[i] = transformee_node[img_eti[i]];
585 indicatricePix[i] = indicatrice_node[img_eti[i]];
589 delete[] transformee_node;
590 delete[] indicatrice_node;
602 template <
class T,
class CriterionT,
class Offset_T,
class Label_T,
604 void ComputeDeltaUOMSER(MaxTree2<T, CriterionT, Offset_T, Label_T> &tree,
605 T *transformee_node, Attr_T *indicatrice_node,
606 int node,
int nParent,
int first_ancestor,
607 Attr_T stop, UINT delta, UINT method,
int isPrevMaxT,
608 UINT minArea = 0, T
threshold = 0, T mymax = 0)
620 T current_residue, stab_residue = 0;
622 size_t aNode, aParent, aAncestor;
623 T lNode, lParent, lAncestor;
627 hNode = tree.getCriterion(node).getAttributeValue().H;
628 aNode = tree.getCriterion(node).getAttributeValue().A;
629 lNode = tree.getLevel(node);
632 hParent = tree.getCriterion(nParent).getAttributeValue().H;
633 aParent = tree.getCriterion(nParent).getAttributeValue().A;
634 aAncestor = tree.getCriterion(first_ancestor).getAttributeValue().A;
636 lParent = tree.getLevel(nParent);
637 lAncestor = tree.getLevel(first_ancestor);
640 if ((hParent - hNode) <= delta) {
644 float relativeGrowthRate;
645 double lgARoot =
std::log((
double) tree.getImWidth() * tree.getImHeight());
652 factor = ImDtTypes<T>::max() / ((double) 100 * lgARoot);
653 }
else if (method == 3) {
654 factor = ImDtTypes<T>::max() / ((double) 100.0);
655 factor = mymax / ((double) 25.0);
658 current_residue = lNode - lAncestor;
661 stability = 1 - ((aAncestor - aNode) * 1.0 / (aAncestor));
662 stab_residue = round(current_residue * stability);
663 }
else if (method == 2) {
666 if (current_residue > relativeGrowthRate) {
667 stab_residue = round(current_residue - relativeGrowthRate);
672 else if (method == 3) {
673 stability = factor * (((aAncestor - aNode) * 1.0 / (aAncestor)));
674 if (current_residue > stability) {
675 stab_residue = round(current_residue - stability);
683 current_residue = (lNode - lParent);
686 stability = 1 - ((aParent - aNode) * 1.0 / (aParent));
687 stab_residue = round(current_residue * stability);
688 }
else if (method == 2) {
691 if (current_residue > relativeGrowthRate) {
692 stab_residue = round(current_residue - relativeGrowthRate);
697 else if (method == 3) {
698 stability = factor * (((aParent - aNode) * 1.0 / (aParent)));
699 if (current_residue > stability) {
700 stab_residue = round(current_residue - stability);
706 std::cout <<
"ERROR UNKOWN METHOD\n";
710 transformee_node[node] = transformee_node[nParent];
711 indicatrice_node[node] = indicatrice_node[nParent];
714 if (stab_residue > transformee_node[node] && stab_residue >
threshold &&
717 transformee_node[node] = stab_residue;
719 if (!(isPrevMaxT && flag)) {
720 indicatrice_node[node] = hNode + 1;
724 indicatrice_node[node] = 0;
726 child = tree.getChild(node);
728 if (flag && (hNode < stop)) {
729 ComputeDeltaUOMSER(tree, transformee_node, indicatrice_node, child,
730 node, first_ancestor, stop, delta, method, isMaxT,
733 ComputeDeltaUOMSER(tree, transformee_node, indicatrice_node, child,
734 node, nParent, stop, delta, method, isMaxT, minArea,
737 child = tree.getBrother(child);
741 inline void computeFillAspectRatioFactor(UINT wNode, UINT cNode, UINT
area,
742 UINT width, UINT height,
743 float &fillRatio,
float &AspectRatio)
747 minHW = MIN(wNode, cNode);
748 maxHW = MAX(wNode, cNode);
749 fillRatio =
area * 1.0 / (wNode * cNode * 1.0);
750 AspectRatio = minHW * 1.0 / maxHW;
752 if (AspectRatio <= 0.4)
755 AspectRatio =
std::pow(AspectRatio, 1.0 / 3);
757 if (fillRatio <= 0.2 || fillRatio >= 0.9)
760 fillRatio = abs(fillRatio - 0.55);
761 fillRatio =
std::pow((1.0 - (fillRatio * 1.0 / 0.35)), 1.0 / 3);
764 if (AspectRatio <= 0.4 && fillRatio >= 0.4) {
769 if (area < 20 || area > (0.9 * width * height) || cNode < 5) {
779 template <
class T,
class CriterionT,
class Offset_T,
class Label_T,
782 T *transformee_node, Attr_T *indicatrice_node,
783 int node,
int nParent,
int first_ancestor,
784 Attr_T stop, UINT delta,
int isPrevMaxT)
794 T current_residue, stab_residue;
795 UINT hNode, hParent, wNode;
796 size_t aNode, aParent, aAncestor;
797 T lNode, lParent, lAncestor;
800 float stability, fillRatio, AspectRatio, fac;
802 hNode = tree.getCriterion(node).getAttributeValue().H;
803 wNode = tree.getCriterion(node).getAttributeValue().W;
804 aNode = tree.getCriterion(node).getAttributeValue().A;
805 lNode = tree.getLevel(node);
807 hParent = tree.getCriterion(nParent).getAttributeValue().H;
812 aParent = tree.getCriterion(nParent).getAttributeValue().A;
813 aAncestor = tree.getCriterion(first_ancestor).getAttributeValue().A;
814 lParent = tree.getLevel(nParent);
815 lAncestor = tree.getLevel(first_ancestor);
818 if ((hParent - hNode) <= delta) {
822 computeFillAspectRatioFactor(wNode, hNode, aNode, tree.getImWidth(),
823 tree.getImHeight(), fillRatio, AspectRatio);
827 std::pow((1.0 - ((aAncestor - aNode) * 1.0 / aAncestor)), 1.0 / 3);
828 fac = (stability * AspectRatio * fillRatio);
829 current_residue = lNode - lAncestor;
830 stab_residue = round(current_residue * fac);
833 std::pow((1.0 - ((aParent - aNode) * 1.0 / aParent)), 1.0 / 3);
834 fac = (stability * AspectRatio * fillRatio);
835 current_residue = (lNode - lParent);
836 stab_residue = round(current_residue * fac);
839 transformee_node[node] = transformee_node[nParent];
840 indicatrice_node[node] = indicatrice_node[nParent];
844 if (stab_residue > transformee_node[node]) {
846 transformee_node[node] = stab_residue;
848 if (!(isPrevMaxT && flag)) {
849 indicatrice_node[node] = hNode + 1;
853 indicatrice_node[node] = 0;
855 child = tree.getChild(node);
857 if (flag && (hNode < stop)) {
859 node, first_ancestor, stop, delta, isMaxT);
862 node, nParent, stop, delta, isMaxT);
864 child = tree.getBrother(child);
868 template <
class T1,
class T2>
869 void compute_contrast_MSER(MaxTree2<T1, HWACriterion, size_t, UINT32> &tree,
870 T1 *transformee_node, T2 *indicatrice_node,
871 UINT32 root, T2 stopSize, UINT delta = 0,
872 UINT method = 2, UINT minArea = 0,
873 T1
threshold = 0,
bool use_textShape = 0)
878 transformee_node[root] = 0;
879 indicatrice_node[root] = 0;
884 child = tree.getChild(root);
891 for (mynode = 0; mynode < tree.getLabelMax(); mynode++) {
892 mylevel = tree.getLevel(mynode);
893 if (mylevel > mymax) {
897 std::cout <<
"mymax=" << mymax <<
"\n";
901 ComputeDeltaUOMSER(tree, transformee_node, indicatrice_node, child,
903 stopSize , delta, method, 0 ,
909 stopSize , delta, 0 );
911 child = tree.getBrother(child);
917 template <
class T1,
class T2>
918 RES_T ultimateOpenMSER(
const Image<T1> &imIn, Image<T1> &imTrans,
919 Image<T2> &imIndic,
const StrElt &se = DEFAULT_SE,
920 T2 stopSize = 0, UINT delta = 0, UINT method = 2,
922 bool use_textShape = 0)
924 ASSERT_ALLOCATED(&imIn, &imTrans, &imIndic);
925 ASSERT_SAME_SIZE(&imIn, &imTrans, &imIndic);
927 int imSize = imIn.getPixelCount();
928 UINT *img_eti =
new UINT[imSize]();
930 MaxTree2<T1, HWACriterion> tree;
931 int root = tree.build(imIn, img_eti, se);
934 stopSize = imIn.getHeight() - 1;
937 T1 *transformee_node =
new T1[tree.getLabelMax()]();
938 T2 *indicatrice_node =
new T2[tree.getLabelMax()]();
940 compute_contrast_MSER(tree, transformee_node, indicatrice_node, root,
941 stopSize, delta, method, minArea,
threshold,
944 typename ImDtTypes<T1>::lineType transformeePix = imTrans.getPixels();
945 typename ImDtTypes<T2>::lineType indicatricePix = imIndic.getPixels();
947 for (
int i = 0; i < imSize; i++) {
948 transformeePix[i] = transformee_node[img_eti[i]];
949 indicatricePix[i] = indicatrice_node[img_eti[i]];
953 delete[] transformee_node;
954 delete[] indicatrice_node;
964 template <
class T,
class CriterionT,
class Offset_T,
class Label_T,
966 void processMaxTree(MaxTree2<T, CriterionT, Offset_T, Label_T> &tree,
967 Label_T node, T *lut_out, T previousLevel, Attr_T stop)
971 T nodeLevel = tree.getLevel(node);
973 T currentLevel = (tree.getCriterion(node).getAttributeValue() < stop)
977 lut_out[node] = currentLevel;
979 child = tree.getChild(node);
981 processMaxTree(tree, child, lut_out, currentLevel, stop);
982 child = tree.getBrother(child);
986 template <
class T,
class CriterionT,
class Offset_T,
class Label_T,
989 compute_AttributeOpening(MaxTree2<T, CriterionT, Offset_T, Label_T> &tree,
990 T *lut_node, Label_T root, Attr_T stopSize)
994 lut_node[root] = tree.getLevel(root);
1007 child = tree.getChild(root);
1009 while (child != 0) {
1010 processMaxTree(tree, child, lut_node, tree.getLevel(root), stopSize);
1011 child = tree.getBrother(child);
1016 template <
class T,
class CriterionT,
class Offset_T = size_t,
1017 class Label_T = UINT32>
1018 RES_T attributeOpen(
const Image<T> &imIn, Image<T> &imOut,
size_t stopSize,
1021 ASSERT_ALLOCATED(&imIn, &imOut);
1022 ASSERT_SAME_SIZE(&imIn, &imOut);
1024 size_t imSize = imIn.getPixelCount();
1025 Label_T *img_eti =
new Label_T[imSize]();
1027 MaxTree2<T, CriterionT> tree;
1028 Label_T root = tree.build(imIn, img_eti, se);
1038 T *out_node =
new T[tree.getLabelMax()]();
1040 compute_AttributeOpening(tree, out_node, root, stopSize);
1042 typename ImDtTypes<T>::lineType outPix = imOut.getPixels();
1044 for (
size_t i = 0; i < imSize; i++)
1045 outPix[i] = out_node[img_eti[i]];
1069 const StrElt &se = DEFAULT_SE)
1071 return attributeOpen<T, HeightCriterion>(imIn, imOut, stopSize, se);
1086 const StrElt &se = DEFAULT_SE)
1088 ASSERT_ALLOCATED(&imIn, &imOut);
1089 ASSERT_SAME_SIZE(&imIn, &imOut);
1095 RES_T res = attributeOpen<T, HeightCriterion>(tmpIm, imOut, stopSize, se);
1113 const StrElt &se = DEFAULT_SE)
1115 return attributeOpen<T, WidthCriterion>(imIn, imOut, stopSize, se);
1130 const StrElt &se = DEFAULT_SE)
1132 ASSERT_ALLOCATED(&imIn, &imOut);
1133 ASSERT_SAME_SIZE(&imIn, &imOut);
1139 RES_T res = attributeOpen<T, WidthCriterion>(tmpIm, imOut, stopSize, se);
1157 const StrElt &se = DEFAULT_SE)
1159 return attributeOpen<T, AreaCriterion>(imIn, imOut, stopSize, se);
1174 const StrElt &se = DEFAULT_SE)
1176 ASSERT_ALLOCATED(&imIn, &imOut);
1177 ASSERT_SAME_SIZE(&imIn, &imOut);
1183 RES_T res = attributeOpen<T, AreaCriterion>(tmpIm, imOut, stopSize, se);
void getCoordsFromOffset(size_t off, size_t &x, size_t &y, size_t &z) const
Get x,y(,z) coordinates for a given offset.
Definition: DBaseImage.h:291
void getSize(size_t *w, size_t *h, size_t *d) const
Get image size.
Definition: DBaseImage.h:118
size_t getWidth() const
Get image width.
Definition: DBaseImage.h:80
size_t getPixelCount() const
Get the number of pixels.
Definition: DBaseImage.h:160
size_t getHeight() const
Get image height.
Definition: DBaseImage.h:85
Definition: DMorphoHierarQ.hpp:143
Definition: DBaseImage.h:386
Main Image class.
Definition: DImage.hpp:57
virtual void modified()
Trigger modified event (allows to force display update)
lineType getPixels() const
Get the pixels as a 1D array.
Definition: DImage.hpp:105
Definition: DMorphoMaxTree.hpp:62
Base structuring element.
Definition: DStructuringElement.h:68
RES_T log(const Image< T1 > &imIn, Image< T2 > &imOut, int base=0)
log() - Logarithm of an image
Definition: DImageArith.hpp:854
RES_T inv(const Image< T > &imIn, Image< T > &imOut)
inv() - Invert an image.
Definition: DImageArith.hpp:70
RES_T pow(const Image< T1 > &imIn, Image< T2 > &imOut, double exponent=2)
pow() - power of an image
Definition: DImageArith.hpp:905
RES_T threshold(const Image< T > &imIn, T minVal, T maxVal, T_out trueVal, T_out falseVal, Image< T_out > &imOut)
threshold() - Image threshold
Definition: DImageHistogram.hpp:269
RES_T widthOpen(const Image< T > &imIn, size_t stopSize, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Image opening based on width attribute.
Definition: DMorphoMaxTree.hpp:1112
RES_T ultimateOpen(const Image< T1 > &imIn, Image< T1 > &imTrans, Image< T2 > &imIndic, const StrElt &se=DEFAULT_SE, T2 stopSize=0, UINT delta=0)
Ultimate Opening using the max-trees.
Definition: DMorphoMaxTree.hpp:556
RES_T areaOpen(const Image< T > &imIn, size_t stopSize, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Image opening based on area attribute.
Definition: DMorphoMaxTree.hpp:1156
RES_T areaClose(const Image< T > &imIn, size_t stopSize, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Image closing based on area attribute.
Definition: DMorphoMaxTree.hpp:1173
RES_T widthClose(const Image< T > &imIn, size_t stopSize, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Image opening based on width attribute.
Definition: DMorphoMaxTree.hpp:1129
void ComputeDeltaUOMSERSC(MaxTree2< T, CriterionT, Offset_T, Label_T > &tree, T *transformee_node, Attr_T *indicatrice_node, int node, int nParent, int first_ancestor, Attr_T stop, UINT delta, int isPrevMaxT)
Definition: DMorphoMaxTree.hpp:781
RES_T heightOpen(const Image< T > &imIn, size_t stopSize, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Image opening based on height attribute.
Definition: DMorphoMaxTree.hpp:1068
RES_T heightClose(const Image< T > &imIn, size_t stopSize, Image< T > &imOut, const StrElt &se=DEFAULT_SE)
Image closing based on height attribute.
Definition: DMorphoMaxTree.hpp:1085
size_t area(const Image< T > &imIn)
area() - Area of an image
Definition: DMeasures.hpp:91
Definition: DTypes.hpp:88