Kreis und Linie mit zufälliger Anordung in einer Bitmap finden // diverse Filter



  • Hallo,

    Wie kann ich einen Kreis, bzw eine Linie (ich brauche beides) in einer bitmap finden?

    Die Position dieser Linien und Kreise ist auf jeder Bitmap zufällig. Der Winkel der Linie zu den Koordinatenachsen ändert sich auch.

    Was mir bekannt ist, ist der Radius des Kreises und die Länge der Linie.

    Wer sich das Bild einmal anschauen möchte kann sich gerne einmal meine Skizze ansehen:

    [url] http://img217.imageshack.us/my.php?image=linseweniger0le.png [/url]

    Es geht darum die Position eines Körpers auf einem Tisch zu bestimmen. Die Bitmap hole ich mir mit einer Webcam.

    Gehtt das vielleicht mit Canny Edge????



  • ist der kreis immer von der linie getrennt?

    haben die line und der kreis verschiedene farben?

    ist die Linie mit einem bestimmten Algorithmus (z.b bresenham gezeichnet) oder kommt die aus einer skelletierung?



  • Vertexwahn schrieb:

    ist der kreis immer von der Linie getrennt?

    -> nein, die Linien sind fest mit dem Kreis verbunden. Es handelt sich nur um ein Teil das erfasst werden soll. Die Linie liegt immer im Kreis. Ich muss die Position der Linie im Koordinatensystem definieren um den Körper im Raum positionieren zu können.

    Vertexwahn schrieb:

    haben die line und der Kreis verschiedene farben?

    -> nein, da es sich um ein Teil handelt ist alles schwarz. Es hebt sich auch gut von der Unterfläche (weis) ab.

    Vertexwahn schrieb:

    ist die Linie mit einem bestimmten Algorithmus (z.b bresenham gezeichnet) oder kommt die aus einer skelletierung?

    -> das Teil ist immer gleich. Wie ich schon geschrieben habe, will ich es mit einer Webcam auf einer weisen Unterlage erfassen. Ich kann die Länge der Linie und den Durchmesser (bzw. Radius) des Kreises messen. Somit weiss ich wie groß alles ist.
    die Linie kann aber zufällig im Raum liegen.

    ...und nochetwas, das ich vergessen habe. Ich programmiere WinAPI


  • Mod

    mit einem beispielbild wäre es erheblich einfacher dir zu helfen 😉



  • kann ich ich im Forum ein Bild hinstellen?

    Wenn ja, dann wie?

    Wenn nicht stellt euch ein Theta vor, nur dass die Linie in der Mitte den Kreis auf beiden Seiten berührt

    Θ


  • Mod

    http://img293.imageshack.us/ bild reinstellen, link dazu hier posten.



  • Danke für deine schnelle Antwort!!

    und hier ist eine Skizze:

    [url] http://img217.imageshack.us/my.php?image=linseweniger0le.png [/url]


  • Mod

    such nach dem ersten pixel von oben im bild und dem ersten bild von unten im bild, in der mitte davon ist das zentrum des kreises.
    such von der mitte aus kreisförmig, der erste pixel der getroffen ist, ist der naheste punkt von der linie, sozusagen die normale, also um 90° drehen und dann weißt du die lage der linie und deren position.



  • Danke,.... für die vielen schnellen Antworten!!!

    stimmt, es ist einfacher als ich dachte. da hätte ich auch selbst drauf kommen können. 😉



  • ....so einfach war es dann soch nicht. Zum Glück sieht in der Theorie immer alles anders aus wie in der Praxis.

    Das Problem ist, dass die Teile einen Schatten auf den Tisch werfen. Dieser Schatten ist natürlich auch schwarz, oder zumindest so dunkel, dass ichdas erste Pixel nicht genau erfassen kann. Außerdem sind die Übergänge von schwarz auf weiß sehr weich, da es sich um ein Photo handelt.

    Ich habe hier noch einmal eine Aufnahme des Teils, die ich mit der Webcam gemacht habe.

    http://img199.imageshack.us/my.php?image=photolinse8ef.jpg

    Jetzt habe ich mir überlegt ob ich dies vielleicht mit Canny Edge machen könnte. Kann ich damit meine Kanten klar und sauber definieren?


  • Mod

    bei dieser auflösung darfst du nichts erwarten ;), du brauchst dafür ne gute cam (hoche auflösung, wenig rauschen), sonst wird das ganze sehr ungenau bleiben.

    edgedetection wird eventuell auch den schatten als kante erkennen.

    nimm einfach irgendwas auffälliges, was sich vom rest absetzt, ein knalliges orange z.b.



  • Um die Kante zu entdecken würde ich's mal mit ner Hough-Transformation versuchen. Für den Kreis bietet sich eigentlich ein Matched-Filter an, gerade weil Du den Radius kennst und ein gedrehter Kreis halt immer noch ein Kreis ist.

    edit: evtl zuvor schon binarisieren.



  • rapso schrieb:

    nimm einfach irgendwas auffälliges, was sich vom rest absetzt, ein knalliges orange z.b.

    ->Danke, das Teil kann ich nicht ändern, aber vielleicht die Unterlage.
    Außerdem ist das Kamerabild ein wenig besser als es auf dem Photo scheint.

    Jester schrieb:

    Hough-Transformation

    -> die Hough-Transformation schaut gut aus. Das muss ich mir unbedingt anschauen. Du weisst nicht reinzufällig wo man einen Beispielcode finden kann? Wenn nicht ist auch niocht schlimm. Dann muss ich halt selbst suchen.



  • Kenn die Hough Transformation jetzt nicht, aber lies dir einfach mal was zu den dithering Verfahren durch, automatischer Kontrastausgleich mit nem Graustufenhistogramm, scharfzeichnen mit nem Laplace Filter oder besser noch Sobel Filter.

    Ich denke wenn du ein paar von den Dinger am Anfang mal testweise drüber laufen lässt und am ende den SobelFilter drüber jagst solltest du nen ziemlich schafes Bild bekommen, wo alle Details weggeschnitten sind.
    Dann kannst du mit Rapsos Vorschlag vom Anfang arbeiten, mit nem kleinen Toleranz Bereich sollte es dann auch bei dieser Auflösung möglich sein.

    Nachtrag: Mit nem Max/Min Filter kannst du vorher noch das Rauschen entfernen.



  • Nen Beispielcode zur Hough-Trafo hab ich leider grad nicht zur Hand. Aber die ist eigentlich recht einfach zu bauen. Geht übrigens ziemlich analog auch für Kreise. 😉

    Aber da Du den Radius kennst ist für Dich vermutlich ein matched Filter besser geeignet.

    @Chaosangel:

    Vorteil der Houghtrafo ist, daß es ein Verfahren ist, das nach Geradenhaften Strukturen sucht und nicht einzelne Pixel als Kantenpixel identifiziert. Die einzige geradenhafte Struktur in diesem Bild ist das gesuchte Teil. Min-Max-Filterung (also Binarisierung) ist auf jeden Fall sinnvoll!



  • da du ja ein foto machst, wenn ich jetzt alles richtig verstanden habe, dann wäre es eventuell auch sinnvoll die beleuchtung zu korrigieren

    schlagschatten ect lassen sich bestimmt so schon vorher verhindern, was die ganze sache erleichtern sollte



  • Danke für diese vielen Antworten, ich glaube für mich gibt es nun wirklich viel zu lesen 😉

    -> ...und was die Beleuchung anbetrifft, ich werde immer einen Schatten haben!



  • vielleicht wäre es besser für diese Frage ein neues Thema im im forum zu öffen. Ich stelle sie aber hier rein, da hier die ganzen Filter angesprochen sind.

    Ich glaube ich habe den Sobel Filter nicht richtig verstanden.
    Nachdem was ich bisher gelesen habe muss ich beim Sobel Filter jedes einzelne Pixel, und die 8 Pixel darum herum mit zwei Filtermatrizen multiplizieren und dann die Summe der in das Pixel in der Mitte schreiben. dies mache ich einmal für die X- und einmal für die Y-Richtung und lege dann die beiden Bilder übereinander.
    Danach sollte ich ein Graustufenbild mit den erkannten Kanten erhalten (?????)

    Bei einer Bitmap ist es doch so, dass ich pro Pixel drei Farbwerte (rot, grün, blau) von 0-255 habe. Heißt das jetzt für mich, dass ich das gerade Beschriebene dreimal, d.h. für jede Farbe, machen muss?

    Oder muss ich zurst ein Graustufenbild (wenn es so etwas gibt??) aus meiner Bitmap erzeugen? Ich habe zwar noch nie etwas mit Graustufenbilder gemacht, aber ich könnte mir vorstellen, dass es für so ein Bild nur eine Information pro Pixel gibt und alles viel einfacher wäre.



  • Mach ein Graustufen Bild daraus !
    Ich weiss nicht ob der "MedianCut" Algo dafür geeignet ist oder du einfach eine "Graustufenkonvertierung" durchführen solltest.

    @Graustufen
    Ganz einfach, vielleicht mal mit folgenden Werten testen.
    z.B. wahrnehmungsorientiert:
    Luminanz = 0.299·P.rot + 0.587·P.grün + 0.114·P.blau
    Graustufenkonvertierung nach dem NTSC-Standard:
    Luminanz = 0.176·P.rot + 0.81·P.grün + 0.011·P.blau

    Oder selber googlen...

    Danach noch einen Max oder Min Filter drüber jagen um den Noise wegzubekommen, und immer wieder schaun wie es aussieht.

    Dann den Sobel drüber laufen lassen. Weiss grad nicht mehr ob man die 2 Filter hintereinander durchlaufen lassen muss oder ob man beide gleichzeitig drüber jagen kann ...

    Anstatt der Max/Min Filter könntest du nochmal nach nem Median Filter suchen, der sollte auch zur NoiseReduktion funktionieren und net soo schwer sein.

    PS: Wenn irgendwas schon durchgelaufen ist zeig mal die Ergebnisse, wäre cool !



  • Jester schrieb:

    Nen Beispielcode zur Hough-Trafo hab ich leider grad nicht zur Hand. Aber die ist eigentlich recht einfach zu bauen. Geht übrigens ziemlich analog auch für Kreise. 😉

    Die Hough-Transformation für Kreise hat den Nachteil, dass sie nur Kreise mit einem bestimmten Radius findet. Wenn du nur knapp daneben liegst, bilden sich die Peaks nicht mehr besonders deutlich heraus; bei größerer Abweichung klappts gar nicht.


Anmelden zum Antworten