Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在二进制图像中找到连接的组件?_Algorithm_Language Agnostic_Computer Vision_Image Recognition - Fatal编程技术网

Algorithm 如何在二进制图像中找到连接的组件?

Algorithm 如何在二进制图像中找到连接的组件?,algorithm,language-agnostic,computer-vision,image-recognition,Algorithm,Language Agnostic,Computer Vision,Image Recognition,我正在寻找一种算法来找到我的二进制图像中所有连接的组件 如果我们把图像想象成一个矩阵,它看起来像: [ 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

我正在寻找一种算法来找到我的二进制图像中所有连接的组件

如果我们把图像想象成一个矩阵,它看起来像:

[ 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)
我在维基百科上看过这个算法,但我不相信它会返回实际的组件——它只是标记不同的组件。(或者这是同一个?)

如果可能,这应该能够针对视频流实时运行。

下面是一个简单的代码(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,并且我做了一些事情来避免处理那些恼人的阵列出站问题,您可以查看一下:)

#包括
#包括
#包括
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};
无效dfs(整数x、整数y、整数c){
w[x][y]=c;

对于(int i=0;两次通过就可以了。一旦你把它们都标记好,只需对它们进行迭代,然后按标签将它们添加到单独的列表中。本质上,做三次通过:)查找我的想法是连接组件标记(CCL)很好,@Geobits是对的,一旦你得到了这些组件的标签,后处理就不是问题了(在复杂性方面)。我想的是,实际上CCL似乎有点过分了。。这不是一个简单的DFS可以标记所有具有相同复杂性的组件吗?@shole By DFS,你的意思是深度优先搜索?我如何将图像放入图中来执行DFS?@JimMischel如何对多个组件执行泛洪填充?
#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;
}