Programmierpraktikum in Rasterbildern Fakultät für Mathematik und Informatik Datenbanksysteme für neue Anwendungen FernUniversität in Hagen 8.Oktober 2016 c 2016 FernUniversität in Hagen
Übersicht 1 Raster- und Vektorbilder 2 3 4 Erzeugung eines Schwarz-Weiß-Bilds Behandlung von Behandlung von 5
Rasterbilder 2-dimensionales Gitter jeder Gitterzelle (Pixel) wird Farbe zugewiesen Farbe oft als RGB, möglicherweise transparent empfindlich gegenüber Vergrößern (Treppeneffekt) Vektorbilder Beschreibung von geometrischen Objekten (Polylinien, Kurven, Gebiete) Objekte haben Eigenschaften (stärke, Farbe...) unempfindlich beim Vergrößern
Rasterbild Vektorbild Filled, Red,
Konvertierung eines Rasterbildes in ein Vektorbild zwei Varianten (geeignet für Fotos) echte (geeignet für technische Zeichnungen) alle Zwischenschritte sichtbar zurück immer möglich Speichern als SVG-Datei Motivation verlustfreies Vergrößern möglich ggf. kleinere Dateigröße auf Plotter möglich
gesamtes Bild wird durch eine einzige Linie dargestellt verlauf approximiert Graustufen des Bildes nur wenige Graustufen geeignet für kleine Fotos recht simpel zwei Verfahren
Pixel des Rasterbildes werden in bestimmter Reihenfolge besucht verlauf innerhalb des Pixels variiert je dunkler ein Pixel ist, desto mehr Linie wird eingeschrieben Original -Verfahren
Besuchsrichtungen & Füllung Drei Besuchsrichtungen: Horizontal Vertikal Spiralförmig Mögliche Füllung eines weißen und eines schwarzen Pixels
raumfüllende Kurve minimaler und maximaler Level gegeben Level bestimmt wahrgenommene Helligkeit eines Bereichs Level 1 Level 2 Level 3
Beispiel Original
Schritte: Umwandlung des Bildes in Schwarz-Weiß-Bild Separate Behandlung von Flächen im Bild Ausdünnung von Vereinfachung von
Erzeugung eines Schwarz-Weiß-Bilds Entfernen von Transparenz Umwandeln in Graustufen Schwellwert legt fest, ob Pixel weiß oder schwarz wird
Behandlung von Bilder können ausgefüllte Objekte enthalten Erkennen von Separate Behandlung erkannter Zusammenführen mit
Erkennen von maximale dicke Distanzmatrix Distanz zu groß Teil einer Region ggf. weitere Pixel hinzunehmen aus dem Bild entfernen separate Behandlung von und
Distanzmatrix 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 1 2 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 2 2 2 3 2 1 1 1 0 0 0 0 0 0 0 0 1 0 1 2 3 3 3 4 3 2 2 2 1 0 0 0 0 0 0 0 1 1 2 3 4 4 4 4 3 3 3 2 1 0 0 0 0 0 0 0 0 1 2 3 3 4 4 3 2 3 3 2 1 1 0 0 0 0 0 0 0 1 2 2 2 3 3 2 1 2 2 1 0 1 0 0 0 0 0 0 0 1 2 1 1 2 2 1 0 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
Behandlung der Zwei Varianten: Füllen mit Muster verschiedene Richtungen, Füllabstand einstellbar Kontur beliebige Kombinationen erlaubt Zusammenführen mit auf Vektorebene Zerlegen in aus Bild werden nach und nach mit geg. dicke entfernt Zentrum der Linie sind die Skelettpunkte der Region Skelettpunkt: maximaler Distanzwert mit direkten Nachbarn (4) Zusammenführen mit auf Rasterebene
Beispiel gefüllte Region gesplittete Region
Skelettierung können mehrere Pixel dick sein Problem: optimale Linie finden Idee: Linie auf einen Pixel Breite reduzieren Sukkzessives Entfernen von Randpunkten zum Entfernen müssen bestimmte Bedingungen erfüllt sein
Beispiel
Nachzeichnen verlängere Linie, solange eindeutig möglich Kreuzungspunkt, Alternativen: verlängere beliebig versuche,bisherige Richtung beizubehalten versuche, in die 4 Hauptrichtungen weiterzugehen Start eines neuen zugs Ergebnis: Menge von Polylinien
Vereinfachung und jede Polylinie einzeln kann Treppenbildung beim Vergrößern vermeiden Algorithmus: DP (p : polyline, eps : real): // p = <p_1,...,p_n) if n = 2 then return p; let s := <p_1,p_n>; berechne die Distanz von allen p_j zu s; if maximale Distanz <= eps then return s; sei p_i ein Punkt mit maximaler Distanz; return concat(dp(<p_1,...,p_i>, eps), DP(<p_i,...,p_n>, eps));
als SVG-Datei Kurze Beschreibung in der Aufgabenstellung detailliert unter: https://www.w3.org/tr/svg11/
Noch Fragen?