Zur Hauptnavigation springen [Alt]+[0] Zum Seiteninhalt springen [Alt]+[1]

Manipulation der Pixelpositionen

 

Bei allen bisherigen Operationen sind die Pixel an ihren Positionen verblieben. Viele Operationen (Spiegeln, Drehen, Größe ändern, Verzerren usw) verändern aber die Position der Pixel. Dabei sind zwei Vorgehensweisen denkbar:

  1. Man durchläuft jedes Pixel des neuen Bildes und berechnet dessen Farbe aus den alten Pixeln. Im einfachsten Fall kann man die Farbe eines bestimmten alten Pixels übernehmen.
  2. Man durchläuft jedes Pixel des alten Bildes und überlegt, wo das Pixel im neuen Bild zu finden ist.

z.B. horizontales Spiegeln:
Variante 1: pixelNeu[x][y] = pixel[(breite-1)-x][y];
Variante 2: pixelNeu[(breite-1)-x][y] = pixel[x][y];

Variante 2 passt besser zu der Vorstellung, dass die alten Pixel auf neue Positionen verschoben werden. Dies setzt aber voraus, dass jedes Pixel auf genau eine neue Position abgebildet wird. Das ist bei der Spiegelung der Fall, aber im Allgemeinen nicht. Bei einer Vergrößerung oder Verkleinerung des Bildes oder auch beim Drehen eines Bildes gilt dies nicht. Dort muss für jedes Pixel entschieden werden, wie die Farbe ermittelt wird. Das kann z.B. mit nearest-Neighbor-Verfahren oder mit bilinearer Interpolation geschehen.

Relativ leicht kann man sich das vorstellen, wenn die Breite und Höhe halbiert werden. Bei der Halbierung werden je 2x2 Pixel zu einem neuen Pixel. Dieses Pixel kann nun entweder die Farbe des linken oberen Pixels bekommen oder den Durchschnitt der vier Pixel. Wird nur ein Pixel verwendet, nimmt man in der Regel des, das dem neuen Pixel bei der Skalierung am nächsten liegt. Dieses Verfahren nennt sich „nächster Nachbar“-Verfahren (nearest neighbor). Der Durchschnitt der vier Pixel ergibt sich, wenn man eine bilineare Interpolation wählt, da das neue Pixel genau in der Mitte der vier alten Pixel liegt.

Nearest Neighbor

Bei diesem Verfahren muss für jedes Pixel des neuen Bildes berechnet werden, an welcher Stelle dieses Pixel im alten Bild gelegen hätte:

x alt = x neu breite neu - 1 ( breite alt - 1 ) y alt = y neu hoehe neu - 1 ( hoehe alt - 1 )

Bilineare Interpolation

Bilineare Interpolation

Bildquelle: BilinearInterpolation.svg [ PD ], via Wikimedia Commons

Zunächst wird wie beim nearest neighbor-Verfahren die Position des neuen Pixels (P) im alten Bild berechnet. Diese Koordinaten fallen in der Regel nicht genau auf ein Pixel des alten Bildes (Q11 bis Q 22). Um die Farbe des neuen Pixels zu ermitteln, werden nun die vier umliegenden Pixel des alten Bildes in richtigen Gewichtungen herangezogen. Dabei werden zunächst die Farben von den Punkten R 1 und R2 durch lineare Interpolation zwischen den Pixels Q11 und Q21 bzw. Q12 und Q 22 und dann die Farbe von P durch lineare Interpolation zwischen R1 und R2 bestimmt.

Wenn x und y Werte zwischen 0 (genau bei x1 bzw. y1) und 1 (genau bei x2 bzw. y2) sind, dann ergibt sich folgende Formel:

I P = I Q 11 ( 1 - x ) ( 1 - y ) + I Q 12 ( 1 - x ) ( y ) + I Q 21 ( x ) ( 1 - y ) + I Q 22 ( x ) ( y )

Diese Werte werden auf ganze Zahlen gerundet, um den nächsten Nachbarn zu finden. Dieses Verfahren hat zwei Nachteile: Zum einen bekommen schräg verlaufende Linien durch die Rundungen „Knicke“. Zum anderen wird das Bild bei Vergrößerung pixelig, da z.B. bei einem Vergrößerungsfaktor von 2 ein 2x2 Feld die Farbe eines einzigen Pixels des alten Bildes bekommt.

Liegt P genau in der Mitte der vier Punkte, dann werden alle vier umliegende Punkte mit dem Faktor ¼ gewichtet.

Die Ergebnisse der bilinearen Interpolation sind erheblich besser als die des nearest neighbor-Verfahrens. Noch besser ist die bikubische Interpolation, die versucht, die Farbe von P mit noch mehr umliegenden Punkten anzunähern. Hier kommen kubische Splines zum Einsatz (vgl. IMP Mathematik Klasse 9).

 

Hintergrund zur digitalen Bildbearbeitung: Herunterladen [odt][19 MB]

Hintergrund zur digitalen Bildbearbeitung: Herunterladen [pdf][1,5 MB]

 

Weiter zu Sonstiges