Mein erster Versuch wäre, den Mittelwert zu nehmen, dann drüber = 1 und drunter = 0
Hallo Leute,
ich habe ein Problem bei der Auswertung von Daten...
hier mal ein Beispiel wie ein "guter" Datensatz aussieht:
Bild hier
Das soll einfach nur in binäre Form umgewandelt werden.
zuerst dachte ich mir ich verwende mal (max - min)/2 als Schwelle,
was in diesem Fall auch völlig problemlos funktioniert und das korrekte Ergebnis 00001000111 liefert.
Dummerweise sehen aber nicht alle Datensätze so schön aus.
Dieser z.B. ist schon etwas schlechter, wird aber immernoch korrekt ausgewertet:
(man beachte die Skalierung der Y-Achse)
Bild hier
Leider geht es aber noch wesentlich schlechter, das sieht dann so aus:
Bild hier
Ob ihr es glaubt oder nicht: was man hier sieht sollte eigentlich 00000000000 sein.
Und genau hier versagt die einfache Variante, denn sie liefert 01111111111 (was natürlich völlig falsch ist).
Hier noch ein paar Details die vielleicht relevant sein könnten:
- Die mittleren 9 Bit sind Gray-codiert, und enthalten die eigentlichen Nutzdaten
- Das erste Bit gehört nicht zum Datensatz sondern ist der Mittelwert der Minima aller Datensätze.
(eingefügt habe ich es nur, um auch den Gray-Code 111111111 korrekt erkennen zu können)
- Das letzte Bit ist bei allen gültigen Datensätzen 1 (auf dem 3. Bild ist also ein ungültiger Datensatz zu sehen)
- Die Datensätze liegen in Form mehrerer Bilder vor (10 um genau zu sein, also ein Bild pro Bit bzw. ein Datensatz pro Pixel)
Vielleicht hat ja Jemand eine kreative Idee wie sich das sinnvoll auswerten lässt.
So viele Treppen und so wenig Zeit!
Mein erster Versuch wäre, den Mittelwert zu nehmen, dann drüber = 1 und drunter = 0
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
[quote="Felix G"](max - min)/2 als Schwelle[quote]
Macht er ja Praktisch schon, nur dass das ein Plus ein muss....
PickNick
Das habe ich schon ausprobiert, und leider sind die Ergebnisse damit sogar noch ein bischen schlechter
@lpw
ups
ich probiers gleich mal mit einem +
edit:
was so ein kleiner Fehler alles bewirken kann...
also mit (min+max)/2 ist das Ergebnis schonmal deutlich besser
wirklich optimal ist es allerdings noch nicht
So viele Treppen und so wenig Zeit!
Nach welchen kriterien gibt es denn die Ausgangswerte, denn ich finde, das beim lezten Beispiel es nicht eindeutig ist was das sein soll.
Das letzte Beispiel ist ein Schatten, also ein Pixel der auf allen 10 Bildern mehr oder weniger dunkel ist.
Wenn man die Skalierung der Y-Achse betrachtet sieht man sehr gut daß alle 11 Werte in einem Bereich liegen,
der bei den anderen beiden Beispielen ganz eindeutig als 0 eingestuft würde.
Die Schwierigkeit liegt also in der Entscheidung ob es sich um einen Schatten handelt,
oder doch um gültige Daten die einfach nur einen sehr niedrigen Kontrast haben.
Ich will mal verraten worum es hier geht: 3D-Bilderfassung durch Streifenprojektion
Dabei werden verschiedene Streifenmuster auf das Objekt projiziert und zwar derart,
daß in der Hell-Dunkel-Abfolge jedes Pixels die Nummer des Streifens codiert ist zu dem dieser Pixel gehört.
Da Kamera und Projektor prinzipbedingt gegeneinander verschoben sein müssen,
sind natürlich auch Schatten auf den Bildern die keine Informationen enthalten können.
Andererseits kann der Kontrast bestimmter Pixel aber auch deshalb niedrig sein,
weil das Objekt selbst an dieser Stelle vielleicht eine dunkle Farbe hat.
(und dann sind ja evtl. doch noch verwertbare Informationen enthalten)
Ich bin inzwischen davon überzeugt daß man die Pixel nicht separat betrachten darf,
sondern auch die nähere Umgebung in die Auswertung mit einbeziehen muss.
die Frage ist nur: wie?
So viele Treppen und so wenig Zeit!
Wie werden dann die Eingangsdaten verarbeitet? Beseitigst Du im Bild vorher die lokalen Helligkeitsschwankungen, die durch Abschattung entstehen (z.B. durch einen großen (!) Tiefpass?
Dann interessiert Dich ja der Übergang dunkel/hell bzw hell/dunkel zwischen zwei Pixeln. Bei einem derart gestörten Signal ist da ein globals Schwellenkriterium nicht besonders hilfreich. Du solltest in dem Fall lokale Kriterien anwenden (z.B. Sprung um mindestens n-Grauwerte). Auch hier gibt es noch potenzielle Probleme (z.B. Rauschen) aber auch das ist in den Griff zu bekommen.
Naja, die Streifen auf dem 9. Bild (also dem letzten Bild das noch zum Gray-Code gehört)
sind nur etwa 2-4 Pixel breit, deshalb bin ich da natürlich auch nicht mit irgendwelchen Filtern ran.
Momentan läuft die Auswertung so:
- (optional) vergrößern der 10 Bilder um einen frei wählbaren Faktor
- erstellen eines (einfarbigen) Dunkelbildes (das optimalerweise etwa so hell sein sollte wie ein Schatten)
- "Schwellenbild" erzeugen (Formel wie oben, also (max+min)/2)
- die ersten 9 Bilder (das 10. gehört nicht zum eigentl. code) nach binär umwandeln (mit dem zuvor errechneten Schwellenbild)
- für jeden Pixel: Hell-Dunkel-Abfolge decodieren, und als Dezimalzahl in die Ergebnismatrix schreiben
- (Ergebnismatrix wieder auf Originalgröße der Bilder verkleinern)
Das Ergebnis ist so schon ganz gut, aber es wäre halt schön wenn auch recht dunkle Streifen noch gut erkannt würden.
(also solche die ich auf den Bildern sehen kann, die aber mit dieser einfachen Methode nicht mehr erfasst werden)
Sehr praktisch wäre es auch, wenn ich zusätzlich zu den Ergebnissen jeweils noch ausrechnen könnte wie "zuverlässig" der Wert ist
(also quasi "Pixel x gehört mit y%iger Wahrscheinlichkeit zu Streifen Nr. z")
So viele Treppen und so wenig Zeit!
- Die Vergrößerung bringt m.E. nichts. Aber vielleicht hast Du ja gute Gründe das zu tun.
- Statt des Dunkelbildes (wie wird das erstellt) kannst Du ein Originalbild nehmen und mit einem großen Tiefpass filtern. Das gefilterte Bild ziehst Du dann vom Original ab. Damit verschwinden globale (!) Kontrastunterschiede
- jetzt kannst Du auf das Bild einen LoG-Filter (laplacian of gaussian) anwenden. Damit bekommst Du ein tiefpassgefiltertes Kantenbild (2. Ableitung) in dem Du nach lokalen Grauwertübergängen suchen kannst.
Mit dem Verfahren solltest Du die Kanten schwellenwertunabhängig finden. Ich habe die Filterung meistens auf Floats durchgeführt, die Ergebnisse werden da besser, da der Filterkern genauer berechnet werden kann. Du solltest aber mindestens mit einem 5er, besser: 7er Kern arbeiten.
Hallo,
wie wäre es mit einem Mindestwert und einem maximalwert für den Schwellenwert. Also du bildest den Schwellenwert weiterhin so wie jetzt, aber er muss mindestens 25 sein, ist er kleiner, wird er auf 25 gesetzt. genauso mit einem Maximalwert.
Das Problem mit dem Mittelwert tritt genau dann auf, wenn nur 1 oder 0 im Ergebnis vorkommt, weil dann mit der alten Berechnung der kleinste wert auf jeden Fall unter dem Schwellenwert liegt und der größte auf jeden Fall darüber. Für die Zuverlässigkeit der Aussage kannst du deshlab die Differenz zwischen kleinstem und größtem wert heranziehen. Ist die groß, weißt du, dass mindestens eine 1 und eine 0 in deinem Ergebnis vorkommt, dein Mittelwert also dazwischen liegt. Ist sie klein, ist die Wahrscheinlichkeit groß, dass lauter 1 oder 0 im ergebnis sind. Es also leicht zu Fehler kommt, weil der Mittelwe´rt an der falschen Stelle liegt.
MfG jeffrey
Lesezeichen