Vorlesung Informatik 2 - Teil A: Java Kurs

8.7 Band-Combine Filter

In unserem Letzten Kapitel werfen wir einen Blick auf eine weitere Filter-Klasse: BandCombineOp.

Wie die Lookup-Table Filter arbeiten diese Filtern ausschließlich mit den Daten eines Pixels, also ohne die umgebenden Pixel einzubeziehen wie die Convolution-Filter.

Die neuen Farbwerte eines Pixels werden als Linearkombination aller original-Farbwerte neu berechnet, also z.B. wird der neue Rot-Wert R' aus den bisherigen Farbwerten R,G,B wie folgt ermittelt:

R' = a*R + b*G + c*B

wobei a,b und c frei wählbare Koeffizienten sind.

Für alle drei Farbwerte kann man das als Matrix mal Vektor Multiplikation schreiben:

   R'           C11   C12   C13        R
   G'    =     C21  C22 C23       G 
   B'          C31   C32   C33        B    

Die Berechnung kann auch auf den Alphakanal ausgeweitet werden. Es sind also ähnlich wie bei den Lookup-Tabellen sehr viele Farbtransformationen möglich. Bei den Koeffizienten sollte man darauf achten, dass zu keinen Clipping-Effekten kommt wenn die resultierenden Farbwerte die 255 überschreiten.

In Java geht man wie folgt vor:

float[][] m =  {{0.3f, 0.3f, 0.3f},
                {0.3f, 0.3f, 0.3f},
                {0.3f, 0.3f, 0.3f}};
RasterOp operation = new BandCombineOp(m, null);

Die im Beispiel verwendete Matrix wäre eine Mittelung aller Farbwerte, also ein einfacher Graufilter.

Beispiele:

  1  0  0                          1  0  0
  0  1  0  Einheitmatrix,          0  0  0   nur Rot-Anteil 
  0  0  1  keine Änderung          0  0  0   

  0  0   0      Nur Grün,             0.28  0.55   0.13  
 0.3 0.3 0.3    aber mit allen        0.25  0.49   0.12    Sepia
  0   0   0     Nuancen               0.19  0.38   0.09
   

Allerdings muss man genau darauf achten, dass durch die Transformation keine Farbwerte größer als 255 erzeugt werden. Die API Dokumentation sagt zwar nicht, was in diesem Fall passiert, aber durch Probieren sieht man, dass sofort Fehlfarben entstehen.   


Lehrvideo (YouTube)