- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: Bildverarbeitung: Segmentierung

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780

    Bildverarbeitung: Segmentierung

    Anzeige

    Praxistest und DIY Projekte
    Hallo Leute,

    ich arbeite gerade an meiner Diplomarbeit, und bin auf ein Problem gestoßen...


    Ich möchte ein Bild segmentieren, wie z.B. dieses:
    Bild hier  

    Ein buntes Schachbrettmuster, projiziert von einem Beamer und aufgenommen mit einer ganz normalen Kamera. Und was ich jetzt brauche sind die einzelnen Felder, im einfachsten Fall als S/W-Bild bei dem alle Felder weiß sind, getrennt durch schwarze Linien.


    Noch ein paar Worte zu dem verwendeten Muster:

    1. Die Helligkeit ist idealerweise konstant, und die Sättigung zumindest annähernd. Die Felder unterscheiden sich also im wesentlichen durch ihren Farbwinkel.

    2. Die Differenz der Farbwinkel zweier senkrecht oder waagerecht benachbarter Felder beträgt immer entweder 120° oder 240°.


    Naja, ich möchte das Bild also segmentieren, und dabei möglichst unabhängig von Sättigung und Helligkeit bleiben. Daher habe ich das Bild zunächst mal nach HSI umgewandelt, und mich bei der Weiterverarbeitung auf den H-Kanal beschränkt. Da der aber Phasensprünge enthält (360° -> 0°) die bei der Verarbeitung stören, habe ich den H-Kanal wieder in ein RGB-Bild konvertiert.

    Dieses Bild sieht dann so aus:
    Bild hier  


    Der nächste Schritt war dann die Berechnung von Gradientenbildern für R, G und B. Und weil ich nur ein einziges brauche, werden die dann noch zu einem Bild verrechnet (für jeden Pixel wird von den 3 Werten jeweils der größte verwendet).

    Wenn das dann fertig ist sieht es so aus:
    Bild hier  


    Das Bild zu segmentieren ist dann zwar immernoch nicht trivial, aber es ist machbar.




    So, und jetzt kommt mein eigentliches Problem...
    die Methode funktioniert nämlich nicht mehr sobald irgendein farbiges Objekt mit auf dem Bild ist, da dadurch der Farbwinkel des projizierten Musters verfälscht wird.

    Hier mal ein Beispiel mit einem gelben Blatt Papier, wie man sieht ist das resultierende Gradientenbild de facto nicht zu gebrauchen.
    Bild hier  
    Bild hier  
    Bild hier  



    Also, wie kann ich solche Bilder zuverlässig segmentieren?
    Ich habe zwar reichlich Lektüre zu dem Thema im Internet gefunden, aber die verschiedenen Algorithmen werden immer nur ganz grob umschrieben, was die Sache nicht unbedingt erleichtert. Außerdem kostet es zu viel Zeit unterschiedliche Segmentierungsalgorithmen zu implementieren, von denen ich nichtmal weiß ob sie überhaupt für Bilder dieser Art geeignet sind.

    Leider verfügt Matlab nur über eine einzige Segmentierungsfunktion, und die arbeitet nach dem Watershed-Algorithmus. Dummerweise bringt mir diese Funktion aber rein garnichts, da ja schon die Vorverarbeitung bei farbigen Objekten fehlschlägt.


    Optimal wären für mich jetzt natürlich Programme die unterschiedliche Segmentierungsalgorithmen beherrschen, so daß ich den auswählen kann der für meine Anwendung optimal geeignet ist. Aber auch nach inzwischen bestimmt schon 10-12 Stunden intensiven googelns, habe ich noch nichts derartiges gefunden.


    Es ist auch recht frustrierend, daß ich zwar alles über das Muster weiss was es zu wissen gibt, dieses Wissen bei der Segmentierung aber bisher nicht einsetzen konnte. (je mehr Informationen man hat, desto effizienter sollte man die Bilder ja auch segmentieren können)



    Naja, vielleicht fällt euch ja irgendwas dazu ein...


    Gruß,
    Felix
    So viele Treppen und so wenig Zeit!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Felix,

    ich habe sowas noch nicht gemacht, habe mich aber etwas mit der Theorie der Bildverarbeitung beschäftigt. Insofern musst Du, was ich hier schreibe, als "educated guess" betrachten. -

    Das s-w-Kästchenmuster, das Du nach der (ich nehme Laplace) Filterung bekommst, ist hochgradig periodisch. Der Gegenstand, der sich in Dein Bild geschoben hat, modifiziert die Periode des Musters nur wenig, dafür aber umso mehr die Phase.

    Da bietet es sich an, eine komplexe(!) Fouriertransformation anzuschliessen. Danach nur den Phasenanteil (also den Imaginärteil) in den Ortsraum zurücktransformieren. Das Bild, das Du so erhältst, hat nur noch die halbe Auflösung weil Du die reelle Hälfte der Daten nicht verwendet hast. Dafür bekommst Du ein Muster, das Dir die Bereiche mit Phasenverschiebung anzeigt.

    Das könnte hinhauen, glaube ich.

    mare_crisium

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Also um die Gradientenbilder zu errechnen nehme ich keinen Laplace, sondern ich filtere zweimal mit dem Sobel-Operator (einmal in x, einmal in y, und die beiden Bilder werden dann über sqrt(x^2 + y^2) kombiniert), aber im Endeffekt sollte das ja keinen allzu großen Unterschied machen...


    Dein Vorschlag klingt interessant, aber wenn ich dich richtig verstehe soll ich die FT auf das Gradientenbild anwenden? Aber das ist ja schon "kaputt" wenn man so will, denn da wo das gelbe Objekt den Farbwinkel verfälscht sind die Kästchen im Gradientenbild nicht mehr als solche zu erkennen.

    Naja, versuchen werde ich es auf jeden Fall, das Ergebnis poste ich dann hier.

    Gruß,
    Felix
    So viele Treppen und so wenig Zeit!

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Ok, also wenn man die Phase zurücktransformiert, sieht das Ergebnis so aus:

    Bild hier  


    Ich habe bei der Segmentierung inzwischen schon einigermaßen akzeptable Ergebnisse erzielt, indem ich nicht vom Farbkanal sondern vom Originalbild den Gradienten gebildet habe. Leider ist die Segmentierung so aber nicht mehr unabhängig von Helligkeit und Sättigung, was mich natürlich stört.
    So viele Treppen und so wenig Zeit!

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Felix,

    wie gesagt, es war eine Vermutung, die, leider, wie Du nachgewiesen hast, nicht funktioniert. Umso mehr freut's mich, dass Du einen anderen Weg gefunden hast. - Ehrlich gesagt, in der Rücktransformation der Phase hätte ich mehr Kontrast erwartet.

    mare_crisium

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Wie wäre es drei Kreuzkorrelationen über das Ursprungsbild laufen zu lassen: Je eine mit einem Kästchen in R,G,B als Pattern. Die gefundenen Mittelpunkte sind da die Punkte passender Korrelation.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Mit Korrelation habe ich es schon versucht, leider kann das Muster aber auch mehr oder weniger stark verzerrt sein, und dann funktioniert das nicht mehr (selbst bei einem sehr guten Bild funktioniert diese Methode nur mäßig).


    Ich habe inzwischen allerdings dennoch ganz ordentliche Resultate bei der Segmentierung, selbst bei ziemlich schwierigen Bildern. Wie bereits erwähnt ist die Helligkeit (Summe aus R, G und B) des Musters annähernd konstant, diese Eigenschaft hatte ich bisher allerdings nicht wirklich genutzt.

    Die Lösung ist also ganz einfach das Originalbild durch die Summe der 3 Farbkanäle zu dividieren, das Resultat ist dann ein Bild ohne Helligkeitsunterschiede, was die Segmentierung erheblich zuverlässiger macht (gegenüber der direkten Segmentierung des Originalbilds).


    Von diesem Bild ausgehend mache ich es dann so wie bisher, ich berechne ein Gradientenbild und versuche es zu segmentieren. Leider habe ich dabei aber noch immer das alte Problem, daß Matlab nur den Watershed Algorithmus beherrscht, und ich denke daß der für diese spezielle Aufgabe nicht die beste Lösung ist.


    Mein Problem hat sich also nicht grundlegend geändert, ich bin imernoch auf der Suche nach einem geeigneten Segmentierungsalgorithmus den ich entweder auf das vorverarbeitete Farbbild oder auf das Gradientenbild anwenden kann.
    So viele Treppen und so wenig Zeit!

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    57
    Beiträge
    1.195
    Sofern das Muster immer noch viereckig ist, sollte das aber klappen. Es wird eigentlich erst dann kompliziert, wenn die Verzerrung nicht über das Bild hinweg konstant ist.

    Wenn Du einfach ein Weisses oder Schwarzes Feld nimmst und über das Originalbild per Kreuzkorr laufen lässt sollten sich Minimal nud Maxima ergeben, die in den Zentren der jeweilgen Felder liegen. Durch angenommen die Felder sind rechteckig, kannst Du dann die Feldgrenzen Interpolieren. An dieser Stelle kannst Du in einem der Farbkanäle per LoG und anschließende Nullstellensuche den Kantenpunkt ermitteln.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    Felix,

    kannst Du nochmal an einem Beispiel zeigen, wie das "durch die Summe der RGB-Kanäle dividierte" Bild und das Gradientenbild aussieht? Meines Wissens berechnet sich der Grauwert eines Bildpunktes aus den RGB-Werten nach

    Grauwert = 0,299R + 0,584G + 0,114B (siehe Wikipedia)

    Demnach liefe Deine Berechnung auf den Wert

    Y = 0,299/(G+B) + 0,584/(R+B) +0,114/(R*G)

    hinaus. Dass der Kontrast dabei nicht so gross ist, kann ich mir vorstellen. Mir ist unklar, wie Du trotz des flauen Kontrastes zu einem akzeptable (d.h. rauscharmen) Gradientenbild kommst.

    mare_crisium

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    23.04.2007
    Ort
    stuttgart
    Beiträge
    1.127
    wenn du einfach eine pixelersetzung drüberlaufen lässt erst in x dann in y richtung sollte so aussehen :
    [ 1 0 -1]
    und
    [1
    0
    -1]
    sollten die kanten doch hervorgehoben werden ?

    oder eine fouriertransformation (fft ) und dann einen "spaltförmigen" filter drüber...

    das mit dem gradient sollte allerdings auch gehen, .. was passiert denn wenn du ein RGB bild hast und jeweils den gradienten für jeden kanal bildest? dann sollt die summe der 3 ergebnisse das gesuchte gitter sein...

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen