【问题标题】:Implementing Kruskal's Algorithm in Python on images在图像上用 Python 实现 Kruskal 算法
【发布时间】:2013-01-17 04:42:22
【问题描述】:

网格使用存储在两个数组中的边来定义图像:

  • h[x][y] 给出从 x,yx+1,y 的边权重
  • v[x][y] 给出从 x,yx,y+1 的边权重

我正在尝试实现 Kruskal 算法。这相当简单——我可以找到implementations online 并复制它们。问题是处理边缘。具体来说;对它们进行排序令人困惑。

有没有更好的方法来专门存储此拍摄的边缘?我希望它们从每个像素到相邻像素。我将图像存储为 i[x][y],边缘权重只是图像值之间的差异。

【问题讨论】:

  • 按原样存储数组有什么问题?您能否解释一下您遇到的缺点,以便我们尝试找到解决方案?
  • 考虑使用networkx。 networkx.lanl.gov/_modules/networkx/algorithms/mst.html。但是对于您的问题,您可以将容器实现为元组(源,目标,成本)或类,字典,命名元组......然后按成本对这些列表进行排序并添加到您的联合查找数据结构中(确保使用路径压缩和按等级联合)一次来源,目的地没有相同的代表

标签: python image algorithm kruskals-algorithm


【解决方案1】:

您需要做的是创建所有边的列表,然后对它们进行排序。为此,您需要定义一个 Edge 类:

class Edge:
    def x
    def y
    def direction
    def weight

然后,解析hv 矩阵并构建edges 列表。最后,它应该有2 * N * M 元素。边缘的方向应为'h''v',具体取决于您解析的矩阵。

如果您不将hv 矩阵用于任何其他目的,则可以完全放弃它们,因为您可以直接从i 矩阵计算边的权重。

最后,为了算法的目的,您需要使用权重作为标准对列表进行排序:

edges.sort(key=weight)

【讨论】:

    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 2019-08-22
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多