【发布时间】: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