JU-87-B STUKA - 3D-Modellumsetzung
St. Stoske, A. Reichenbach

START     ZURÜCK     WEITER

Vorbereitung
1. Bauplan entzerren

Die meisten Baupläne für solche Flug- oder Dekorationsmodelle aus Holz in Rippenbauweise stammen aus den 50er bis 70er Jahren und sind oft per Hand in Tusche gezeichnet. Die Genauigkeit ist für einen Nachbau im gedachten Sinne ausreichend hoch, aber im Vergleich zu heutigen Möglichkeiten sehr begrenzt. Dazu kommt, dass die Vorlage gedruckt wurde, wodurch sie das erste Mal verzerrt wurde. Eine anschliessende Fotokopie sorgte für weitere Verzerrungen, ebenso der Scannvorgang.

Der Bauplan ist etwas kleiner als DIN A0 und muss mit etwa 150 dpi gescannt werden damit sich die Formen in einem vektororientierten Programm noch gut nachzeichnen lassen. Um noch Raum für eine Interpolation durch Verkleinerung zu haben, erfolgt der Scann mit 300 dpi.
Der Plan wird nicht vollständig gescannt, sondern jeweils nur die benötigten Teile, bzw. jene die dicht beieinander liegen. Die Scannfläche wird soweit vergrößert, bis eine waagerechte Hilfslinie (z.B. vom Rand) mit erfasst wird.

Die Verzerrungen des Bauplans, der etwas kleiner als DIN A0 ist, sind wie bei den meisten Reproduktionen prinzipiell nur in einer Richtung ausgeprägt. Das liegt daran, dass alle Prozesse - der Druck, die Fotokopie, das Einscannen - in Längsrichtung verlaufen.

Hier läßt sich der gescannte Ausschnitt zwar so drehen, dass die senkrechten Linien genau gerade sind, aber über die Breite von gut 60 cm haben sich zahlreiche Verzerrungen angesammelt. Diese sind selten so ausgeprägt wie die Welle im Bild links, aber in der Regel mehr oder weniger stark vorhanden.

Indem das Bild stark in eine Richtung gestaucht wird, werden die Verzerrungen deutlicher. Im rechten Bild sieht man sie besonders an der unteren Linie und dem obersten Bauteil.

Die eingescannte Hilfslinie wird wenn nötig an den unteren Rand verschoben oder kopiert. Wenn wir davon ausgehen, dass die Hilfslinie ursprünglich genau gerade war, dann können wir die Verzerrungen des Bildes zurücknehmen, indem wir den Verlauf der Linie als Versatz verwenden.
Die Linie muss dazu durchgängig sein und Schwarz auf Weiss liegen, in diesem Falle wird die gestrichelte Linie zuvor mit einem Vektor genau nachgezeichnet.

Nun kann durch einfaches Abtasten der Punkte vom unteren Rand aus die Dicke der Linie ermittelt werden. Daraus wird die Mitte der Linie abgeleitet und somit auch der Offset dieser Spalte. Sie muss dann nur noch entsprechend verschoben werden.

Weil sich u.U. mehrere Tausend Spalten schlecht von Hand verschieben lassen, programmiere ich diesen Prozess in REALbasic. Das Listing unten lädt ein verzerrtes Bild, ermittelt für jede Spalte den Offset anhand der vorbereiteten Grundlinie, verschiebt die Spalten entsprechend und speichert das neue Bild unter anderem Namen wieder ab.

Die Grundlinie ist im Resultat dann völlig gerade und die Zeichnung entspricht wieder weitestgehend ihrer ursprünglichen Form. In der Überlagerung sieht man deutlich wie stark die Form korrigiert wurde. Freilich kann sie nicht genauer sein als die zugrunde liegende Zeichnung, denn hier wurden nur die Verzerrungen entfernt die nachträglich hinzukamen. Die erste echte Erhöhung der Auflösung erfolgt bei der Vektorisierung.

// REALbasic-Listing zur Entfernung von
// Druck- und Reproduktions-Verzerrungen
// anhand vorbereiteter Referenz-Linie

dim x, y, w, h as integer
dim KanteU, KanteO, Diff, Off, StartPos as integer
dim file as folderItem
dim pic as picture
dim gr as graphics

file = getFolderItem( "" ).child( "Bild" )

pic = file.openAsPicture
w = pic.width - 1
h = pic.height - 1
gr = pic.graphics

for x = 0 to w

  y = h
  while gr.pixel( x, y ).red = 255
    y = y - 1
  wend
  KanteU = y

  y = y - 10
  while gr.pixel( x, y ).red < 255
    y = y - 1
  wend
  KanteO = y + 1

  Diff = ( KanteU - KanteO ) / 2

  if Off = 0 then
    Off = KanteU - Diff
    StartPos = Off
  else
    Off = Off + ( ( KanteU - Diff ) - Off ) / 2
  end if

  pic.graphics.drawpicture p, x, StartPos-Off, 1, h, x, 0, 1, h

next

file = getFolderItem( "" ).child( "BildNeu" )
file.saveAsPicture pic

 

Hinweise zum Code:

Das Bild wird in p geladen und mit der X-Schleife spaltenweise durchlaufen. Die erste While-Schleife ermittelt von unten den ersten nicht weissen Punkt, dies ist die untere Kante der Hilfslinie (KanteU).

Die Y-Position wird um 10 Pixel weitergesetzt damit die nächste While-Schleife in der Linie startet. Sie ermittelt nach oben den nächsten weissen Punkt, dies ist die obere Kante der Linie (KanteO). Mit Diff wird die Dicke der Linie berechnet und dieser Wert durch zwei geteilt, was der Mitte der Linie entspricht.

Wenn der Offset noch nicht gesetzt wurde (Off = 0) dann wird die Startposition ermittelt und gespeichert. In allen folgenden Spalten wird von der Startposition der jeweilge Offset abgezogen. Der Wert beeinflusst die so entstehende Kurve nur zu 50% (/2) damit Fehlpixel oder Ausreisser unterdrückt werden. Die letzte Zeile in der Schleife liesst die aktuelle Spalten aus und schreibt sie versetzt zurück. Danach wird das entzerrte Bild mit neuem Namen gespeichert.

Der Code lässt sich recht einfach adaptieren oder anpassen, das Prinzip kann auch für ähnliche Aufgabe umgesetzt werden.