Frage

Wie kann ich Segment ein 2D-Bild in Blobs von ähnlichen Werten effizient? Die gegebene Eingabe ist ein Array von n ganzer Zahl, die für nicht-Farbton graue Pixel und die Helligkeit des Graupixels enthält.

Ich schreibe einen virtuellen mobilen Roboter mit Hilfe von Java, und ich bin mit der Segmentierung die Karte und auch das Bild von der Kamera zu analysieren. Dies ist ein bekanntes Problem in Computer Vision , aber wenn es an einem Roboter Leistung ist nicht egal so wollte ich einige Eingaben. Algorithmus ist das, was zählt, so dass Sie Code in jeder beliebigen Sprache veröffentlichen können.

War es hilfreich?

Lösung

Ich würde heruntergerechnet, in Farbraum und in der Anzahl der Pixel, eine Vision-Methode verwenden (wahrscheinlich Mean-Shift) und gehobene das Ergebnis aus.

Das ist gut, weil Abwärtsabtastens auch die Robustheit gegenüber Rauschen erhöht und macht es wahrscheinlicher, dass Sie aussagekräftige Segmente erhalten.

könnten Sie verwenden Floodfill Kanten danach zu glätten, wenn Sie Glätte müssen.

Einige weitere Gedanken (als Antwort auf Ihren Kommentar).

1) Haben Sie mischen, wie Sie heruntergetasteten? y [i] = (x [2i] + x [2i + 1]) / 2 Dies sollte Rauschen eliminieren.

2) Wie schnell wollen Sie es sein?

3) Haben Sie dynamische Mean-Shift versucht? (Auch für alle Algorithmen x für dynamische x google)

Andere Tipps

Nicht sicher, ob es zu effizient ist, aber man könnte versuchen, ein Kohonen neuronale Netzwerk (oder selbstorganisierenden Karte; SOM). gruppiert die ähnlichen Werte, wobei jedes pixel die ursprüngliche Farbe und die Position und nur die Farbe enthält, wird für die Gruppierung verwendet Kohohen

Sie sollten lesen, bevor Sie dies obwohl implementieren, da mein Wissen über das Kohonen-Netz soweit geht, dass es für die Gruppierung der Daten verwendet wird - so weiß ich nicht, was die Leistung / Zuverlässigkeit Optionen für Ihr Szenario sind <. / p>

Es gibt auch Hopfieldnetze . Sie können in Gruppierung verstümmelt werden von dem, was ich gelesen hatte.

Was habe ich jetzt:

  1. Erstellen Sie einen Puffer von der gleichen Größe wie das Eingangsbild, initialisiert UNSEGMENTED.
  2. Für jedes Pixel in dem Bild, in dem der entsprechenden Pufferwert nicht UNSEGMENTED, überflutet die Puffer des Pixelwerts verwendet wird.

    a. Die Grenze Überprüfung der Flutung erfolgt durch Prüfen, ob Pixel innerhalb EPSILON (derzeit auf 10) des Ursprungspixelwert ist.

    b. Flood Füllung Algorithmus .

Mögliche Ausgabe:

Die Grenzprüfung des 2.a wird viele Male in der Flut Füllung Algorithmus genannt. Ich konnte es in eine Lookup machen, wenn ich die Grenze mit Kantenerkennung vorauszuberechnen könnte, aber das kann mehr Zeit als Stromprüfung hinzuzufügen.

private boolean isValuesCloseEnough(int a_lhs, int a_rhs) {
    return Math.abs(a_lhs - a_rhs) <= EPSILON;
}

Mögliche Erweiterung:

Statt jedes einzelne Pixel für UNSEGMENTED Kontrolle, konnte ich zufällig ein paar Punkte holen. Wenn Sie erwarten rund 10 Blobs, Kommissionierung zufällige Punkte in dieser Reihenfolge ausreichen. Nachteil ist, dass Sie vielleicht einen nützlichen, aber kleinen Klecks entgehen lassen.

Überprüfen Sie heraus Eyepatch (eyepatch.stanford.edu). Es sollten Sie während der Untersuchungsphase helfen, indem sie eine Vielzahl von möglichen Filter für die Segmentierung bereitgestellt wird.

Eine Alternative zu überschwemmen-Fill ist der connnected-Komponenten Algorithmus. Also,

  1. Cheaply Ihre Pixel klassifizieren. z.B. dividieren Pixel im Farbraum.
  2. Führen Sie das cc die Blobs finden
  3. Bewahren Sie die Blobs von signifikanter Größe

Dieser Ansatz ist weit verbreitet in der frühen Vision Ansätzen verwendet. Zum Beispiel in dem Samenpapier „ Blobworld: Ein System zur Region basierte Bild Indexing and Retrieval “.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top