// labeling using depth-first search; non-recursive version;
int GetConnectedComponents(BYTE *image, int w, int h, int *table) {
int label = 0; // starting label = 1;
std::vector<int> stack(w * h);
// initialize the table;
for (int k = w * h; k-->0;)
table[k] = image[k] ? -1: 0; // Foreground = -1; Background = 0;
for (int pos = w * h; pos-->0;) {
if (table[pos] == -1) { // Foreground;
++label; // assign next label;
int top = -1; // stack initialization;
stack[++top] = pos;
while (top >= 0) {
int adj = stack[top--];
int xx = adj % w;
int yy = adj / w;
if (table[adj] == -1) {// Foreground;
table[adj] = label;
// check 4-way connectivity;
if (xx + 1 < w) stack[++top] = adj + 1; //RIGHT;
if (yy + 1 < h) stack[++top] = adj + w; //BOTTOM;
if (yy > 0) stack[++top] = adj - w; //TOP;
if (xx > 0) stack[++top] = adj - 1; //LEFT;
}
}
}
}
return label; // total # of CCs;
};
728x90
'Image Recognition > Fundamental' 카테고리의 다른 글
Zhang-Suen Thinning Algorithm (0) | 2021.02.18 |
---|---|
Is Power of 2 (0) | 2021.02.12 |
Edge and Corner Detection (0) | 2021.01.27 |
점증적인 cosine/sine 값 계산 (0) | 2020.12.28 |
Fast Float Sqrt (0) | 2020.12.27 |