Forum: PC-Programmierung Schnell Bilddaten verarbeiten/Kurven glaetten


von Programmierer (Gast)


Lesenswert?

Ein Sensor tastet eine Oberflaeche ab und gibt mir ein zweidimensionales 
Array mit x/y-Koordinaten aus. Diese Daten sollen zyklisch aufbereitet 
und ausgewertet werden (Abstaende zwischen bestimmten Punkten, 
Mittelpunkte etc). Das Hauptproblem sind nicht immer vermeidbare 
Reflexionen, die sich als Ausreisser im Array aeussern. Wenn ich zB den 
tiefsten Punkt der Oberflaeche suche und einzelne Pixel 1cm unter der 
Oberflaeche auftreten, ist das Ergebnis einer einfachen Suche nach dem 
tiefsten Punkt wertlos. Mein aktueller erster Ansatz ist, eine Kurve 
durch die Punkte zu legen, einzelne Stoerpixel beeinflussen das Ergebnis 
nicht, ich kann das Minimum in der Kurve bestimmen und habe meine 
gewuenschte Position.
Bei groesster Sensoraufloesung (640 Wertepaare) schaffe ich so etwa 3,5 
Berechnungen pro Sekunde auf einem Core2Duo, ohne die Glaettung ein paar 
zehntausend. Mehr als 85 Berechnungen/Sekunde muss ich nicht schaffen, 
weil ich andere Daten nicht schneller bekommen kann, natuerlich waer 
eine moeglichst sparsame Berechnung erstrebenswert.
Ich weiss immer, wie die Oberflaeche aussieht (zB konkav, konvex, 
V-foermiger Spalt...). Wie geht man so ein Problem grundsaetzlich an, 
wie idealisiere ich meine Messdaten effizient so, dass wichtige Details 
erhalten bleiben und ausgewertet werden koennen?

von Detlef K. (adenin)


Lesenswert?

Such mal nach Median Filter.

640 Wertpaare prüfen in ca. 0.3s? WOW! Das ist doch schon mal ein 
Anfang. :)

von Programmierer (Gast)


Lesenswert?

Naja, 640 Wertepaare pruefen...
Im Groben habe ich eine For-Schleife, die 640x durchlaufen wird. Darin 
werden ein paar kleinere Dinge und die lineare Regression berechnet, 
ausserdem eine weitere For-Schleife, die auch 640x durchlaufen wird und 
ein paar Koeffizienten berechnet.
Ich schau mir den Median-Filter mal an, testen kann ich erst morgen 
wieder.

von Rüdiger K. (sleipnir)


Lesenswert?

Wenn für die Kurve ein vermuteter Zusammenhang y*=f(x) existiert, kann 
die "Methode der kleinsten Quadrate", also die Minimierung des 
Erwartungswerts der Energie des Schätzfehlers y-y* nach den variablen 
Parametern des funktionalen Zusammenhangs f(x) angewandt werden.

Hier ist das für einen linearen Zusammenhang gut beschrieben
http://de.wikipedia.org/wiki/Methode_der_kleinsten_Quadrate#Spezialfall_einer_einfachen_linearen_Ausgleichsgeraden

Ansonsten willkommen in der wunderbaren Welt der (statistischen) 
Datenaufbereitung, wir haben da ein ganz reichhaltiges Sortiment. 
Ebenfalls anwendbar sind Maximum-Likelihood-Ansätze:
http://de.wikipedia.org/wiki/Maximum-Likelihood-Methode

Kalman-Filter:
http://de.wikipedia.org/wiki/Kalman-Filter

Und wenn man aufgrund der Zeitvorgaben nicht mit allen Werten rechnen 
kann, gibt es noch die Monte-Carlo-Ansätze:
http://de.wikipedia.org/wiki/Monte-Carlo-Simulation

Ich würde die Verfahren erstmal mit den rohen Meßdaten in einem 
MatLab(Clone) untersuchen.

von Arc N. (arc)


Lesenswert?


von Programmierer (Gast)


Lesenswert?

Ich habe ein wenig mit einem Medianfilter gespielt. Bei kleinen Fehlern 
arbeitet er wunderbar und vorallem sehr schnell (<1ms pro Array), bei 
ernsten Reflektionen versagt er oder frisst (bei grosser Samplebreite) 
zuviel Details weg. Als Vorfilter ist er brauchbar, aber danach muss 
noch mehr kommen.
Ich werde kommende Woche weiter probieren.

von der mechatroniker (Gast)


Lesenswert?

Die c't hatte vor vielen Jahren einen Artikel über den von der NASA 
verwendeten Ausreißererkennungsfilter für die aus verschiedenen Gründen 
mit einigen Ausreißerpixeln versehenen Bilder der Marssonden.

Das Grundprinzip war, wenn ich mich richtig erinnere:

1. Man ordnet die Pixel in einem fünfdimensionalen Raum an (also x, y, 
R, G, B als gleichberechtigte Koordinaten; bei dir gibt es eben nur 
zwei)

2. Man fängt bei jedem Pixel an, größerwerdende konzentrische 
Hyperkugeln um den Pixel zu ziehen und nimmt die Kurve "in der Kugel 
enthaltene Pixel" gegen "Kugelradius" auf.

3. Je nachdem, ob es sich um einen Ausreißer handelt, ergibt sich ein 
charakteristischer Kurvenverlauf.

Ist natürlich, wenn Echtzeit gefordert wird, je nach verfügbarer 
Rechenleistung etwas heftig, aber in einer vereinfachten Variante (z.B. 
bei jedem Punkt nur Radius n betrachten und prüfen, ob m Punkte im Kreis 
enthalten sind, wobei m und n einmal irgendwie eingestellt werden 
müssen) vielleicht gerade noch umsetzbar.

von Programmierer (Gast)


Lesenswert?

Ich habe einige Zeit am System weitergearbeitet. Unabhaengig von der 
Vorfilterung brauche ich eine geometrische Auswertung, die Suche nach 
einem tiefsten Punkt etc ist nicht mehr ausreichend. Ich moechte die 
Sensordaten nach Vorgabe automatisch geometrisch beschreiben. Ich sage 
also, dass ich beispielsweise einen V-foermigen Spalt in einer Ebene 
abtaste, ich erhalte Oeffnungswinkel und Tiefe. Ich gebe eine halbrunde 
Erhebung auf einem Bogen vor, ich erhalte Durchmesser und Hoehe der 
Erhebung, usw.
Die Berechnung muss dabei wie gesagt robust gegen Reflektionen sein. Die 
sehen wirklich so aus wie sie klingen: Im Punktarray fehlen an der 
richtigen Position Punkte, sie liegen in der gespiegelten Kopie der 
Daten, quasi heruntergeklappt.
Welcher Buecher soll ich kaufen, wo finde ich einen Anfang?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.