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-Bilder...den-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/verw...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"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="857.000000pt" height="765.000000pt" viewBox="0 0 857.000000 765.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,765.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M3440 7069 c-30 -4 -98 -10 -150 -13 -185 -12 -316 -43 -583 -137
-175 -62 -438 -183 -487 -223 -8 -7 -37 -25 -65 -41 -261 -147 -673 -623 -901
-1040 -118 -215 -187 -388 -250 -630 -9 -33 -36 -100 -60 -150 -25 -49 -61
-135 -80 -190 -29 -84 -35 -117 -36 -195 l-2 -95 57 -100 c56 -97 83 -128 200
-227 58 -50 247 -165 334 -204 29 -12 100 -51 157 -85 88 -52 120 -79 193
-159 75 -83 95 -112 134 -201 62 -139 105 -243 124 -304 8 -27 35 -113 59
-190 25 -77 57 -182 71 -233 15 -51 45 -135 68 -187 38 -86 53 -106 162 -221
103 -109 231 -214 260 -214 5 0 22 -10 39 -23 52 -39 295 -154 396 -186 255
-83 487 -132 770 -162 491 -52 533 -54 790 -52 138 1 253 7 320 18 58 9 137
20 175 25 39 4 90 13 115 18 25 6 81 18 125 27 171 36 263 57 330 76 39 11 93
26 120 33 28 7 86 28 130 46 44 17 101 41 127 51 59 23 246 130 313 178 28 19
96 76 153 125 179 156 377 441 489 707 67 158 76 183 92 249 59 244 74 379 66
605 -10 318 -16 362 -92 655 -48 182 -71 241 -215 540 -77 161 -109 222 -135
256 -13 17 -23 36 -23 42 0 6 -18 32 -40 57 -22 26 -61 79 -87 118 -130 199
-249 323 -539 557 -37 30 -122 102 -189 160 -175 151 -230 197 -278 234 -65
49 -174 113 -226 132 -25 10 -62 32 -81 50 -19 18 -78 55 -130 82 -52 27 -122
64 -155 82 -270 146 -359 184 -495 210 -25 5 -110 24 -190 43 -80 19 -188 40
-240 47 -52 6 -111 16 -130 20 -95 24 -398 36 -510 19z m390 -134 c160 -14
254 -28 390 -59 36 -8 115 -26 175 -39 190 -42 267 -67 380 -124 212 -106 370
-197 413 -236 24 -22 87 -59 140 -83 54 -25 115 -54 137 -66 43 -23 172 -125
245 -194 25 -24 59 -53 77 -66 17 -13 112 -90 210 -172 286 -239 321 -276 552
-593 73 -100 231 -379 231 -408 0 -3 25 -61 56 -128 88 -192 103 -228 119
-297 9 -36 23 -83 31 -105 30 -82 71 -337 75 -470 9 -296 3 -387 -41 -600 -23
-112 -26 -121 -89 -277 -84 -211 -193 -391 -358 -592 -49 -59 -86 -92 -252
-223 -70 -56 -278 -172 -346 -193 -22 -7 -45 -16 -50 -21 -37 -29 -239 -85
-530 -148 -582 -126 -784 -132 -1565 -47 -425 47 -764 145 -1055 308 -190 106
-173 93 -286 215 -121 129 -161 211 -239 487 -48 170 -140 437 -178 517 -112
238 -98 216 -217 344 -105 113 -176 166 -323 242 -332 172 -448 258 -510 377
-36 69 -37 74 -36 172 1 105 20 175 65 232 17 23 82 215 94 282 16 90 83 277
141 398 35 73 64 135 64 137 0 10 128 214 213 340 170 252 462 559 638 671
120 76 151 94 239 141 95 51 407 173 510 200 30 8 80 23 110 33 60 20 200 37
405 49 184 11 182 11 365 -4z"/>
</g>
</svg>
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