在C ++中查找和存储超像素邻域的算法和数据结构

时间:2012-12-18 11:57:03

标签: c++ data-structures boost-graph

我有一个图像,保存分段结果,就像这个。enter image description here

我需要建立一个贴片附近的图形,用不同颜色着色。 因此,我想要一个结构,代表以下内容 enter image description here

这里的数字表示单独的补丁,而线条表示补丁的邻域。 目前我无法弄清楚从哪里开始,谷歌有哪些关键词。

有人可以提出任何有用的建议吗?

图像存储在OpenCV的cv :: Mat类中,对于图形,我打算使用Boost.Graph库。

所以,请给我一些代码示例和算法或关键字的链接。

感谢。

更新即可。 在喝咖啡休息和一些讨论后,我想到了以下几点。

  1. 构建一个大的点阵图,其中每个节点对应于每个图像像素,链接连接8个或4个邻居。
  2. 使用相应的像素值标记每个图形节点。
  3. 尝试以某种方式合并具有相同标签的节点。
  4. 我的另一个问题是我不熟悉BGL(但是这本书正在发布:)。)

    那么,您如何看待这个解决方案?

    UPDATE2 可能这个link可以提供帮助。

    然而,仍未找到解决方案。

3 个答案:

答案 0 :(得分:5)

你可以这样解决:

  1. 定义区域(图表中的数字)

    • 制作一个存储区号
    • 的二维数组
    • 从(0/0)开始并将其设置为1(区域编号)
    • 使用floodfill算法或其他东西将整个区域设置为1。
    • 在洪水填充期间,您可能会遇到具有不同颜色的坐标。将那些存储在队列中。如果您之前的填充完成,请从这些坐标开始填充并增加区域编号。

  2. 在区域之间建立链接

    • 遍历您的2D阵列。
    • 如果您有相邻的号码,请存储号码对(可能以排序的方式,您还必须检查该号码对是否已存在)。如果你从左向右前进,你只需要检查下面的元素,右边和右边的一个对角线。
  3. 虽然我不得不承认我对这个话题一无所知..只是我的简单想法..

答案 1 :(得分:2)

您可以使用BFS标记区域。

要将cv :: Mat暴露给BGL,你应该编写很多代码。我认为编写自己的bfs要简单得多。

比你每两个偶像都要将他们的分数写到std::set<std::pair<mark_t, mark_t>>。 而不是从那里建立图表。

答案 2 :(得分:0)

我认为如果你的色块是随机的,你可能需要一个强力算法来做你想要的。一个想法可能是:

  • 做第一次蛮力通过。这必须识别所有补丁。例如,制作一个与图像大小相同的矩阵A,并将其初始化为0.对于仍为零的每个像素,从它开始并将其标记为新的补丁,并尝试使用强力方法来查找整个补丁的范围。然后,每个矩阵单元的值将等于其中的补丁编号。
  • 补丁号码必须为2^N,例如1,2,4,8 ......
  • 制作另一个图像大小的矩阵B,但每个单元格保存两个值。这将代表像素之间的连接。对于矩阵B的每个单元,第一值将是像素中的块编号与相邻像素的块编号之间的绝对差。第一个值是与下面的像素的差异,第二个值是左边的像素。
  • 选择矩阵B中的所有唯一值,即可实现所有连接。

这是有效的,因为补丁号之间的每个差异都是唯一的。例如,如果在B中你最终得到数字3,6,7,则意味着补丁(4,1),(8,2)和(8,1)之间存在联系。值0当然意味着同一个补丁中有两个像素彼此相邻,所以你只需忽略它们。