Mustererkennung - Ansätze



  • Hallo.

    Ich muss folgende Aufgabe lösen:
    Auf einer Platte (Weiß) befindet sich jeweils ein Objekt.
    Es gibt verschiedene Arten von Objekten die unterschieden werden müssen (Unterscheidungskriterium ist die Farbe in einem gewissen Bereich des Objekts). Die 'Szene' wird von oben mit einer Farbkamera aufgenommen.

    Nun, mit welchen Methoden kann ich die Objekte unterscheiden und Ihre Position bestimmen?

    Die Unterscheidung würde ich eventuell mit einer Histogrammauswertung machen, indem ich überprüfe bei welcher gesuchten Farbe die Häufigkeit am größten ist.

    Bitte um Vorschläge.



  • Zunächst musst du die Kanten finden (Hochpass auf das Bild anwenden). Dann hast du die Position deiner Objekte.
    Dir wird sicher sowas wie Sobelfilter blabla helfen.



  • Ja, Sagt mir etwas.
    Ist der auch auf Farbbilder anwendbar?
    Ich habe nur Unterlagen für eine s/w Mustererkennung.

    PS: Was Haltet ihr von der Idee mit dem Histogramm?



  • Kommt darauf an, was du genau machen willst (soll ein Roboter das Ding greifen können?) und welche Form der Gegenstand hat.

    Die einfachste Methode wäre sicherlich, zunächst die Sättigung zu entfernen (= zu Graustufen umwandeln), dann mit nem passenden (!) Schwellwert zu binarisieren (= Schwarz/Weiß machen) und dann eine Bounding-Box um das Objekt zu legen.



  • wenn nur die farbe das kriterium ist, wozu sollte man dann irgendwelche hoch und tiefpassfilter drüberjagen? du möchtest doch nur eine möglichst genaue farbe haben.

    ich würde das nach YCbCr oder HSL konvertieren und dann den hintergrund wegmaskieren und das was übrigbleibt pixel für pixel zur den jeweiligen referenzfarben mit Error+=DeltaCb*DeltaCb+DeltaCr*DeltaCr;(helligkeit weglassen) aufaddieren, dann durch die pixelanzahl teilen und zu der farbe zu der du den kleinsten error-value hast, das objekt nehmen.

    du könntest zudem, um das rauschen zu schwächen, die auflösung der bilder verkleinern, das kann manchmal viel bringen.

    rapso->greets();



  • Kann man so IMHO gar nicht sagen. Das kommt eben auf die Bilddaten an. Bildpreparation ( Denoising u.ä. ) kann man sich sparen, wenn die Qualität "gut genug" ist.
    In der Industriellen Bildverarbeitung, wo mit Auflichquelle beleuchtet wird, braucht man sowas gar nicht. Die Idee mit dem Histogramm ist nicht schlecht. Im Idealfall sind zwischen den Peaks Deiner einzelnen Objekte "tiefe Täler" -> Bingo, und schon hats du deinen Segmentierungsgrenzwert. Damit kannst du dann Deine Objekterkennung starten.



  • Wichtig ist, dass man die Objekte möglichst mit eindeutigen Farben kennzeichnet. Also:

    Objekt  R   G   B
      0     0   0   0
      1     0   0 255
      2     0 255   0
      3   255   0   0
      4     0 255 255
      5   255 255   0
      6   255   0 255
      7   255 255 255
    

    Je weiter sich die R, G, B-Werte unterscheiden (Kontrast) um so eindeutiger lassen sich logischerweise auch Objekte erkennen. Sinnvoll ist es auch (wie weiter oben schon gesagt wurde) die Auflösung zu reduzieren, um evtl. Bildstörungen zu minimieren.
    Ein weiterer Punkt ist die richtige Beleutung + Kalibrierung des Systems auf die Lichtverhälnisse des ganzen Versuchsaufbaus.



  • F98 schrieb:

    Ein weiterer Punkt ist die richtige Beleutung + Kalibrierung des Systems auf die Lichtverhälnisse des ganzen Versuchsaufbaus.

    deswegen sollte man es vielleicht im farbraum konvertieren, dann hat man das problem nicht. bei HSL hann man L (die luminanz) für beide zu vergleichende farben auf den gleichen wert setzen und dann die farben vergleichen (bzw gleich DeltaH und DeltaS).

    rapso->greets();



  • Naja, filtern muß man vielleicht schon. Wenn es auf die Farbe an einer bestimmten Stelle des Objekts ankommt, dann muß man wohl zuvor die Lage des Objektes bestimmen. Das geht am besten, indem man in Grauwerte kovnertiert, Kantendetektion dort macht und mit diesen Infos dann wieder in's Originalbild geht.
    Da Du die Objekte kennst kannste eine Schätzung machen, wie das Objekt liegt, dann renderste es mal so ins Bild und schaust, ob das passen könnte. Das dann optimieren und Du weißt genau, wie das Objekt liegt. Jetzt die Farbe zu überprüfen sollte kein Problem mehr sein.

    MfG Jester



  • Eine Möglichkeit sind horizontale und vertikale Histogramme die man duch ein neuronales Netz jagt.
    Du machst ein 2-Farb-Bild aus dem Objekt und zählst dann die Pixel jeder Spalte und die Pixel jeder Zeile zusammen. nun hast du 2 Arrays, die eine Spezifische Pixelverteilung haben.
    Hieraus kannst du mittels eines neuronalen Netzes die Form erraten...

    Ist eine sehr einfache Möglichkeit - und keine perfekte..



  • DocJunioR schrieb:

    Eine Möglichkeit sind horizontale und vertikale Histogramme die man duch ein neuronales Netz jagt.
    Du machst ein 2-Farb-Bild aus dem Objekt und zählst dann die Pixel jeder Spalte und die Pixel jeder Zeile zusammen. nun hast du 2 Arrays, die eine Spezifische Pixelverteilung haben.
    Hieraus kannst du mittels eines neuronalen Netzes die Form erraten...

    Ist eine sehr einfache Möglichkeit - und keine perfekte..

    Dir ist klar, dass das totale Asche ist?



  • Nö, isses nicht. Warum ?



  • DocJunioR schrieb:

    Eine Möglichkeit sind horizontale und vertikale Histogramme die man duch ein neuronales Netz jagt.
    Du machst ein 2-Farb-Bild aus dem Objekt und zählst dann die Pixel jeder Spalte und die Pixel jeder Zeile zusammen. nun hast du 2 Arrays, die eine Spezifische Pixelverteilung haben.
    Hieraus kannst du mittels eines neuronalen Netzes die Form erraten...

    Ist eine sehr einfache Möglichkeit - und keine perfekte..

    das erfordert aber auch gut separierbare Objekte im Farbraum. und wenn man das hat funktionieren auch einfache Split&Merge Techniken.
    problematisch ist auch, dass das Netz fuer jede lage des objektes trainiert werden muss.
    besser sind da netze die die Farbinformationen benutzen. am simpelsten ist da SOM Clustering.
    Noch einfacher ist es wenn man wirklich rangeht und die Farbklassen von hand bestimmt un das dann immer mit irgendeiner Minnimumdistance Klassifizierung auswertet. Dies liefert einen den Kandidaten welchen man dann nur noch mit dem möglichen Primitiven vergleicht, dann kann man sagen, Rotes Rechteck...



  • @DocJunioR

    Weil der Informationsgehalt, den ich damit rausfiltere irgendwie zu diffus ist um konkrete Aussagen zu machen.

    1. So ein horizontales und vertikales Histogramm sagt doch nichts über irgendwelche Objekte aus. Ich gebe Dir von einem x-beliebigen Kamerabild mal ein ein x und y Histogramm und Du sagst mir ansatzweise, was im Bild zu sehen ist ...

    2. Die Anzahl der Pixel in einer Spalte sagt noch lange nichts über die Objektform aus. Höchstens, ob das Objekt im Gesamten dick oder dünn ist.

    Was meinst Du, was passiert, wenn ein Fahrassistenzsystem auf diese Weise eine Aussage über den Fahrzustand eines Autos auf einer Straße errät ...



  • Ich habe nie behauptet, dass ein solches System in nem Auto funktioniert...

    Beispiel : "Kamerabild" von 6x6 Punkten:

    ......
     .****.
     .****.
     .****.
     .****.
     ......
    

    Histogramm sieht so aus :

    X 044440
    Y 044440

    ......
     ..**..
     .****.
     .****.
     ..**..
     ......
    

    Histogramm sieht so aus :

    X 024420
    Y 024420

    ......
     .*..*.
     ..**..
     ..**..
     .*..*.
     ......
    

    Histogramm sieht so aus :

    X 022220
    Y 022220

    Also meines Erachtens lässt sich daraus schon etwas machen..
    Die frage ist nur eben, wie tief man rein geht und welche Genauigkeit man braucht...

    Mal abgesehen davon war doch die Frage, Gegenstände zu erkennen, die unter eine Kamera gelegt werden.
    Wo zum Deibel steht dabei das Auto auf der Fahrbahn?

    Falls es noch niemandem aufgefallen ist. Die Bilderkennung ist eine Problematik, die nicht generell zu lösen ist, sondern von Fall zu Fall umgestrickt werden muss..

    Ich hab die einfachste Möglichkeit für diesen Fall geliefert.. Wie genau oder sinnvoll es ist, hab ich nicht bewertet..



  • da kamm man gleich Templates drauf anpassen... da hat man auch die komplette Soll-Entropie gespeichert.
    wenn der Hintergrunf weiss ist, kann man ja auch gleich eine funktion in den Bildkoordinaten aufstellen und diese minimieren ;O)
    aber es gibt halt ne Menge günstigere Wege.
    Es ist nur die Frage wie die Ausgangssituation ist.
    wir wissen ja noch nicht mal welche Farbe die Objekte haben, welches Licht verwendet wird und in welcher Weise die Objekte das Licht reflektieren.
    Aber auszugehen ist davon das die Farbwe doch signifikant vom Hintergrund verschieden ist. und das schreit nach Clustering->Selektion->Anpassung an Primitive->Ergebnispresentation.



  • jupp
    🙂

    Deshalb sagte ich ja, nen 2-Farb-Bild und nen KNN - dass es besser geht, weiß ich selber...

    nur kosten meine anderen Lösungswege zu viel Rechenzeit ^^



  • also der thread ist ja schon seit 1.5 jahren tot, aber mich interesseirt das thema und ich habe auch gerade ein programm schreiben müssen das mehrere objekte vor unbestimmten hintergründen erkennen muss. nun hab ich zufällig was gefunden was den einen oder anderen vllt interessieren wird. einige eurer ideen finden sichdarin wieder 🙂

    http://www.his.sunderland.ac.uk/ps/soave_2004_fay_kaufmann_schwenker_palm.pdf



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Neuigkeiten aus der realen Welt in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply