# # The Python Imaging Library. # $Id$ # # image enhancement classes # # For a background, see "Image Processing By Interpolation and # Extrapolation", Paul Haeberli and Douglas Voorhies. Available # at http://www.graficaobscura.com/interp/index.html # # History: # 1996-03-23 fl Created # 2009-06-16 fl Fixed mean calculation # # Copyright (c) Secret Labs AB 1997. # Copyright (c) Fredrik Lundh 1996. # # See the README file for information on usage and redistribution. # from __future__ import annotations from . import Image, ImageFilter, ImageStat class _Enhance: image: Image.Image degenerate: Image.Image def enhance(self, factor: float) -> Image.Image: """ Returns an enhanced image. :param factor: A floating point value controlling the enhancement. Factor 1.0 always returns a copy of the original image, lower factors mean less color (brightness, contrast, etc), and higher values more. There are no restrictions on this value. """ return Image.blend(self.degenerate, self.image, factor) class Color(_Enhance): """Adjust image color balance. This class can be used to adjust the colour balance of an image, in a manner similar to the controls on a colour TV set. An enhancement factor of 0.0 gives a black and white image. A factor of 1.0 gives the original image. """ def __init__(self, image: Image.Image) -> None: self.image = image self.intermediate_mode = "L" if "A" in image.getbands(): self.intermediate_mode = "LA" if self.intermediate_mode != image.mode: image = image.convert(self.intermediate_mode).convert(image.mode) self.degenerate = image class Contrast(_Enhance): """Adjust image contrast. This class can be used to control the contrast of an image, similar to the contrast control on a TV set. An enhancement factor of 0.0 gives a solid gray image. A factor of 1.0 gives the original image. """ def __init__(self, image: Image.Image) -> None: self.image = image if image.mode != "L": image = image.convert("L") mean = int(ImageStat.Stat(image).mean[0] + 0.5) self.degenerate = Image.new("L", image.size, mean) if self.degenerate.mode != self.image.mode: self.degenerate = self.degenerate.convert(self.image.mode) if "A" in self.image.getbands(): self.degenerate.putalpha(self.image.getchannel("A")) class Brightness(_Enhance): """Adjust image brightness. This class can be used to control the brightness of an image. An enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the original image. """ def __init__(self, image: Image.Image) -> None: self.image = image self.degenerate = Image.new(image.mode, image.size, 0) if "A" in image.getbands(): self.degenerate.putalpha(image.getchannel("A")) class Sharpness(_Enhance): """Adjust image sharpness. This class can be used to adjust the sharpness of an image. An enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the original image, and a factor of 2.0 gives a sharpened image. """ def __init__(self, image: Image.Image) -> None: self.image = image self.degenerate = image.filter(ImageFilter.SMOOTH) if "A" in image.getbands(): self.degenerate.putalpha(image.getchannel("A"))