You probably want ImageEnhance.Color .
img = PIL.Image.open('bus.png') converter = PIL.ImageEnhance.Color(img) img2 = converter.enhance(0.5)
This gives an image with half the "color" of the original. This is not the same as half saturation (because half or double saturation usually ends or overflows), but it is probably what you really want most of the time. According to the documents, it works like a โcolorโ pen on a TV.
Here is an example of the same image in colors 0.5, 1.0 and 2.0: 


source share