Einzelnen Beitrag anzeigen

Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

[Unit] Vektorisieren von Bitmaps

  Alt 1. Mai 2009, 19:53
Hallo,

ich habe heute (ich wollte das schon länger mal machen) eine kleine Unit geschrieben, die die Umrisse eines Bitmaps in ein Polygon umwandelt.

Diese Funktionalität steckt in der Unit "AdVectorize.pas". Diese hat einige kleinere Abhängigkeiten zu Andorra 2D, mit einigen kleineren Abänderungen sollte sich diese Abhängigkeit jedoch einfach entfernen lassen.

Funktionsweise:
Zunächst werden alle Randpixel des Bitmaps erkannt und in eine Liste geschrieben. Der Vektorisierungsalgorithmus nimmt den ersten Punkt aus der Liste und sucht mit sich erhöhendem Suchradius nach einem weiteren Randpixel in der Nähe. Wird ein einziger Pixel gefunden, so wird dieser an das Ergebnispolygon angehängt und die Sache beginnt von neuem. Werden zwei oder mehr Pixel gefunden, so teilt sich der Löser in zwei Hälften auf: Zwei verschiedene Pixel werden ausprobiert. Es entsteht so ein binärer Baum. Am Ende wird das "Blatt", das die meisten Randpixel verarbeitet hat, als Lösung verwendet. Sind Pixel übrig geblieben, so wird versucht auch aus diesen ein weiteres Polygon zu "basteln".

Die Idee für einen solchen Algorithmus hatte ich schon vor eins oder zwei Jahren. Darüber, wie dieses Problem standardmäßig angegangen wird habe ich mich nicht informiert.

Vielleicht kann das Ganze jemand gebrauchen. Die Lösung ist nicht die schnellste - funktioniert aber erstaunlich gut.

Im Archiv ist ein Beispielprogramm vorhanden.

Andreas
Miniaturansicht angehängter Grafiken
screenshot_453.png  
Angehängte Dateien
Dateityp: 7z outline_146.7z (209,3 KB, 62x aufgerufen)
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat