7

我有一张图像,包含分割结果,就像这个。在此处输入图像描述

我需要建立一个补丁邻域图,用不同的颜色着色。结果我想要一个结构,代表以下 在此处输入图像描述

这里的数字代表单独的补丁,线代表补丁的邻域。目前我不知道从哪里开始,谷歌要搜索哪些关键字。

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

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

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

谢谢。

更新。在茶歇和一些讨论之后,我想到了以下内容。

  1. 构建一个大点阵图,其中每个节点对应每个图像像素,链接连接 8 个或 4 个邻居。
  2. 用相应的像素值标记每个图形节点。
  3. 尝试以某种方式合并具有相同标签的节点。

我的另一个问题是我不熟悉 BGL(但是这本书正在编写中:))。

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

Update2 可能,此链接可以提供帮助。

但是,仍然没有找到解决方案。

4

3 回答 3

5

你可以这样解决它:

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

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

    .

  2. 建立区域之间的联系

    • 遍历您的二维数组。
    • 如果您有相邻的数字,请存储数字对(可能以排序方式,您还必须检查该对是否已经存在)。如果您从左到右前进,您只需要检查下面的元素,右边和右边的一个对角线。

虽然我不得不承认我对这个话题一无所知..只是我的简单想法..

于 2012-12-18T12:40:58.857 回答
2

您可以使用BFS来标记区域。

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

比你为每两个 negbos 写他们的分数std::set<std::pair<mark_t, mark_t>>。而不是从中构建图表。

于 2012-12-18T12:48:10.213 回答
1

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

  • 做第一次蛮力传球。这必须识别所有补丁。例如,制作一个与图像大小相同的矩阵A,并将其初始化为0。对于每个仍然为零的像素,从它开始并将其标记为新的patch,并尝试使用蛮力方法找到整个补丁的范围。然后,每个矩阵单元的值将等于它所在的块的数量。
  • 补丁号必须是2^N,例如 1, 2, 4, 8, ...
  • 制作另一个图像大小的矩阵 B,但每个单元格包含两个值。这将表示像素之间的连接。对于矩阵 B 的每个单元,第一个值将是像素中的补丁编号与相邻像素的补丁编号之间的绝对差。第一个值是与下方像素的差异,第二个是与左侧像素的差异。
  • 选择矩阵 B 中的所有唯一值,您就有了所有可能的连接。

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

于 2012-12-18T12:47:49.887 回答