private static ushort[] CalculateLUT(double brightness = 1.0, double contrast = 0.5, double gamma = 2.8)
const int dataPoints = 256;
gamma = Math.Min(Math.Max(gamma, 0.4), 2.8);
contrast = (Math.Min(Math.Max(contrast, 0), 1) - 0.5) * 2;
brightness = (Math.Min(Math.Max(brightness, 0), 1) - 0.5) * 2;
var offset = contrast > 0 ? contrast * -25.4 : contrast * -32;
var range = (dataPoints - 1) + offset * 2;
offset += brightness * (range / 5);
var result = new ushort[dataPoints];
for (var i = 0; i < result.Length; i++)
var factor = (i + offset) / range;
factor = Math.Pow(factor, 1 / gamma);
factor = Math.Min(Math.Max(factor, 0), 1);
result[i] = (ushort)Math.Round(factor * ushort.MaxValue);
public static void Main()
ushort [] result = CalculateLUT();
foreach(ushort i in result){