2016-04-30 64 views
1

我正在尝试使用Dijkstra算法来实现Seam雕刻。Seam使用Dijkstra算法在C++中雕刻图像

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

我想知道如何改变这个二维数组成图形,作为二维数组,是墨西哥比索,其中M,N既可以是非常巨大的数字矩阵,可能会引起可能是一个巨大的可能的图表数量,并决定它的接收器。

回答

0

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

  1. 对于第一行,将能量值分配为像素S [1,j ] = E [1,j]的
  2. 在接下来的行中,从像素向下的邻居传播最小接缝:S [I,J] = E [I,J] +分钟(S [I-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/

+0

。但是我在某处读到它也使用了Dijkstra的算法,它通常用于图表。所以,我们必须通过某种方式获得图表。 –

+0

这里提到的动态规划方法其实就是Dijkstra算法。看看[这里](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Dynamic_programming_perspective),当然[这里](https://math.stackexchange.com/questions/1283042/what-is-的差 - 之间-dijkstras法和动态编程-当网络连接)。在我的答案中提到的'S'矩阵是_distance_函数和我们用来计算它的迭代方法,相当于Dijkstra计算节点距离的方法。 – Isaac

+1

好的!我得到了我失踪的观点!非常感谢! –