[Image-SIG] Odd behavior in PIL 1.1.4 equalization

Fredrik Lundh fredrik at pythonware.com
Sat May 7 11:09:14 CEST 2005


> I've attached a (preliminary) patch.

here's a sligtly less broken patch:

Index: PIL/ImageOps.py
===================================================================
--- PIL/ImageOps.py     (revision 2134)
+++ PIL/ImageOps.py     (working copy)
@@ -9,6 +9,7 @@
 # 2001-10-23 fl   Added autocontrast operator
 # 2001-12-18 fl   Added Kevin's fit operator
 # 2004-03-14 fl   Fixed potential division by zero in equalize
+# 2005-05-05 fl   Fixed equalize for low number of values
 #
 # Copyright (c) 2001-2004 by Secret Labs AB
 # Copyright (c) 2001-2004 by Fredrik Lundh
@@ -207,13 +208,18 @@
     h = image.histogram(mask)
     lut = []
     for b in range(0, len(h), 256):
-        step = reduce(operator.add, h[b:b+256]) / 255
-        if step == 0:
-            step = 1
-        n = 0
-        for i in range(256):
-            lut.append(n / step)
-            n = n + h[i+b]
+        histo = filter(None, h[b:b+256])
+        if len(histo) <= 1:
+            lut.extend(range(256))
+        else:
+            step = (reduce(operator.add, histo) - histo[-1]) / 255
+            if not step:
+                lut.extend(range(256))
+            else:
+                n = step / 2
+                for i in range(256):
+                    lut.append(n / step)
+                    n = n + h[i+b]
     return _lut(image, lut)

 ##





More information about the Image-SIG mailing list