Seam在C ++中使用Dijkstra算法雕刻图像

时间:2016-04-30 21:18:31

标签: c++ arrays algorithm dijkstra

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

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

我想知道如何将这个2D数组更改为图形,因为2D数组是MxN的矩阵,其中M,N都可以是非常大的数字,可能会增加可能有大量的图表,并决定它的下沉。

1 个答案:

答案 0 :(得分:0)

您不必将图片转换为图表。您所要做的就是使用动态编程来计算接缝,然后以最小的能量找到接缝。更准确地说,计算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. 您存储的路径是能量最少的接缝。

  5. 我也找到了一篇很好的文章,用MATLAB源代码详细解释了算法:

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