2016-04-30 11 views
1

Ich versuche Seam Carving mit Dijkstra-Algorithmus zu implementieren.Seam Carving ein Bild mit Dijkstra-Algorithmus in C++

Bisher habe ich das Bild in Graustufen konvertiert und mit einem 2D-Array habe ich die Energiefunktion des Bildes herausgefunden. Um nun Dijkstra zu implementieren, muss ich dieses 2D-Array in ein Diagramm umwandeln und der Dijsktra-Funktion eine Quelle und eine Senke geben.

Ich würde gerne wissen, wie zu ändern Sie diese 2D-Array in ein Diagramm, als das 2D-Array, eine Matrix von MxN, wo M, N beide sehr große Zahlen sein können, könnte möglicherweise eine große entstehen Anzahl der Grafiken möglich, und entscheiden Sie die Senke für sie.

Antwort

0

Sie müssen das Bild nicht in ein Diagramm konvertieren. Alles, was Sie tun müssen, ist die dynamische Programmierung, um Nähte zu berechnen und dann die Naht mit minimaler Energie zu finden. Um genauer zu sein, berechnen S [i, j] (Naht für das Pixel (i, j)):

  1. Für die erste Reihe, weist den Energiewert als Nahtwert des Pixel S [1, j ] = E [1, j]
  2. Für die nächsten Zeilen, propagieren Sie die minimale Naht von den Nachbarn des Pixels nach unten: S [i, j] = E [i, j] + min (S [i-1 , j-1], S [i-1, j], S [i-1, j + 1])

  3. Beginnen Sie mit dem Element mit Mindestwert in der letzten Reihe von S und steigen Sie durch Auswahl von Nachbarn auf mit minimalen Nahtwerten. Speichern Sie jeden Schritt.

  4. Der von Ihnen gespeicherte Weg ist die Naht mit minimaler Energie.

ich auch einen schönen Artikel mit erklärt gründlich den Algorithmus mit MATLAB-Quellcode finden haben:

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

+0

ich es früher über dynamische Programmierung implementiert hatte. Aber ich habe irgendwo gelesen, dass es auch den Dijkstra-Algorithmus verwendet, der normalerweise mit Graphen arbeitet. Also muss es einen Weg geben, auf dem wir eine Grafik erhalten können. –

+0

Die hier erwähnte dynamische Programmiermethode _ist_ eigentlich der Dijkstra-Algorithmus. Sehen Sie [hier] (https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Dynamic_programming_perspective) und natürlich [hier] (https://math.stackexchange.com/questions/1283042/what-is- die-Differenz-zwischen-Dijkstras-Methode-und-dynamisch-Programmierung-wann-fi). Die in meiner Antwort erwähnte "S" -Matrix ist die _distance_-Funktion und der iterative Ansatz, den wir zu ihrer Berechnung verwendet haben, ist äquivalent zu Dijkstra's Verfahren zur Berechnung der Entfernung von Knoten. – Isaac

+1

Okay! Ich habe den Punkt, den ich vermisst habe! Danke vielmals! –