Met de klasse ConvolutionFilter kunt u allerhande afbeeldingstransformaties toepassen op weergave- of BitmapData-objecten, zoals wazig maken, randdetectie, scherper maken, stansen en schuine rand.
Het convolutiefilter doorloopt een voor een alle pixels in de bronafbeelding en stelt de definitieve kleur van elke pixel vast aan de hand van de waarde van de pixel en de omringende pixels. Een matrix, die is opgegeven als een array van numerieke waarden, geeft aan in welke mate de waarde van elke afzonderlijke naastgelegen pixel de uiteindelijk resulterende waarde beïnvloedt.
Bekijk het type matrix dat het meest wordt gebruikt. Dit is een drie bij drie-matrix. De matrix bevat negen waarden:
N N N
N P N
N N N
Wanneer de convolutiefilter wordt toepast op een bepaalde pixel, wordt zowel naar de kleurwaarde van de pixel zelf (in het voorbeeld ‘P’) als naar de waarden van de omringende pixels (in het voorbeeld aangeduid als ‘N’) gekeken. U kunt echter waarden in de matrix instellen om op te geven hoeveel prioriteit bepaalde pixels hebben bij het beïnvloeden van de resulterende afbeelding.
De volgende matrix die is gemaakt met een convolutiefilter, laat bijvoorbeeld een afbeelding precies zoals deze was:
0 0 0
0 1 0
0 0 0
De afbeelding blijft ongewijzigd omdat de oorspronkelijke pixelwaarde een relatieve sterkte heeft van 1 bij het vaststellen van de definitieve pixelkleur, terwijl de omringende pixelwaarden een relatieve sterkte van 0 hebben (wat betekent dat de kleuren geen invloed hebben op de uiteindelijke afbeelding).
Op dezelfde manier zorgt deze matrix ervoor dat de pixels van een afbeelding een pixel naar links verschuiven:
0 0 0
0 0 1
0 0 0
In dit geval heeft de pixel zelf geen effect op de definitieve waarde van de pixel die wordt weergegeven op die locatie in de uiteindelijke afbeelding. Alleen de waarde van de pixel rechts ervan wordt gebruikt voor het vaststellen van de resulterende waarde van de pixel.
In ActionScript kunt u de matrix toepassen als een combinatie van een instantie Array met de waarden en twee eigenschappen die het aantal rijen en kolommen in de matrix opgeven. In het volgende voorbeeld wordt een afbeelding geladen en wordt na het laden een convolutiefilter toegepast op de afbeelding met behulp van de matrix uit het vorige voorbeeld:
// Load an image onto the Stage.
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg");
loader.load(url);
this.addChild(loader);
function applyFilter(event:MouseEvent):void
{
// Create the convolution matrix.
var matrix:Array = [0, 0, 0,
0, 0, 1,
0, 0, 0];
var convolution:ConvolutionFilter = new ConvolutionFilter();
convolution.matrixX = 3;
convolution.matrixY = 3;
convolution.matrix = matrix;
convolution.divisor = 1;
loader.filters = [convolution];
}
loader.addEventListener(MouseEvent.CLICK, applyFilter);
Wat niet direct voor de hand ligt in deze code, is het effect van het gebruik van andere waarden in de matrix dan 1 of 0. Dezelfde matrix met bijvoorbeeld het getal 8 in plaats van 1 in de positie rechts, voert dezelfde handeling uit (pixels verschuiven naar links). De kleuren van de afbeelding worden ook beïnvloed en worden 8 keer lichter weergegeven. Dit komt doordat de definitieve pixelkleurwaarden worden berekend door vermenigvuldiging van de matrixwaarden met de oorspronkelijke pixelkleuren, waarbij de waarden bij elkaar worden opgeteld en worden gedeeld door de waarde van de eigenschap
divisor
van het filter. In het codevoorbeeld is de eigenschap
divisor
ingesteld op 1. Wanneer u wilt dat de helderheid van de kleuren gelijk blijft aan de helderheid in de oorspronkelijke afbeelding, moet u ervoor zorgen dat de deler gelijk is aan de som van de matrixwaarden. Bij een matrix met een totale waarde van 8 en een deler van 1 is de resulterende afbeelding ruwweg 8 keer lichter dan de oorspronkelijke afbeelding.
Hoewel het effect van deze matrix niet direct opvalt, kunnen andere matrixwaarden worden gebruikt voor het toepassen van verschillende effecten. Hieronder volgen diverse standaardsets van matrixwaarden voor verschillende effecten bij het gebruik van een drie bij drie-matrix:
-
Standaard vervagen (deler 5):
0 1 0
1 1 1
0 1 0
-
Verscherpen (deler 1):
0, -1, 0
-1, 5, -1
0, -1, 0
-
Randdetectie (deler 1):
0, -1, 0
-1, 4, -1
0, -1, 0
-
Reliëfeffect (deler 1):
-2, -1, 0
-1, 1, 1
0, 1, 2
Bij de meeste van deze effecten is de deler 1. Dit komt doordat de negatieve matrixwaarden opgeteld bij de positieve matrixwaarden resulteren in 1 (of 0 in het geval van randdetectie, de waarde van de eigenschap
divisor
kan echter niet 0 zijn).