Как найти связанные компоненты в двоичном изображении?
Я ищу алгоритм для поиска всех связанных компонентов в моем двоичном изображении.
Если мы думаем об изображении как о матрице, оно выглядит так:
[ 0 0 0 0 ...
0 0 0 0 ...
0 1 1 1 ...
0 1 0 1 ...
0 1 0 0 ...
...
]
Я хотел бы найти все те, которые касаются (по диагонали, а также). В этом примере есть только один компонент, но в образе могут быть сотни уникальных компонентов.
Image => ALGORITHM => [ [(x,y)], ... ]
# list of lists of coordinates (each shape is a list)
Я посмотрел на два прохода маркировки алгоритм в Википедии, но я не верьте, что он возвращает мне фактические компоненты - он просто помечает отдельные компоненты. (Или это одно и то же?)
Если возможно, это должно быть в состоянии работать в реальном времени на видео.
1 ответов
Ниже приведен простой код (C++), используя простой dfs для обозначения другого компонента, вы можете попробовать его.
например, если вход stdin
4 5
0 0 0 0 1
0 1 1 0 1
0 0 1 0 0
1 0 0 0 1
тогда выход должен быть
Graph:
0 0 0 0 1
0 1 1 0 1
0 0 1 0 0
1 0 0 0 1
Output:
0 0 0 0 1
0 2 2 0 1
0 0 2 0 0
3 0 0 0 4
тот же номер представляет, что ячейка принадлежит тому же компоненту.
Я предполагаю, что все 8-направления принадлежат одному и тому же компоненту, если вы хотите только 4-направления, изменить dx[] и dy []
также я предполагаю, что вход в большинство 200*200, и я сделал что-то, чтобы избежать обработки этих раздражающих такие вопросы, исходящие, вы можете проверить это :)
#include<cstdio>
#include<cstdlib>
#include<cstring>
int g[202][202] = {0};
int w[202][202] = {0};
int dx[8] = {-1,0,1,1,1,0,-1,-1};
int dy[8] = {1,1,1,0,-1,-1,-1,0};
void dfs(int x,int y,int c){
w[x][y] = c;
for(int i=0; i<8;i++){
int nx = x+dx[i], ny = y+dy[i];
if(g[nx][ny] && !w[nx][ny]) dfs(nx,ny,c);
}
}
int main(){
int row, col, set = 1;
scanf("%d%d", &row, &col);
for(int i=1; i<=row; i++) for(int j=1; j<=col; j++) scanf("%d", &g[i][j]);
for(int i=1; i<=row;i++)
for(int j=1; j<=col; j++)
if(g[i][j] && !w[i][j])
dfs(i,j,set++);
printf("Graph:\n");
for(int i=1; i<=row;i++){
for(int j=1; j<=col;j++)
printf("%d ", g[i][j]);
puts("");
}
puts("");
printf("Output:\n");
for(int i=1; i<=row;i++){
for(int j=1; j<=col;j++)
printf("%d ", w[i][j]);
puts("");
}
return 0;
}