【问题标题】:Jgraph: General Traversal & Forest TraversalJgraph:一般遍历和森林遍历
【发布时间】:2018-10-05 04:22:58
【问题描述】:

早上好/下午/晚上好。

所以我们的数据结构课程给了我们一个作业,使用以下算法在 java 中分割灰度图像:

输入:具有 P 个像素和数量 R 的灰度图像
输出:分割成 R 个区域的图像
1. 将图像映射到原始加权图上。
2. 求图的 MST。
3. 在 R – 1 最昂贵的边缘切割 MST。
4. 将平均树顶点权重分配给森林中每棵树中的每个顶点
5. 将分区映射到分割图像上

问题是,他们只是把我们丢在了黑暗中。他们给了我们一个我们完全没有经验(我们从未研究过)的 jgraph 包,实际上是在说“去自学”。没有什么新东西。

我这样做的方法是为顶点对象创建一个类,该类包含像素的坐标以及像素的值,这样我就可以将每个对象都添加到图形和二维数组中。之后,我使用数组在相邻顶点之间添加加权边,因为 java 无法判断图中顶点实际上是没有边的位置。

之后,我使用 Kruskal 的最小生成树的打包方法和一个数组列表来绕过树中边缘权重的受保护状态,如下所示:

ArrayList<WeightedEdge> edgeList = new ArrayList<>(height*width*3);
KruskalMinimumSpanningTree mst4 = new KruskalMinimumSpanningTree(map4);
Set<DefaultWeightedEdge> edges = mst4.getSpanningTree().getEdges();
for (DefaultWeightedEdge edge : edges) {
    edgeList.add(new WeightedEdge(edge, map4.getEdgeWeight(edge)));
}
edgeList.sort(null);

for (int i = 0; i < n; i++) {
    map4.removeEdge(edgeList.get(edgeList.size()-1).getEdge());
}  

所以现在我在图中剪掉了 (R-1) 个最昂贵的边,我应该留下一片森林。这就是我遇到另一个死胡同的地方。如何让程序遍历每棵树?我理解这一点的方式是,我需要一个通用的遍历算法来访问每棵树并将平均值分配给每个顶点。问题?包中没有通用的遍历算法。也没有办法识别单个树。

这个想法很容易在纸上理解和实施,真的。问题仅在于在 java 中实际编码所有这些。

很抱歉,如果这太混乱或太长了,但我只是在我的智慧和物理极限。提前谢谢你。

【问题讨论】:

    标签: java image-processing image-segmentation minimum-spanning-tree jgrapht


    【解决方案1】:

    我是JGraphT 的忠实粉丝,老实说,我认为将它用于您的任务分配非常好。开始需要一些时间,但后来证明它是一个非常好的工具。但是你还需要了解实现算法背后的CS,在不了解理论的情况下使用JGraphT有些困难。

    根据您的任务分配,我不太了解第 1 步(构建原始加权图)。其余的应该可以很好地与 JGraphT 一起使用。

    您使用KruskalMinimumSpanningTree 执行了第 2 步。现在您可以按权重对边进行排序,并从图中删除 R-1 顶部边。

    不过,我建议您首先构建一个新图表来表示计算出的 MST。然后从该图中删除 remove R-1 顶部边缘。有效地将其变成森林。

    如何让程序遍历每棵树?

    使用上一步中的森林,您可以使用ConnectivityInspector 获取连接顶点集的列表。每个集合将包含来自森林中一棵树的顶点。顶点集很容易使用,您不需要任何遍历,只需遍历集合即可。

    【讨论】:

    • 感谢您的回复。构建原始加权图意味着将图像中每个像素的值映射到图上的一个顶点。为了记录,每条边的权重是顶点值之间差异的绝对值。按照您的建议,我设法从 mst 构建了第二个图表。但是我不知道如何使用连接检查器(同样,他们完全把我们留在了黑暗中)来获取树,然后遍历它们。
    • 使用 ConnectivityInspector 很简单: ConnectivityInspector ci=new ConnectivityInspector(myGraph); List> components=ci.connectedSets();
    • 别介意我删除的评论。谢谢你。在你的帮助下,我已经走得很远了。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多