24 (*dilated)[0] = bitmap[0] || bitmap[1] || bitmap[uextent] || bitmap[uextent + 1];
27 (*dilated)[0] || bitmap[(vextent - 1) * uextent] || bitmap[(vextent - 1) * uextent + 1];
29 (*dilated)[0] = (*dilated)[0] || bitmap[uextent - 1] || bitmap[2 * uextent - 1];
31 (*dilated)[0] = (*dilated)[0] || bitmap[(vextent - 1) * uextent + uextent - 1];
35 for (
size_t i = 1; i < uextent - 1; ++i)
37 (*dilated)[i] = bitmap[i - 1] || bitmap[i] || bitmap[i + 1] ||
38 bitmap[uextent + i - 1] || bitmap[uextent + i] ||
39 bitmap[uextent + i + 1];
44 for (
size_t i = 1; i < uextent - 1; ++i)
46 (*dilated)[i] = bitmap[i - 1] || bitmap[i] || bitmap[i + 1] ||
47 bitmap[uextent + i - 1] || bitmap[uextent + i] ||
48 bitmap[uextent + i + 1] || bitmap[(vextent - 1) * uextent + i - 1] ||
49 bitmap[(vextent - 1) * uextent + i] ||
50 bitmap[(vextent - 1) * uextent + i + 1];
54 (*dilated)[uextent - 1] = bitmap[uextent - 1] || bitmap[uextent - 2] ||
55 bitmap[2 * uextent - 1] || bitmap[2 * uextent - 2];
57 (*dilated)[uextent - 1] = (*dilated)[uextent - 1] || bitmap[vextent * uextent - 1] ||
58 bitmap[vextent * uextent - 2];
60 (*dilated)[uextent - 1] = (*dilated)[uextent - 1] || bitmap[uextent] || bitmap[0];
62 (*dilated)[uextent - 1] = (*dilated)[uextent - 1] || bitmap[(vextent - 1) * uextent];
63 size_t row = 0, prevRow, nextRow = uextent;
64 for (
size_t j = 1; j < vextent - 1; ++j)
68 nextRow = row + uextent;
70 (*dilated)[row] = bitmap[prevRow] || bitmap[prevRow + 1] || bitmap[row] ||
71 bitmap[row + 1] || bitmap[nextRow] || bitmap[nextRow + 1];
73 (*dilated)[row] = (*dilated)[row] || bitmap[row - 1] || bitmap[nextRow - 1] ||
74 bitmap[nextRow + uextent - 1];
75 for (
size_t i = 1; i < uextent - 1; ++i)
78 bitmap[prevRow + i - 1] || bitmap[prevRow + i] || bitmap[prevRow + i + 1] ||
79 bitmap[row + i - 1] || bitmap[row + i] || bitmap[row + i + 1] ||
80 bitmap[nextRow + i - 1] || bitmap[nextRow + i] || bitmap[nextRow + i + 1];
83 (*dilated)[row + uextent - 1] =
84 bitmap[prevRow + uextent - 2] || bitmap[prevRow + uextent - 1] ||
85 bitmap[row + uextent - 2] || bitmap[row + uextent - 1] ||
86 bitmap[nextRow + uextent - 2] || bitmap[nextRow + uextent - 1];
88 (*dilated)[row + uextent - 1] =
89 (*dilated)[row + uextent - 1] || bitmap[prevRow] || bitmap[row] || bitmap[nextRow];
92 (*dilated)[(vextent - 1) * uextent] =
93 bitmap[(vextent - 1) * uextent] || bitmap[(vextent - 1) * uextent + 1] ||
94 bitmap[(vextent - 2) * uextent] || bitmap[(vextent - 2) * uextent + 1];
96 (*dilated)[(vextent - 1) * uextent] =
97 (*dilated)[(vextent - 1) * uextent] || bitmap[0] || bitmap[1];
99 (*dilated)[(vextent - 1) * uextent] = (*dilated)[(vextent - 1) * uextent] ||
100 bitmap[vextent * uextent - 1] ||
101 bitmap[(vextent - 1) * uextent - 1];
103 (*dilated)[(vextent - 1) * uextent] =
104 (*dilated)[(vextent - 1) * uextent] || bitmap[uextent - 1];
108 for (
size_t i = 1; i < uextent - 1; ++i)
110 (*dilated)[(vextent - 1) * uextent + i] =
111 bitmap[(vextent - 1) * uextent + i] || bitmap[(vextent - 1) * uextent + i - 1] ||
112 bitmap[(vextent - 1) * uextent + i + 1] || bitmap[(vextent - 2) * uextent + i] ||
113 bitmap[(vextent - 2) * uextent + i - 1] || bitmap[(vextent - 2) * uextent + i + 1];
118 for (
size_t i = 1; i < uextent - 1; ++i)
120 (*dilated)[(vextent - 1) * uextent + i] =
121 bitmap[(vextent - 1) * uextent + i] || bitmap[(vextent - 1) * uextent + i - 1] ||
122 bitmap[(vextent - 1) * uextent + i + 1] || bitmap[(vextent - 2) * uextent + i] ||
123 bitmap[(vextent - 2) * uextent + i - 1] ||
124 bitmap[(vextent - 2) * uextent + i + 1] || bitmap[i - 1] || bitmap[i] ||
129 (*dilated)[bitmap.
size() - 1] = bitmap[bitmap.
size() - 1] || bitmap[bitmap.
size() - 2] ||
130 bitmap[bitmap.
size() - uextent - 1] ||
131 bitmap[bitmap.
size() - uextent - 2];
133 (*dilated)[bitmap.
size() - 1] =
134 (*dilated)[bitmap.
size() - 1] || bitmap[uextent - 1] || bitmap[uextent - 2];
136 (*dilated)[bitmap.
size() - 1] = (*dilated)[bitmap.
size() - 1] ||
137 bitmap[bitmap.
size() - uextent] ||
138 bitmap[bitmap.
size() - 2 * uextent];
140 (*dilated)[bitmap.
size() - 1] = (*dilated)[bitmap.
size() - 1] || bitmap[0];
152 (*dilated)[0] = bitmap[0] || bitmap[1] || bitmap[uextent];
154 (*dilated)[0] = (*dilated)[0] || bitmap[(vextent - 1) * uextent];
157 (*dilated)[0] = (*dilated)[0] || bitmap[uextent - 1];
162 for (
size_t i = 1; i < uextent - 1; ++i)
164 (*dilated)[i] = bitmap[i - 1] || bitmap[i] || bitmap[i + 1] || bitmap[uextent + i];
169 for (
size_t i = 1; i < uextent - 1; ++i)
171 (*dilated)[i] = bitmap[i - 1] || bitmap[i] || bitmap[i + 1] || bitmap[uextent + i] ||
172 bitmap[(vextent - 1) * uextent + i];
176 (*dilated)[uextent - 1] = bitmap[uextent - 1] || bitmap[uextent - 2] || bitmap[2 * uextent - 1];
178 (*dilated)[uextent - 1] = (*dilated)[uextent - 1] || bitmap[vextent * uextent - 1];
181 (*dilated)[uextent - 1] = (*dilated)[uextent - 1] || bitmap[0];
183 size_t row = 0, prevRow, nextRow = uextent;
184 for (
size_t j = 1; j < vextent - 1; ++j)
188 nextRow = row + uextent;
190 (*dilated)[row] = bitmap[prevRow] || bitmap[row] || bitmap[row + 1] || bitmap[nextRow];
193 (*dilated)[row] = (*dilated)[row] || bitmap[nextRow - 1];
195 for (
size_t i = 1; i < uextent - 1; ++i)
197 (*dilated)[row + i] = bitmap[prevRow + i] || bitmap[row + i - 1] || bitmap[row + i] ||
198 bitmap[row + i + 1] || bitmap[nextRow + i];
201 (*dilated)[row + uextent - 1] = bitmap[prevRow + uextent - 1] ||
202 bitmap[row + uextent - 2] || bitmap[row + uextent - 1] ||
203 bitmap[nextRow + uextent - 1];
205 (*dilated)[row + uextent - 1] = (*dilated)[row + uextent - 1] || bitmap[row];
208 (*dilated)[(vextent - 1) * uextent] = bitmap[(vextent - 1) * uextent] ||
209 bitmap[(vextent - 1) * uextent + 1] ||
210 bitmap[(vextent - 2) * uextent];
212 (*dilated)[(vextent - 1) * uextent] = (*dilated)[(vextent - 1) * uextent] || bitmap[0];
214 (*dilated)[(vextent - 1) * uextent] =
215 (*dilated)[(vextent - 1) * uextent] || bitmap[vextent * uextent - 1];
219 for (
size_t i = 1; i < uextent - 1; ++i)
221 (*dilated)[(vextent - 1) * uextent + i] =
222 bitmap[(vextent - 1) * uextent + i] || bitmap[(vextent - 1) * uextent + i - 1] ||
223 bitmap[(vextent - 1) * uextent + i + 1] || bitmap[(vextent - 2) * uextent + i];
228 for (
size_t i = 1; i < uextent - 1; ++i)
230 (*dilated)[(vextent - 1) * uextent + i] =
231 bitmap[(vextent - 1) * uextent + i] || bitmap[(vextent - 1) * uextent + i - 1] ||
232 bitmap[(vextent - 1) * uextent + i + 1] || bitmap[(vextent - 2) * uextent + i] ||
237 (*dilated)[bitmap.
size() - 1] = bitmap[bitmap.
size() - 1] || bitmap[bitmap.
size() - 2] ||
238 bitmap[bitmap.
size() - uextent - 1];
240 (*dilated)[bitmap.
size() - 1] = (*dilated)[bitmap.
size() - 1] || bitmap[uextent - 1];
242 (*dilated)[bitmap.
size() - 1] =
243 (*dilated)[bitmap.
size() - 1] || bitmap[bitmap.
size() - uextent];
267 (*eroded)[0] = bitmap[0] && bitmap[1] && bitmap[uextent] && bitmap[uextent + 1] &&
268 bitmap[(vextent - 1) * uextent] && bitmap[(vextent - 1) * uextent + 1] &&
269 bitmap[uextent - 1] && bitmap[2 * uextent - 1] &&
270 bitmap[(vextent - 1) * uextent + uextent - 1];
277 for (
size_t i = 1; i < uextent - 1; ++i)
287 for (
size_t i = 1; i < uextent - 1; ++i)
289 (*eroded)[i] = bitmap[i - 1] && bitmap[i] && bitmap[i + 1] && bitmap[uextent + i - 1] &&
290 bitmap[uextent + i] && bitmap[uextent + i + 1] &&
291 bitmap[(vextent - 1) * uextent + i - 1] &&
292 bitmap[(vextent - 1) * uextent + i] &&
293 bitmap[(vextent - 1) * uextent + i + 1];
297 (*eroded)[uextent - 1] =
309 (*eroded)[uextent - 1] = bitmap[uextent - 1] && bitmap[uextent - 2] &&
310 bitmap[2 * uextent - 1] && bitmap[2 * uextent - 2] &&
311 bitmap[vextent * uextent - 1] && bitmap[vextent * uextent - 2] &&
312 bitmap[uextent] && bitmap[0] && bitmap[(vextent - 1) * uextent];
314 size_t row = 0, prevRow, nextRow = uextent;
315 for (
size_t j = 1; j < vextent - 1; ++j)
319 nextRow = row + uextent;
327 (*eroded)[row] = bitmap[prevRow] && bitmap[prevRow + 1] && bitmap[row] &&
328 bitmap[row + 1] && bitmap[nextRow] && bitmap[nextRow + 1] &&
329 bitmap[row - 1] && bitmap[nextRow - 1] &&
330 bitmap[nextRow + uextent - 1];
332 for (
size_t i = 1; i < uextent - 1; ++i)
335 bitmap[prevRow + i - 1] && bitmap[prevRow + i] && bitmap[prevRow + i + 1] &&
336 bitmap[row + i - 1] && bitmap[row + i] && bitmap[row + i + 1] &&
337 bitmap[nextRow + i - 1] && bitmap[nextRow + i] && bitmap[nextRow + i + 1];
340 (*eroded)[row + uextent - 1] =
347 (*eroded)[row + uextent - 1] =
348 bitmap[prevRow + uextent - 2] && bitmap[prevRow + uextent - 1] &&
349 bitmap[row + uextent - 2] && bitmap[row + uextent - 1] &&
350 bitmap[nextRow + uextent - 2] && bitmap[nextRow + uextent - 1] && bitmap[prevRow] &&
351 bitmap[row] && bitmap[nextRow];
355 (*eroded)[(vextent - 1) * uextent] =
369 (*eroded)[(vextent - 1) * uextent] =
370 bitmap[(vextent - 1) * uextent] && bitmap[(vextent - 1) * uextent + 1] &&
371 bitmap[(vextent - 2) * uextent] && bitmap[(vextent - 2) * uextent + 1] && bitmap[0] &&
372 bitmap[1] && bitmap[vextent * uextent - 1] && bitmap[(vextent - 1) * uextent - 1] &&
378 for (
size_t i = 1; i < uextent - 1; ++i)
380 (*eroded)[(vextent - 1) * uextent + i] =
false
392 for (
size_t i = 1; i < uextent - 1; ++i)
394 (*eroded)[(vextent - 1) * uextent + i] =
395 bitmap[(vextent - 1) * uextent + i] && bitmap[(vextent - 1) * uextent + i - 1] &&
396 bitmap[(vextent - 1) * uextent + i + 1] && bitmap[(vextent - 2) * uextent + i] &&
397 bitmap[(vextent - 2) * uextent + i - 1] &&
398 bitmap[(vextent - 2) * uextent + i + 1] && bitmap[i - 1] && bitmap[i] &&
403 (*eroded)[bitmap.
size() - 1] =
false
416 (*eroded)[bitmap.
size() - 1] = bitmap[bitmap.
size() - 1] && bitmap[bitmap.
size() - 2] &&
417 bitmap[bitmap.
size() - uextent - 1] &&
418 bitmap[bitmap.
size() - uextent - 2] && bitmap[uextent - 1] &&
419 bitmap[uextent - 2] && bitmap[bitmap.
size() - uextent] &&
420 bitmap[bitmap.
size() - 2 * uextent] && bitmap[0];
433 (*eroded)[0] = bitmap[0] && bitmap[1] && bitmap[uextent];
435 (*eroded)[0] = (*eroded)[0] && bitmap[(vextent - 1) * uextent];
438 (*eroded)[0] = (*eroded)[0] && bitmap[uextent - 1];
443 for (
size_t i = 1; i < uextent - 1; ++i)
445 (*eroded)[i] = bitmap[i - 1] && bitmap[i] && bitmap[i + 1] && bitmap[uextent + i];
450 for (
size_t i = 1; i < uextent - 1; ++i)
452 (*eroded)[i] = bitmap[i - 1] && bitmap[i] && bitmap[i + 1] && bitmap[uextent + i] &&
453 bitmap[(vextent - 1) * uextent + i];
457 (*eroded)[uextent - 1] = bitmap[uextent - 1] && bitmap[uextent - 2] && bitmap[2 * uextent - 1];
459 (*eroded)[uextent - 1] = (*eroded)[uextent - 1] && bitmap[vextent * uextent - 1];
462 (*eroded)[uextent - 1] = (*eroded)[uextent - 1] && bitmap[0];
464 size_t row = 0, prevRow, nextRow = uextent;
465 for (
size_t j = 1; j < vextent - 1; ++j)
469 nextRow = row + uextent;
471 (*eroded)[row] = bitmap[prevRow] && bitmap[row] && bitmap[row + 1] && bitmap[nextRow];
474 (*eroded)[row] = (*eroded)[row] && bitmap[nextRow - 1];
476 for (
size_t i = 1; i < uextent - 1; ++i)
478 (*eroded)[row + i] = bitmap[prevRow + i] && bitmap[row + i - 1] && bitmap[row + i] &&
479 bitmap[row + i + 1] && bitmap[nextRow + i];
482 (*eroded)[row + uextent - 1] = bitmap[prevRow + uextent - 1] && bitmap[row + uextent - 2] &&
483 bitmap[row + uextent - 1] && bitmap[nextRow + uextent - 1];
485 (*eroded)[row + uextent - 1] = (*eroded)[row + uextent - 1] && bitmap[row];
488 (*eroded)[(vextent - 1) * uextent] = bitmap[(vextent - 1) * uextent] &&
489 bitmap[(vextent - 1) * uextent + 1] &&
490 bitmap[(vextent - 2) * uextent];
492 (*eroded)[(vextent - 1) * uextent] = (*eroded)[(vextent - 1) * uextent] && bitmap[0];
494 (*eroded)[(vextent - 1) * uextent] =
495 (*eroded)[(vextent - 1) * uextent] && bitmap[vextent * uextent - 1];
499 for (
size_t i = 1; i < uextent - 1; ++i)
501 (*eroded)[(vextent - 1) * uextent + i] =
502 bitmap[(vextent - 1) * uextent + i] && bitmap[(vextent - 1) * uextent + i - 1] &&
503 bitmap[(vextent - 1) * uextent + i + 1] && bitmap[(vextent - 2) * uextent + i];
508 for (
size_t i = 1; i < uextent - 1; ++i)
510 (*eroded)[(vextent - 1) * uextent + i] =
511 bitmap[(vextent - 1) * uextent + i] && bitmap[(vextent - 1) * uextent + i - 1] &&
512 bitmap[(vextent - 1) * uextent + i + 1] && bitmap[(vextent - 2) * uextent + i] &&
517 (*eroded)[bitmap.size() - 1] = bitmap[bitmap.size() - 1] && bitmap[bitmap.size() - 2] &&
518 bitmap[bitmap.size() - uextent - 1];
520 (*eroded)[bitmap.size() - 1] = (*eroded)[bitmap.size() - 1] && bitmap[uextent - 1];
522 (*eroded)[bitmap.size() - 1] =
523 (*eroded)[bitmap.size() - 1] && bitmap[bitmap.size() - uextent];
537 if (!tempLabels.
size())
539 tempLabels.
push_back(std::make_pair(0,
size_t(0)));
541 int curLabel = tempLabels.
size() - 1;
542 size_t prevRow, row = 0, nextRow = uextent;
543 for (
size_t j = 1; j < vextent - 1; ++j)
547 nextRow = row + uextent;
548 for (
size_t i = 1; i < uextent - 1; ++i)
550 if (!bitmap[row + i])
552 (*preWrappedComponentsImg)[row + i] = 0;
553 ++tempLabels[0].second;
558 n[0] = (*preWrappedComponentsImg)[prevRow + i - 1];
559 n[1] = (*preWrappedComponentsImg)[prevRow + i];
560 n[2] = (*preWrappedComponentsImg)[prevRow + i + 1];
561 n[3] = (*preWrappedComponentsImg)[row + i - 1];
562 n[4] = (*preWrappedComponentsImg)[row + i + 1];
563 n[5] = (*preWrappedComponentsImg)[nextRow + i - 1];
564 n[6] = (*preWrappedComponentsImg)[nextRow + i];
565 n[7] = (*preWrappedComponentsImg)[nextRow + i + 1];
566 (*preWrappedComponentsImg)[row + i] =
Label(
n, 8, &curLabel, &tempLabels);
571 for (
size_t i = tempLabels.
size() - 1; i > 0; --i)
577 labels->reserve(condensed.
size());
579 for (
size_t i = 0; i < tempLabels.
size(); ++i)
580 if (i == (
size_t)tempLabels[i].first)
582 labels->push_back(std::make_pair(count, tempLabels[i].second));
583 condensed[i] = count;
587 (*labels)[condensed[tempLabels[i].first]].second += tempLabels[i].second;
589 for (
size_t i = 0; i < preWrappedComponentsImg->
size(); ++i)
590 (*preWrappedComponentsImg)[i] = condensed[tempLabels[(*preWrappedComponentsImg)[i]].first];
591 for (
size_t i = 0; i < relabelComponentsImg->
size(); ++i)
592 (*relabelComponentsImg)[i] = condensed[tempLabels[(*relabelComponentsImg)[i]].first];
604 componentsImg->
resize(uextent * vextent);
607 tempLabels.
push_back(std::make_pair(0,
size_t(0)));
616 (*componentsImg)[0] = ++curLabel;
617 tempLabels.
push_back(std::make_pair(curLabel,
size_t(1)));
621 (*componentsImg)[0] = 0;
622 ++tempLabels[0].second;
625 for (
size_t i = 1; i < uextent; ++i)
630 if ((*componentsImg)[i - 1])
632 (*componentsImg)[i] = (*componentsImg)[i - 1];
633 ++tempLabels[(*componentsImg)[i]].second;
637 (*componentsImg)[i] = ++curLabel;
638 tempLabels.
push_back(std::make_pair(curLabel,
size_t(1)));
643 (*componentsImg)[i] = 0;
644 ++tempLabels[0].second;
647 size_t prevRow, row = 0;
648 size_t jend = vwrap ? vextent - 1 : vextent;
649 for (
size_t j = 1; j < jend; ++j)
652 row = prevRow + uextent;
656 if ((*componentsImg)[prevRow])
658 (*componentsImg)[row] = (*componentsImg)[prevRow];
659 ++tempLabels[(*componentsImg)[row]].second;
664 n[0] = (*componentsImg)[prevRow + 1];
667 n[1] = (*componentsImg)[prevRow + uextent - 1];
669 (*componentsImg)[row] =
Label(
n, uwrap ? 2 : 1, &curLabel, &tempLabels);
674 (*componentsImg)[row] = 0;
675 ++tempLabels[0].second;
677 for (
size_t i = 1; i < uextent - 1; ++i)
679 if (!bitmap[row + i])
681 (*componentsImg)[row + i] = 0;
682 ++tempLabels[0].second;
686 n[0] = (*componentsImg)[row + i - 1];
687 n[1] = (*componentsImg)[prevRow + i - 1];
688 n[2] = (*componentsImg)[prevRow + i];
689 n[3] = (*componentsImg)[prevRow + i + 1];
690 (*componentsImg)[row + i] =
Label(
n, 4, &curLabel, &tempLabels);
693 if (!bitmap[row + uextent - 1])
695 (*componentsImg)[row + uextent - 1] = 0;
696 ++tempLabels[0].second;
700 n[0] = (*componentsImg)[row + uextent - 2];
701 n[1] = (*componentsImg)[prevRow + uextent - 2];
702 n[2] = (*componentsImg)[prevRow + uextent - 1];
705 n[3] = (*componentsImg)[prevRow];
706 n[4] = (*componentsImg)[row];
708 (*componentsImg)[row + uextent - 1] =
Label(
n, uwrap ? 5 : 3, &curLabel, &tempLabels);
714 prevRow = (vextent - 2) * uextent;
715 row = (vextent - 1) * uextent;
720 n[0] = (*componentsImg)[prevRow];
721 n[1] = (*componentsImg)[prevRow + 1];
722 n[2] = (*componentsImg)[0];
723 n[3] = (*componentsImg)[1];
726 n[4] = (*componentsImg)[prevRow + uextent - 1];
727 n[5] = (*componentsImg)[uextent - 1];
729 (*componentsImg)[row] =
Label(
n, uwrap ? 6 : 4, &curLabel, &tempLabels);
733 (*componentsImg)[row] = 0;
734 ++tempLabels[0].second;
736 for (
size_t i = 1; i < uextent - 1; ++i)
738 if (!bitmap[row + i])
740 (*componentsImg)[row + i] = 0;
741 ++tempLabels[0].second;
745 n[0] = (*componentsImg)[row + i - 1];
746 n[1] = (*componentsImg)[prevRow + i - 1];
747 n[2] = (*componentsImg)[prevRow + i];
748 n[3] = (*componentsImg)[prevRow + i + 1];
749 n[4] = (*componentsImg)[i - 1];
750 n[5] = (*componentsImg)[i];
751 n[6] = (*componentsImg)[i + 1];
752 (*componentsImg)[row + i] =
Label(
n, 7, &curLabel, &tempLabels);
755 if (!bitmap[row + uextent - 1])
757 (*componentsImg)[row + uextent - 1] = 0;
758 ++tempLabels[0].second;
763 n[0] = (*componentsImg)[row + uextent - 2];
764 n[1] = (*componentsImg)[prevRow + uextent - 2];
765 n[2] = (*componentsImg)[prevRow + uextent - 1];
766 n[3] = (*componentsImg)[uextent - 2];
767 n[4] = (*componentsImg)[uextent - 1];
770 n[5] = (*componentsImg)[prevRow];
771 n[6] = (*componentsImg)[row];
772 n[7] = (*componentsImg)[0];
774 (*componentsImg)[row + uextent - 1] =
Label(
n, uwrap ? 8 : 5, &curLabel, &tempLabels);
778 for (
size_t i = tempLabels.
size() - 1; i > 0; --i)
784 labels->reserve(condensed.
size());
786 for (
size_t i = 0; i < tempLabels.
size(); ++i)
787 if (i == (
size_t)tempLabels[i].first)
789 labels->push_back(std::make_pair(count, tempLabels[i].second));
790 condensed[i] = count;
794 (*labels)[condensed[tempLabels[i].first]].second += tempLabels[i].second;
796 for (
size_t i = 0; i < componentsImg->
size(); ++i)
797 (*componentsImg)[i] = condensed[tempLabels[(*componentsImg)[i]].first];
804 int count = 0, found;
805 for (
int i = 0; i < size; ++i)
816 labels->push_back(std::make_pair(*curLabel,
size_t(1)));
821 ++(*labels)[found].second;
826 ++(*labels)[found].second;
828 for (
int i = 0; i < size; ++i)
830 if (
n[i] &&
n[i] != found)
847 if ((
a == b) || ((*labels)[b].first ==
a))
851 if ((*labels)[b].first == b)
853 (*labels)[b].first =
a;
858 if ((*labels)[b].first >
a)
860 (*labels)[b].first =
a;
868 if (labels[
a].first ==
a)
870 return labels[
a].first;
891 if ((
size_t)startx == uextent)
895 if ((
size_t)starty == vextent)
899 *targetx = (uwrap && (size_t)startx == uextent - 1) ? 0 : startx + 1;
901 return componentImg[starty * uextent + startx] == label &&
902 ((starty > 0 && componentImg[(starty - 1) * uextent + startx] != label) ||
903 (!vwrap && starty == 0) ||
904 (vwrap && starty == 0 && componentImg[(vextent - 1) * uextent + startx] != label));
908 if (!uwrap && startx == 0)
912 *targetx = (startx == 0) ? uextent - 1 : startx - 1;
914 return (!vwrap && (
size_t)starty == vextent &&
915 componentImg[(starty - 1) * uextent + (*targetx)] == label) ||
916 ((
size_t)starty != vextent &&
917 (componentImg[starty * uextent + (*targetx)] != label &&
918 ((starty > 0 && componentImg[(starty - 1) * uextent + (*targetx)] == label) ||
919 (vwrap && starty == 0 &&
920 componentImg[(vextent - 1) * uextent + (*targetx)] == label))));
924 if ((
size_t)starty == vextent)
929 *targety = (vwrap && (size_t)starty == vextent - 1) ? 0 : starty + 1;
930 return (!uwrap && (
size_t)startx == uextent &&
931 componentImg[starty * uextent + (startx - 1)] == label) ||
932 ((size_t)startx != uextent &&
933 (componentImg[starty * uextent + startx] != label &&
934 (((
size_t)startx > 0 && componentImg[starty * uextent + (startx - 1)] == label) ||
935 (uwrap && startx == 0 &&
936 componentImg[starty * uextent + (uextent - 1)] == label))));
940 if (!vwrap && starty == 0)
944 if ((
size_t)startx == uextent)
949 *targety = (starty == 0) ? vextent - 1 : starty - 1;
950 return componentImg[(*targety) * uextent + startx] == label &&
951 ((startx > 0 && componentImg[(*targety) * uextent + (startx - 1)] != label) ||
952 (!uwrap && startx == 0) ||
953 (uwrap && startx == 0 &&
954 componentImg[(*targety) * uextent + (uextent - 1)] != label));
972 int x, y, prevx, prevy;
976 unsigned int edgesExtent[] = {uextent + 1, vextent + 1, 3, 3};
977 edges.
Extent(edgesExtent);
978 bool prevPixelWasWhite =
true;
984 for (; firsti < componentImg.
size(); ++firsti)
986 if (prevPixelWasWhite && componentImg[firsti] == label)
988 prevPixelWasWhite =
false;
989 x = firsti % uextent;
990 y = firsti / uextent;
993 prevPixelWasWhite = componentImg[firsti] != label;
995 if (firsti >= componentImg.
size())
1008 if (componentImg[(vextent - 1) * uextent] == label)
1018 if ((
x > 0 && (
size_t)y < vextent - 1) || (!uwrap && !vwrap) || (vwrap && !uwrap && y == 0))
1022 unsigned int edgeIndex[] = {
x, y, 1, 2};
1023 if (edges.
find(edgeIndex))
1030 else if (uwrap && !vwrap &&
x == 0 && (
size_t)y != vextent - 1)
1033 if (!
IsEdge(componentImg, uextent, vextent, label, uwrap, vwrap,
x, y, 1, 0, &dx, &dy))
1038 unsigned int edgeIndex[] = {
x + 1, y, 0, 1};
1039 if (edges.
find(edgeIndex))
1048 else if (uwrap && !vwrap &&
x == 0 && (
size_t)y == vextent - 1)
1051 if (!
IsEdge(componentImg,
1068 unsigned int edgeIndex[] = {
x + 1, y + 1, 0, 1};
1069 if (edges.
find(edgeIndex))
1077 else if (!uwrap && vwrap && (
size_t)
x == uextent - 1)
1081 if (!
IsEdge(componentImg,
1098 unsigned int edgeIndex[] = {
x + 1, y + 1, 1, 0};
1099 if (edges.
find(edgeIndex))
1112 edges[
x][y][prevx + 1][prevy + 1] =
true;
1119 size_t nextx, nexty;
1121 for (checkEdge = 0; checkEdge < 3; ++checkEdge)
1149 edges[
x][y][prevx + 1][prevy + 1] =
true;
1150 }
while (poly[0] != Vec2(
x, y));
1151 polys->push_back(poly);
1152 }
while (firsti < componentImg.
size());
1154 static int fname_int = 0;
1155 std::ostringstream fn;
1156 fn <<
"ComponentLoopsInput" << fname_int <<
".txt";
1158 file.open(fn.str().c_str(), std::ios::out);
1159 for (
size_t j = 0; j < vextent; ++j)
1161 for (
size_t i = 0; i < uextent; ++i)
1163 file << componentImg[j * uextent + i] ;
1169 std::ostringstream fn2;
1170 fn2 <<
"ComponentLoopsOutput" << fname_int++ <<
".txt";
1171 for (
size_t i = 0; i < polys->size(); ++i)
1172 for (
size_t j = 0; j < (*polys)[i].size(); ++j)
1174 loopsImg[(*polys)[i][j][1] * (uextent + 1) + (*polys)[i][j][0]] = i + 1;
1176 file.open(fn2.str().c_str(), std::ios::out);
1177 for (
size_t j = 0; j < vextent + 1; ++j)
1179 for (
size_t i = 0; i < uextent + 1; ++i)
1181 file << loopsImg[j * (uextent + 1) + i] ;