Linie aus Bild in Pfad umwandeln - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Module (/Forum-LabVIEW-Module) +---- Forum: LabVIEW Vision (/Forum-LabVIEW-Vision) +---- Thema: Linie aus Bild in Pfad umwandeln (/Thread-Linie-aus-Bild-in-Pfad-umwandeln) |
Linie aus Bild in Pfad umwandeln - blueberry99 - 10.03.2014 21:06 Hallo, ich stecke aktuell etwas fest. Ziel ist die Eingabe eines Bildes mit irgendeiner schwarzen Form auf hellem Hintergrund und die Umwandlung dieser Form in einen Pfad, welcher dann an ein Gerät ausgegeben werden soll, damit dieses den Pfad abfährt. Beispiel einer solchen Form: [attachment=48897] Nun habe ich bislang zwar die Form erkennen können und auch eine Kantenerkennung durchgeführt, aber damit bin ich natürlich noch meilenweit von einem pfad entfernt. Ich hoffe ihr versteht etwa worauf ich hinaus will und könnt mir helfen. Noch mal in Kurzform: das was vorn als Bild eingegeben wird, soll hinten von einem Gerät mechanisch ausgegeben werden. Mein Problem bezieht sich aktuell nur auf die Eingabe und umwandlung der Daten in einen Pfad/eine Vektorgrafik lg p.s: ich hab vor Jahren mal mit Labview simple Rechenaufgaben und Schleifen durchgeführt, mit Vision arbeite ich erst seit einigen Wochen. RE: Linie aus Bild in Pfad umwandeln - b.p - 11.03.2014 09:33 Hi, danke fürs Anhängen vom Programm, damit können wir schon mal arbeiten. Kannst du auch noch das Bild mit dazuhängen? Ein paar Fragen, bevor wir das gemeinsam lösen: - Ist die Linie immer gleich dick? - Ist sie immer ein “geschlossener Pfad”? - Kann sie sich kreuzen / aufteilen? - Ist der Startpunkt definiert? Wenn nein, können wir den ganz linken Punkt nehmen? - Weisst du, in welcher Diskretisierung die Ansteuerung gehen soll? - Gibt es einen Grund, warum du das in die Schleife getan hast? Viele Grüsse Birgit RE: Linie aus Bild in Pfad umwandeln - blueberry99 - 11.03.2014 11:38 (11.03.2014 09:33 )b.p schrieb: Hi, hatte ich eigentlich angehangen. hier noch mal. - Ist die Linie immer gleich dick? -> nein, beliebig dick , wobei ab einer bestimmten Dicke nicht mehr die übergabe eines einfachen pfads genügt (beispielsweise bei einem schwarzen Tattoo) aber für den Anfang würde es ein Pfad für eine beliebige strichdicke auch tun - Ist sie immer ein “geschlossener Pfad”? nein, beliebige formen - Kann sie sich kreuzen / aufteilen? ja kann sie - Ist der Startpunkt definiert? Wenn nein, können wir den ganz linken Punkt nehmen? kein startpunkt, kann beliebig gewählt werden, das resultat soll nur auf ein blatt papier passen, von daher ist es natürlich gut, wenn man etwa abschätzen kann, wo das bild entsteht - Weisst du, in welcher Diskretisierung die Ansteuerung gehen soll? Über die Ansteuerung weiß ich leider noch nichts, das gerät scheint aber mit vektorgrafiken zurecht zu kommen - Gibt es einen Grund, warum du das in die Schleife getan hast? damit ich die schwellwerte anpassen kann und gleich die änderung sehe. Ziel war es erst die ausgabe anzupassen und das ergebnis zu sehen, dann auf OK zu klicken und die Daten werden zur ausgabe geschickt. lg RE: Linie aus Bild in Pfad umwandeln - b.p - 11.03.2014 13:38 Tut mir Leid, aber du vermischst da ein bisschen Begriffe. "Pfad nachfahren" / "Vektorgrafik" ist eine sehr schwammige Aufgabenstellung, die je nach Feld was ganz, ganz unterschiedliches sagen. Dieser Satz hier: "wobei ab einer bestimmten Dicke nicht mehr die übergabe eines einfachen pfads genügt (beispielsweise bei einem schwarzen Tattoo) aber für den Anfang würde es ein Pfad für eine beliebige strichdicke auch tun" deutet auf 2 Probleme, die ziemlich unterschiedlich sind. Das eine interpretiere ich als Kanten- oder Konturverfolgung. Das andere beschreibt die Vektorisierung einer Grafik. Was ist für dich ein Pfad? - Ist das ein Array mit einzelnen x-y-Koordinaten? - Hängen die zusammen? - Ist das eine Abfolge an Steuerbefehlen (geh auf Pos x/y) - ist das ein Datenformat, das etwa Linien und geometrische Formen beschreibt, und wenn ja, wie? - ist es ein binarisiertes (also meinetwegen geglättet schwarz-weisses) svg-Bild? Beschreib mal genauer, was du für Daten du wirklich brauchst, damit wir dir helfen können, dort hinzukommen. Das heisst, gibt mir den gewünschten Output. Und zwar nicht "das wird an einen Drucker geschickt", sondern ein Beispieldatensatz. RE: Linie aus Bild in Pfad umwandeln - blueberry99 - 11.03.2014 15:47 Der Begriff "Pfad" stammt bei mir wohl aus der Bildbearbeitung. Da gibt man mit einem Pfad die Form und Richtung eines Elements vor. Gehen wir mal von dem Begriff Pfad weg und hängen uns nicht an worten auf. Also als hoffentlich einfach verständliches Beispiel: Ich gebe das Bild von oben ein, passe eventuell ein paar Einstellungen (schwellwerte etc) für eine bessere ausgabe an, sehe vorab das theoretische ergebnis in einem fenster zur kontrolle und klicke auf ok. anschließend malt mir z.b. ein x-y-schreiber mit einer dünnen bleistiftspitze die eingegebene Form (immer schwarz auf hellem untergrund) auf ein Blatt Papier. Im Folgenden habe ich mal ein paar Beispiele gemalt. Flächen müssten in viele einzelstrichte aufgeteilt werden, da die bleistiftspitze ja sehr dünn ist. Das letzte Beispiel ("optimal") wäre die beste Lösung, wahrscheinlich auch leichter zu erreichen als die "fortgeschrittene". Eure Hilfe würde mir an sich schon bezüglich der simplen Lösung reichen, wenn es zu viel Arbeit ist. Einen Beispieldatensatz kann ich dir nicht geben. lg RE: Linie aus Bild in Pfad umwandeln - b.p - 11.03.2014 17:40 Ich habe nicht nach einem Datensatz gefragt, weil es mir um Begriffe geht (in der Bildbearbeitung gibt es den Begriff des Pfads auch schon lange und er wird sehr unterschiedlich interpretiert und implementiert. Ich war mal aktiver an Inkscape und GIMP beteiligt, da sind so Themen sehr, sehr umstritten.. ) Sondern ich habe den Eindruck, dass du dir erst mal eine "technische" Definition davon machen solltest, was du willst. Ja, die Grafik hilft. Nein, ich kann dir auf Basis davon nicht dein Problem vollständig lösen, weil man eine Ausgabe nur dann erzeugen kann, wenn man weiss, wie sie aussehen soll. Und das ist nun mal ein Beispieldatensatz. Auch wenn man ihn von Hand generiert und er vielleicht nur einen Kreis und eine Linie und eine Fläche beinhaltet. Nichtsdestotrotz, fang ich mal an. Ich hab mir dein Threshold-Programm mal angeschaut. Es ist ganz ok so. Statt dem invertieren hättest du einfach die Schwellen umdrehen können, aber das ist eigentlich egal. Das mit der Schleife ist eine gute Idee, aber wenn du mehr mit so was arbeitest, empfehle ich dir, dass du das Tool Vision Assistant zu Gemüte führst - da kannst du genau diese Funktionalität live durchführen. Ich persönlich würde vermutlich einen dynamischen Threshold einführen, einfach aus dem Grund, weil die meistens stabiler sind. Aber den musst du an deinen Probedaten selber testen. (nein, das soll nicht ein Bild sein, sondern eine ganze Liste von möglichst trivial (Linie, Kreis, Fläche) bis schwer, mit Belichtungen in der gesamten Schwankungsbreite). Das mit dem Kantendetektieren ist vermutlich irreführend. Du findest damit die Konturen - aber die sind dann auch wieder einfach nur Pixel und du hast nix gewonnen. Ein Weg wäre die Konturanalyse. Wie die eingesetzt wird, kannst du zum Beispiel in der Antwort nachschauen, die ich Jan hier gegeben habe: http://www.labviewforum.de/Thread-Bilderkennung-Endpunkte-einer-nicht-geraden-Linie. Da "verfolgen" wir genau eine Linie. Da ich aber nicht der Meinung bin, dass es das ist, was du brauchst, werde ich nur auf Rückfragen darauf eingehen. Du hast geschrieben "das gerät scheint aber mit vektorgrafiken zurecht zu kommen" Genau das werden wir erzeugen. Das mache ich in 2 Schritten: 1) Vorverarbeitung (Binarisierung des Bilds) - leicht adaptiert von dem, was du gemacht hast. Dann ein bisschen Glättung - je "gröber" die Zeichnung ist, desto mehr Information ist ja in so einem Vektorbild drinnen. 2) Umwandlung in ein svg. Das ist nicht etwas, das man selber programmiert, wir rufen dazu ein command-line-Tool auf, das in die Kategorie "tracer" fällt. Das sind Programme, die aus gerasterten Bildern Vektorbilder machen. LabVIEW unterstützt "native" keine Vektorgrafiken, und wenn man nachforscht, wie lange die Community das schon fordert, wird das auch nicht in der näheren Zukunft passieren. Das näheste, was wir daran haben, sind geometric templates und während ich vermutlich was zusammenhacken könnte, das die verwendet, würde das eher einem Gewaltakt gleichen als vernünftigem Arbeiten. Es gibt meines Wissens nach 2 vernünftige OpenSource-Tracer-Projekte. Eines davon ist Autotrace (http://www.autotracer.org/), das andere Potrace (http://potrace.sourceforge.net/). Autotrace wird zB in ImageMagick verwendet, Potrace in Inkscape. Beide haben Stärken und Schwächen, ich nehme hier mal Potrace. Sie sind GPL lizensiert (aber zumindest Potrace kann man auch so kaufen), zum Thema GPL-Lizenz in kommerziellen Projekten liest du am besten hier nach: https://blog.codecentric.de/2012/05/verwendung-gpl-lizenzierter-komponenten-in-kommerziellen-projekten/ Downloade Potrace, schmeiss es in einen Ordner, und versuch es mal, mit einem Testbild auszuführen. Code: potrace -s test.bmp Wenn ich das Testbild im Anhang als svg ausgeben lasse, krieg ich sowas: Code: <?xml version="1.0" standalone="no"?> Das ist ne relativ saubere Vektorgrafik, die auch in gerendert recht schick aussieht. Wenn dein Drucker was anderes braucht, schau mal, ob er eps oder dxf kann. Das ist ebenfalls eine Option bei der Ausführung von potrace. Falls nötig, kann man auch die Skalierung manipulieren, entweder durch direkte Manipulierung der transform Zeile (sh unten) oder (schlauer) durch Kommandozeilenbefehle. Code: <g transform="translate(0.000000,765.000000) scale(0.100000,-0.100000)" Das ist alles andere als elegant, aber es ist einfach, und möglicherweise einfach genug, um dein Problem zu lösen. Bitte schau dir den Quellcode an, ändere ihn so ab, dass er auf deinem PC geht und recherchier als nächsten Schritt, was du wirklich als Daten brauchst. Für einen Kreis, eine Linie und eine Fläche. Birgit |