Verfolgen Sie eine Isolinie einer teuren 2D-Funktion


10

Ich habe ein ähnliches Problem in der Formulierung wie dieser Beitrag, mit einigen bemerkenswerten Unterschieden:

Welche einfachen Methoden gibt es, um eine 2D-Funktion adaptiv abzutasten?

Wie in diesem Beitrag:

  • Ich habe ein und die Auswertung dieser Funktion ist etwas teuer zu berechnenf(x,y)

Anders als in diesem Beitrag:

  • Ich bin nicht überall daran interessiert, den Wert der Funktion genau zu bestimmen, sondern nur daran, eine einzige Isokontur der Funktion zu finden.

  • Ich kann wichtige Aussagen über die Autokorrelation der Funktion und folglich über das Ausmaß der Glätte machen.

Gibt es eine intelligente Möglichkeit, diese Funktion zu durchlaufen / abzutasten und diese Kontur zu finden?

Mehr Informationen

Die Funktion ist die Berechnung von Haralick-Merkmalen über Pixel, die den Punkt umgeben, und die weiche Klassifizierung durch eine Art Klassifikator / Regressor. Die Ausgabe davon ist eine Gleitkommazahl, die angibt, zu welcher Textur / welchem ​​Material der Punkt gehört. Die Skalierung dieser Zahl kann geschätzte Klassenwahrscheinlichkeiten (SoftSVM oder statistische Methoden usw.) oder etwas wirklich Einfaches wie die Ausgabe einer linearen / logistischen Regression sein. Die Klassifizierung / Regression ist genau und kostengünstig im Vergleich zu der Zeit, die für die Merkmalsextraktion aus dem Bild benötigt wird.N

Statistiken um bedeuten, dass das Fenster typischerweise überlappende Bereiche abtastet und als solche eine signifikante Korrelation zwischen nahegelegenen Abtastwerten besteht. (Etwas, das ich sogar numerisch / symbolisch angehen kann) Folglich kann dies als eine komplexere Funktion von bei der ein größeres eine Schätzung ergibt, die mehr mit der Nachbarschaft zusammenhängt (stark korreliert), und a Ein kleineres ergibt eine variablere, aber lokalere Schätzung. f ( x , y , N ) N N.Nf(x,y,N)NN

Dinge, die ich versucht habe:

  • Brute Computation - Funktioniert gut. 95% korrekte Segmentierung mit konstanter . Die Ergebnisse sehen fantastisch aus, wenn sie danach mit einer Standardmethode konturiert werden. Das dauert ewig . Ich kann die pro Stichprobe berechneten Features vereinfachen, aber im Idealfall möchte ich dies vermeiden, um diesen Code für Bilder mit Texturen allgemein zu halten, deren Unterschiede in verschiedenen Teilen des Feature-Space angezeigt werden. N

  • Dummes Steppen - Machen Sie einen einzelnen Pixel- "Schritt" in jede Richtung und wählen Sie die Bewegungsrichtung basierend auf der Nähe zum Isolinienwert. Immer noch ziemlich langsam, und die Gabelung eines Isolins wird ignoriert. In Bereichen mit flachem Gefälle "wandert" es oder verdoppelt sich auf sich selbst zurück.

Ich denke, ich möchte so etwas wie die im ersten Link vorgeschlagene Unterteilung tun, aber auf Kästchen beschnitten, die die Isoline von Interesse binden. Ich habe das Gefühl, ich sollte auch , aber ich bin mir nicht sicher, wie ich das angehen soll. N


Ich habe genau das gleiche Problem, außer dass es sich um eine Wahrscheinlichkeitsfunktion handelt, die ich konturieren möchte, und sie ist teuer, da ich an jedem Punkt eine Minimierung durchführen muss. Haben Sie Fortschritte gemacht und / oder können Sie darauf hinweisen, wie Sie letztendlich vorgegangen sind?
Adavid

Ich habe gerade die Lösung überprüft, auf die ich konvergiert habe. (siehe unten)
Meawoppl

Antworten:


4

