【问题标题】:Seam Carving an image using Dijkstra algorithm in C++在 C++ 中使用 Dijkstra 算法对图像进行接缝雕刻
【发布时间】:2016-04-30 21:18:31
【问题描述】:

我正在尝试使用 Dijkstra 算法实现 Seam 雕刻。

到目前为止,我已经将图像转换为灰度并使用二维数组,我发现了图像的能量函数。现在,为了实现 Dijkstra,我需要将这个 2D 数组转换为图形,并为 Dijsktra 函数提供源和汇。

我想知道如何把这个二维数组变成一个图形,因为二维数组是一个 MxN 的矩阵,其中 M,N 都可以是非常大的数字,可能会产生可能有大量的图表,并为它决定接收器。

【问题讨论】:

    标签: c++ arrays algorithm dijkstra


    【解决方案1】:

    您不必将图像转换为图表。您所要做的就是使用动态编程来计算接缝,然后找到能量最小的接缝。更准确地说,计算 S[i,j](像素 (i,j) 的接缝):

    1. 对于第一行,将能量值指定为像素 S[1,j] = E[1,j] 的接缝值
    2. 对于接下来的行,从像素的邻居向下传播最小接缝: S[i,j] = E[i,j] + min( S[i-1,j-1], S[i-1,j], S[i-1,j+1])

    3. 从 S 的最后一行中具有最小值的元素开始,通过选择具有最小接缝值的邻居向上爬。存储每一步。

    4. 你存储的路径是能量最小的接缝。

    我还找到了一篇很好的文章,用 MATLAB 源代码彻底解释了算法:

    https://kirilllykov.github.io/blog/2013/06/06/seam-carving-algorithm/

    【讨论】:

    • 我之前通过动态编程实现了它。但我在某处读到它也使用 Dijkstra 算法,该算法通常适用于图形。因此,我们必须有某种方法可以获取图表。
    • 这里提到的动态规划方法其实就是Dijkstra算法。看看here,当然还有here。我的回答中提到的S矩阵是distance函数,我们采用的迭代方法计算它,相当于Dijkstra计算节点距离的方法。
    • @ArghyaDutta:乐于助人:)
    猜你喜欢
    • 2013-03-17
    • 2011-11-23
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多