Eigendlich gibt es dafür nur 2 Lösungen.
1. Die Pixelshader, welche sich allerdings nur umständlich auf eine BitmapSource anwenden lassen:
-BitmapSource in einem ImageControl anzeigen
-Shader aufs ImageControl anwenden
-Dafür sorgen dass das ImageControl platziert wird (Arrange())
-Per RenderTargetBitmap einen Screenshot vom ImageControl machen
Die RenderTargetBitmap die am Schluss rauskommt ist dann wieder eine BitmapSource
2. Manuell alle Pixel durchlaufen. Das ist wie bereits gesagt etwas langsamer als die Shader. Wenn du mit dieser Methode Performance rausschlagen willst wird dir wohl nichts anderes übrig bleiben als ihn auf C-Ebene auszulagen. Nativer Code ist ja bekanntlich schneller. Zuerst würde ich das allerdings erst mal ausprobieren. Evtl. ist es ja gar nicht soooo langsam.
Ein Kontrastfilter wird allerdings bei beiden Varianten gleich komplex sein da du ihn selbst programmieren musst. Wenn du etwas darüber nachdenkst gestaltet sich das allerdings meißt als weniger kompliziert wie man zunächst annimmt.
Hier z.B. der HLSL-Code (Shader) für einen Sättigugnsfilter aus meinem Code:
float4 main(float2 uv : TEXCOORD) : COLOR
{
//Quellpixel holen
float4 srcPixel = tex2D(input, uv);
//Helligkeits-Wert anhand des Vektorprodukts vom Quellpixel und einem Standardwert berechnen
//Der Standardwert ist weit verbreitet und wird auch von NTSC und JPEG verwendet
float luminance = dot(srcPixel,float3(0.299,0.587,0.114));
//Mit einer Linearen interpolation (lerp) einen Wert zwischen den ausgegrauten wert und dem OriginalPixel ermitteln
float4 dstPixel = lerp(luminance,srcPixel,saturationValue);
//Alpha-Kanal bleibt unberührt
dstPixel.a = srcPixel.a;
return dstPixel;
}
Solche Code-Schnipsel solltes du auch massig im Internet finden. Die werden in die Spieleprogrammierung schon seit zig Jahren eingesetzt (wenn auch weniger in der C#-Welt (ausser XNA)). Siehe hier:
http://www.gamedev.net/
Wenn du die Berechnung per Software machst wirst du warscheinlich den gleichen Code einfach auf C# (oder C) übersetzen müssen. Das sollte nicht allzu kompliziert sein.