In der Computergrafik gibt es ein Papier mit dem Titel " Provably Good Sampling and Meshing of Surfaces" , das darauf beruht, dass Sie ein Orakel bereitstellen, das alle Schnittpunkte einer Isolinie mit einem bestimmten Liniensegment bestimmt. Damit werden alle Konturen abgetastet, vorausgesetzt, Sie können eine lokale Merkmalsskala (etwa die maximale lokale Krümmung) und einen anfänglichen Satz von Liniensegmenten bereitstellen, die alle Konturen schneiden. Es ist nicht die einfachste Implementierung, da es auf der Berechnung von Delaunay-Triangulationen beruht, aber es ist in 3D in CGAL implementiert . In 2D ist dies wesentlich einfacher, da es eine gute Triangulationssoftware wie Triangle gibt. In gewissem Sinne ist dies ziemlich nahe an dem Besten, was Sie tun können.


Ich mag diese Formulierung sehr, da sie sich logischerweise auch ziemlich sauber in 3D erstreckt. Ich muss dies in Python formulieren, damit ich bereits Zugriff auf qhulls Delauny-Wrapping habe. Das ist also kein großes Problem. Lassen Sie mich sehen, ob ich diese Zusammenfassung richtig verstehe: - Machen Sie eine Probe zum Samen. - Triangulieren Sie die Proben. - Für alle Kanten, die die Isolinie über eine bestimmte Länge erstrecken: Berechnen Sie die Schnittpunkte der Isolinie mit der Kante - alle zu Stichproben berechneten und wiederholen Sie den Vorgang aus dem Triangulationsschritt?
Meawoppl

@meawoppl: Ich habe diesen Algorithmus (noch!) nicht persönlich implementiert oder verwendet, aber das klingt ungefähr richtig.
Victor Liu

Ich werde das heute abwischen und einige Ergebnisse veröffentlichen!
Meawoppl

Entschuldigung für die Verspätung. Diese Methode funktioniert sehr gut für meinen Datensatz. Grundsätzlich säe ich ein reguläres Netz, um es zu probieren, um es zu starten, dann zu triangulieren und die Kanten zu unterteilen, die die Isokontur kreuzen, die Wiederholung. Es ist ein bisschen schwierig, die Anforderung des "besten Merkmals" auszudrücken, und es ist sinnvoll, eine zufällige Erststichprobe gegenüber einer regulären zu wählen, da eine diagonale Isolinie etwas länger dauert als eine, die den Mietverhältnissen der Stichprobe folgt. Am Ende ließ ich es höchstens 5 Durchgänge dauern, und das funktionierte als ein wirklich einfaches Stoppkriterium. Wooo> 1K
meawoppl

1

Sie können versuchen, die Kernfunktionen der EGRA-Methode (Efficient Global Reliability Analysis) anzuwenden. Diese Methode wurde für die effiziente Berechnung einer Ausfallwahrscheinlichkeit abgeleitet, aber der Mut konzentriert sich darauf, das zu tun, was Sie beschreiben - ein Modell zu erstellen, das nur in der Nähe einer bestimmten interessierenden Kontur genau ist.

Dies mag ein interessanter Ausgangspunkt sein, aber ich bin nicht sicher, ob er Ihr Problem lösen wird. Es hängt sehr stark von der Form Ihrer Funktion ab. Wenn es etwas ist, das mit einem Kriging- Modell gut angenähert werden kann, sollte es eine gute Leistung bringen. Diese Modelle sind ziemlich flexibel, benötigen jedoch im Allgemeinen eine reibungslose zugrunde liegende Funktion. Ich habe in der Vergangenheit versucht, EGRA auf eine Bildsegmentierungsanwendung anzuwenden, hatte aber wenig Erfolg, da es einfach keinen Sinn macht, ein Ersatzmodell an etwas anzupassen, das nicht wirklich durch eine funktionale Beziehung definiert ist. Trotzdem erwähne ich es als etwas, das Sie vielleicht untersuchen möchten, falls Ihre Anwendung anders ist, als ich es mir vorstelle.

Wenn ich Sie nicht davon abgehalten habe, können Sie hier (PDF-Link) und hier mehr über EGRA lesen. In Sandias DAKOTA- Projekt gibt es bereits eine Implementierung - meines Wissens die einzige Open-Source-Implementierung von EGRA.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.