[Image-SIG] roop found an interesting flaw in PIL's ImageEnhance.py

Scott David Daniels Scott.Daniels at Acm.Org
Mon Jun 15 23:06:58 CEST 2009


roop wrote:
 > I was browsing ImageEnhace.py, and found something that I thought was
 > odd in class Contrast:
 >
 > class Contrast(_Enhance):
 >     "Adjust image contrast"
 >     def __init__(self, image):
 >         self.image = image
 >         mean = reduce(lambda a,b: a+b, image.convert("L").histogram())/
 > 256.0
 >         self.degenerate = Image.new("L", image.size, mean).convert
 > (image.mode)
 >
 > Isn't reduce(lambda a,b: a+b, image.convert("L").histogram()) the same
 > as (image.size[0] * image.size[1]) - just count the number of pixels
 > in the image? (Afaik, the histogram is a list of 256 elements where
 > the ith element gives the number of pixels with i as the pixel value
 > (0 <= i < 256)). Is this actually fishy or have I got it all muddled
 > up?
 >
 > Thanks,
 > roop

Good catch [I'll send a copy to the imaging sig].  If you replace class
Contrast like this:

     class Contrast(ImageEnhance._Enhance):
         "Adjust image contrast"
         def __init__(self, image):
             self.image = image
             w, h = image.size
             mean = sum(n * c for n, c in enumerate(
                            image.convert("L").histogram())
                        ) / float(w * h)
             self.degenerate = Image.new("L", image.size,
                                mean).convert(image.mode)


You should get a working Contrast class.
There _is_ another possibility:


     class Contrast(ImageEnhance._Enhance):
         "Adjust image contrast"
         def __init__(self, image):
             self.image = image
             clone = image.copy()
             clone.thumbnail((1, 1))
             self.degenerate = clone.resize(image.size)


The former goes to a grey point, while the latter goes to
the picture's color center.  I'm not quite sure which one
is more properly called "contrast," as I can see wanting
either one.


--Scott David Daniels
Scott.Daniels at Acm.Org



More information about the Image-SIG mailing list