如何找到二值图像中的连通分量?

2024-02-28

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

如果我们将图像视为矩阵,它看起来像:

[ 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)

我看过两遍贴标 http://en.wikipedia.org/wiki/Connected-component_labeling维基百科上的算法,但我不相信它返回给我实际的组件 - 它只是标记不同的组件。 (或者这个和这个是一样的吗?)

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


下面是一个简单的代码(C++),使用简单的dfs来标记不同的组件,你可以尝试一下。

例如,如果您的标准输入输入是

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找到二值图像中的连通分量? 的相关文章

  • 需要一种将网络块范围折叠为超集范围列表的算法

    我的数学不及格 我需要一种有效的方法将网络范围缩小为超集 例如如果我输入 IP 范围列表 1 1 1 1至2 2 2 5 1 1 1 2至2 2 2 4 10 5 5 5至155 5 5 5 10 5 5 6至10 5 5 7 我想返回以下
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 在数字集合中查找最接近的匹配[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 什么是拉姆达?

    有人可以很好地描述什么是 Lambda 吗 我们为它们设置了一个标签 它们涉及 C 问题的秘密 但我还没有找到一个很好的定义和解释来解释它们是什么 闭包 lambda 和匿名函数不一定是同一件事 匿名函数是任何没有 或者至少不需要 自己名称
  • iphone opencv - 模板匹配

    我已经在我的 iphone 项目中实现了这个 OpenCV 构建 http aptogo co uk 2011 09 opencv framework for ios http aptogo co uk 2011 09 opencv fra
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 如何在 Unity 中对齐“轨道”或模块化对象?

    我正在开发一个简单的游戏 用户可以在其中放置不同但模块化的对象 例如 轨道 道路等 我的问题是 当将一个物体靠近另一个物体时 如何匹配和放置不同的物体 我的第一种方法是为每个模块对象创建一个隐藏的子对象 一个盒子 并将其放在可以放置其他对象
  • 如何衡量字符串的复杂度?

    我有一些长字符串 1 000 000 个字符 每个字符串仅包含定义字母表中的符号 例如 A 1 2 3 示例字符串 string S1 1111111111 meta complexity 0 string S2 1111222333 me
  • 用于计算有向图上非循环路径数量的快速算法

    简而言之 我需要一个fast计算简单有向图中有多少条非循环路径的算法 By simple我的意思是没有自环或多重边的图 Apath可以从任何节点开始 并且必须在没有传出边的节点上结束 一条路径是acyclic如果没有边出现两次 我的图 经验
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 比 BMH (Boyer–Moore–Horspool) 更快的算法

    您会使用哪种算法来搜索短文本中的短子字符串 简而言之 我的意思是子字符串有 5 10 个字符 字符串有 255 个字符 我正在考虑根据输入数据长度选择算法 哪种算法对于较长的输入更好 Try Turbo BM http www igm un
  • 2D形状识别与解析算法

    我正在寻找一种算法 用于从给定的一组 x y 点检测简单形状 如矩形 三角形 正方形和圆形 我还在寻找一种方法 一旦检测到 将路径转换为更干净的形状 我已经查遍了互联网 但没有找到任何 简单 的方法 几乎所有这些对于我的简单实现来说都是高级
  • 依次构建完整的 B 树

    如果我有一组排序的数据 我想以最适合顺序读取和随机查找的方式将其存储在磁盘上 那么 B 树 或其中一个变体 似乎是一个不错的选择 假设该数据集并不全部适合 RAM 问题是可以从一组排序的数据构建完整的 B 树而不进行任何页面拆分吗 这样排序
  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 机器人探索算法

    我正在尝试为机器人设计一种算法 试图找到位于未知位置的旗帜 该旗帜位于一个包含障碍物的世界中 机器人的任务是夺取旗帜并将其带到他的基地 代表他的起始位置 机器人在每一步只能看到有限的邻域 他事先不知道世界是什么样子 但他有无限的内存来存储已
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async

随机推荐

  • 小黄瓜,两种情况可以相互依赖吗

    Scenario1 When a new user clicks on sign up page And provides login ID Then user is signed up and can view profile page
  • Node JS - 将数据从 Busboy 流式传输到 AWS S3

    我正在尝试通过 ec2 将文件上传到 s3 我的第一个方法是 将文件完全上传到 ec2 然后将该文件上传到 s3 这种方法不好 因为从 ec2 到 s3 的传输时间是浪费时间 目前我正在尝试使用服务员上传流 to s3上传流这样上传到 ec
  • 使用 Boost Python 和 std::shared_ptr

    我正在尝试让 Boost Python 与 std shared ptr 很好地配合 目前 我收到此错误 Traceback most recent call last File test py line 13 in
  • C# 中强制垃圾回收的最佳实践

    根据我的经验 似乎大多数人都会告诉您强制垃圾收集是不明智的 但在某些情况下 您正在处理的大型对象并不总是在 0 代中收集 但内存是一个问题 是强制收集可以吗 有这样做的最佳实践吗 最佳实践是不强制进行垃圾回收 根据 MSDN 强制垃圾是可能
  • 谁能推荐一个Java富文本编辑器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 Cloud Endpoints 中的客户端库。 jar 导入不起作用

    我为我的 appengine python 应用程序创建了一个 jar 文件 我已按照以下步骤导入我的库 jar 文件这个例子 https developers google com appengine docs python endpoi
  • Java 中的最终变量操作

    谁能告诉我下面这行在 Java 上下文中的含义是什么 最终变量仍然可以是 被操纵 除非它是不可变的 据我所知 通过将任何变量声明为最终变量 您将无法再次更改它 那么它们的含义是什么不可变的在上面一行 这意味着如果您的最终变量是引用类型 即不
  • nginx:使用环境变量

    我有以下场景 我有一个环境变量 SOME IP已定义并希望在 nginx 块中使用它 参考Nginx 文档 http wiki nginx org CoreModule我用env指令中的nginx conf文件如下 user www dat
  • 媒体基金会 onReadSample 返回的样本大小错误

    我正在致力于将捕获库从 DirectShow 转换为 MediaFoundation 捕获库似乎工作得很好 但我在运行 Windows 8 32 位的平板电脑上遇到集成网络摄像头的问题 枚举捕获格式时 如中所述媒体基金会文档 http ms
  • Visual Studio 2013 中的调用目标引发了异常

    今天我打开的时候Visual Studio 2013 Professional Edition 我得到了错误exception has been thrown by a target of invocation 我也尝试打开ILSpy调试一
  • 更新 RDLC 报告中的数据源

    我正在使用 SQL 视图将数据传递到 RDLC 报告 现在 如果我向 SQL 视图添加一列 如何在 RDLC 报告中获取这个新添加的列 目前 我必须删除 RDLC 数据集并每次创建新的数据集 这根本不可行 希望有人有更好的方法来做到这一点
  • 通过ajax调用将文本加载到textarea中

    我想将从 dB 检索到的一些文本加载到文本区域中 用户点击一个链接 a class editlink href a JQuery 将 ID 传递给 GO PHP editlink click function get go php para
  • spring-data-jpa: ORA-01795: 列表中表达式的最大数量为 1000

    我正在使用 Spring Data JPA 我想从 a 获取 client id 的交易List
  • 修复 IE 错误:总是一个好主意吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Internet Explorer 改进a lot在过去的 3 年里 自 IE 10 以来 IE 已经成为一个相当不错的浏览器 具有良好的性能
  • 如何将日期时间字符串转换为 UTC 以在 Highcharts 上绘制点

    我正在研究 HighCharts 样条不规则数据 这里数据传递为 data Date UTC 1970 9 27 0 Date UTC 1970 10 10 0 6 Date UTC 1970 10 18 0 7 Date UTC 1970
  • jQuery Draggable - 通过单击元素开始拖动元素,无需按住鼠标

    考虑一个基本的 jQuery Draggable 元素 有没有什么方法可以通过单击鼠标开始拖动元素 即 当元素被单击时 它进入拖动状态 并开始跟随鼠标 当再次单击时 它会掉落到原来的位置 如果这无法通过 jQuery 实现 那么是否可以通过
  • PHP启动:无法加载动态库

    我正在尝试使用 Firebird 2 5 2 26539 视窗8 阿帕奇2 2 22 PHP 5 4 10 当我在 php 中启用 firebird 扩展时 extension php interbase dll extension php
  • 如何安装 cython [重复]

    这个问题在这里已经有答案了 在Windows上安装Kivy的过程中 我发现我需要Cython 我尝试使用安装它easy install cython 但这给出了以下错误 error Unable to find vcvarsall bat
  • 年、月、日中 2 天之间的差异[重复]

    这个问题在这里已经有答案了 我需要输出年 月 日中两天的差值 通过时间跨度和减法 我只能得到天数 但是否有可能以年 月和日为单位输出 这是我到目前为止所拥有的 public string Leeftijdsverschil DateTime
  • 如何找到二值图像中的连通分量?

    我正在寻找一种算法来查找二进制图像中的所有连接组件 如果我们将图像视为矩阵 它看起来像 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 我想找到所有接触的 对角线的 以及 在此示例中 只有一个组件 但图像中可