Ich arbeite in einem Projekt, in dem Ränder gegen ein Motiv projiziert werden und ein Foto aufgenommen wird. Die Aufgabe besteht darin, die Mittellinien der Streifen zu finden, die mathematisch die 3D-Schnittkurve zwischen der Streifenebene und der Objektoberfläche darstellen.
Das Foto ist ein PNG (RGB), und frühere Versuche verwendeten Graustufen- und dann Differenzschwellwerte, um eine zebraähnliche Schwarzweißfotografie zu erhalten, aus der sich der Mittelpunkt jeder Pixelspalte jedes Randes leicht ermitteln ließ. Das Problem ist, dass wir durch Schwellenwertbildung und auch durch Ermitteln der mittleren Höhe einer diskreten Pixelspalte einen Präzisionsverlust und eine Quantisierung haben, die überhaupt nicht erwünscht sind.
Mein Eindruck bei Betrachtung der Bilder ist, dass die Mittellinien kontinuierlicher (mehr Punkte) und glatter (nicht quantisiert) sein könnten, wenn sie durch eine statistische Abtastmethode direkt aus dem Bild ohne Schwellenwert (entweder RGB oder Graustufen) erkannt würden (etwas Überschwemmung / iterative Faltung, was auch immer).
Unten ist ein aktuelles Beispielbild:
Jeder Vorschlag wäre sehr dankbar!
quelle
Antworten:
Ich schlage folgende Schritte vor:
x
das gewichtete Zentrum (nach Pixelintensität) in dery
Richtung.y
Werte, um Rauschen zu entfernen.(x,y)
Punkte durch Anpassen einer Kurve. Dieser Artikel könnte Ihnen helfen. Sie können auch ein Polynom auf hoher Ebene einsetzen, obwohl es meiner Meinung nach schlimmer ist.Hier ist ein Matlab-Code, der die Schritte 1, 2 und 4 zeigt. Ich habe die automatische Schwellenwertauswahl übersprungen. Stattdessen habe ich manuell gewählt
th=40
:Dies sind die Kurven, die durch Ermitteln des gewichteten Durchschnitts pro Spalte ermittelt werden:
Dies sind die Kurven nach dem Anpassen eines Polynoms:
Hier ist der Code:
quelle
double
. Über die Ergebnisse in der unteren Hälfte muss ich prüfen, es könnte ein Software-Fehler seinIch würde das RGB-Bild nicht verwenden. Farbbilder werden in der Regel durch Anbringen eines "Bayer-Filters" am Kamerasensor erstellt, wodurch die erreichbare Auflösung normalerweise verringert wird.
Wenn Sie das Graustufenbild verwenden, sind die von Ihnen beschriebenen Schritte (Binarisieren des "Zebra" -Bilds, Finden der Mittellinie) ein guter Anfang. Als letzten Schritt würde ich
quelle
Hier finden Sie noch eine alternative Lösung für Ihr Problem, indem Sie Ihre Frage als 'Pfadoptimierungsproblem' modellieren. Es ist zwar komplizierter als die einfache Lösung zur Binarisierung und anschließenden Kurvenanpassung, in der Praxis jedoch robuster.
Von der sehr hohen Ebene aus sollten wir dieses Bild als Grafik betrachten, wo
Jedes Bildpixel ist ein Knoten in diesem Diagramm
Jeder Knoten ist mit einigen anderen Knoten verbunden, die als Nachbarn bezeichnet werden. Diese Verbindungsdefinition wird häufig als Topologie dieses Diagramms bezeichnet.
Jeder Knoten hat ein Gewicht (Feature, Kosten, Energie oder wie auch immer Sie es nennen möchten), was die Wahrscheinlichkeit widerspiegelt, dass sich dieser Knoten in einer optimalen Mittellinie befindet, nach der wir suchen.
Solange wir diese Wahrscheinlichkeit modellieren können, wird Ihr Problem, die "Mittellinien der Streifen" zu finden, zum Problem, lokale optimale Pfade auf dem Graphen zu finden , was durch dynamische Programmierung, z. B. Viterbi-Algorithmus, effektiv gelöst werden kann.
Hier sind einige Vorteile dieses Ansatzes:
Alle Ihre Ergebnisse sind kontinuierlich (im Gegensatz zu der Schwellenwertmethode, bei der eine Mittellinie in Stücke gebrochen werden kann).
Um ein solches Diagramm zu erstellen, haben Sie viele Freiheiten. Sie können verschiedene Features und Diagrammtopologien auswählen.
Ihre Ergebnisse sind optimal im Sinne von Pfadoptimierungen
Ihre Lösung ist robuster gegen Rauschen, da diese optimalen Pfade stabil bleiben, solange das Rauschen auf alle Pixel gleichmäßig verteilt ist.
Hier ist eine kurze Demonstration der obigen Idee. Da ich keine Vorkenntnisse verwende, um anzugeben, welche Start- und Endknoten möglich sind, decodiere ich einfach jeden möglichen Startknoten.
Für die Fuzzy-Endungen liegt es daran, dass wir für jeden möglichen Endknoten nach optimalen Wegen suchen. Infolgedessen ist der hervorgehobene Pfad für einige Knoten, die sich in dunklen Bereichen befinden, immer noch der lokal optimale Pfad.
Für den unscharfen Pfad können Sie ihn entweder glätten, nachdem Sie ihn gefunden haben, oder einige geglättete Features anstelle der Rohintensität verwenden.
Es ist möglich, Teilpfade wiederherzustellen, indem Start- und Endknoten geändert werden.
Es wird nicht schwierig sein, diese unerwünschten lokalen optimalen Pfade zu beschneiden. Da wir nach der Viterbi-Dekodierung die Wahrscheinlichkeit haben, dass alle Pfade vorhanden sind, und Sie möglicherweise verschiedene Vorkenntnisse verwenden (z. B. müssen wir für diejenigen, die dieselbe Quelle verwenden, nur einen optimalen Pfad angeben).
Weitere Informationen finden Sie auf dem Papier.
Hier ist ein kurzer Python-Code, mit dem das obige Diagramm erstellt wird.
quelle
Ich dachte, ich sollte meine Antwort posten, da sie sich ein bisschen von anderen Ansätzen unterscheidet. Ich habe es in Matlab versucht.
Ein Nachteil, den ich hier sehe, ist, dass dieser Ansatz für einige Ausrichtungen der Streifen nicht gut funktioniert. In diesem Fall müssen wir die Ausrichtung korrigieren und dieses Verfahren anwenden.
Hier ist der Matlab-Code:
Wenn Sie zum Beispiel die mittlere Spalte des Bildes nehmen, sollte das Profil so aussehen: (in Blau ist das Profil. In Grün sind die lokalen Maxima)
Und das Bild mit den lokalen Maxima für alle Spalten sieht folgendermaßen aus:
Hier sind die verbundenen Komponenten (obwohl einige Streifen gebrochen sind, erhalten die meisten von ihnen einen durchgehenden Bereich):
quelle