Ah OK, then I have misunderstood the question. 
I can’t find the underlying implementation in PIL, so take this information with a grain of salt:

brightness: is an additive variable, which is directly added (or subtracted) to the image
contrast: slope, which is a multiplicative factor for each pixel value
hue: not sure, if there are other methods, but you could transform the RGB values to HSV and change the hue on the color wheel.
saturation: HSV conversion would work, otherwise should be:

color_max = max(R, G, B)
color_min = min(R, G, B)

if R == G == B:
    S = 0
else:
    S = 255 * (color_max - color_min) / (color_max + color_min)