[Image-SIG] New fast quantizer for PIL
Oliver Tonnhofer
olt at bogosoft.com
Fri Jul 2 14:54:00 CEST 2010
Hi all,
I want to give you an update on my new color quantizer.
- I renamed some functions/structs and I've added comments that
describes the algorithm step by step.
- I've added MEDIANCUT, MAXCOVERAGE and FASTOCTREE constants to
Image.py, so you can call img.quantize(256, Image.FASTOCTREE). I used
FASTOCTREE as the name because it is an optimized version and not a
full implementation of the octree algorithm. But I'm open for other
names.
- I fixed a small bug and it now works with all numbers of colors,
from 1 to 256.
- I've added a little test.
- I tested it on Mac OS X 10.5/10.6, Debian 5.0 and Ubuntu 9.10. A
load test showed constant memory usage (so I assume that there is no
leak).
The code is available at http://bitbucket.org/olt/pil-117-octree
There is a new fork that also contains my other path for different ZIP
compress types: http://bitbucket.org/olt/pil-117-fastpng
You can get a source package here: http://bitbucket.org/olt/pil-117-fastpng/downloads/PIL-1.1.7-fastpng-a1.tar.gz
Regards,
Oliver
On 23.06.2010, at 19:15, Oliver Tonnhofer wrote:
> Hi everyone,
>
> I tried to improve the performance of the existing PIL image
> quantizer, but the best improvements I got were only 10%. While
> investigating how the median cut algorithm works, I came across the
> octree color quantization algorithm. I've implemented a variation of
> this algorithm and the results are very impressive.
>
> It shows up-to-10x improvements. The algorithm shows good image
> quality for rasterized vector images like maps; gradients do not
> look as good as with the median cut algorithm.
> For our use case[0], serving maps, we get an overall performance
> boots of ~x3.5.
>
> Here are some times in ms, best of 5 runs.
>
> rgb adaptive octree octree+rle jpeg
> baboon.jpg 122.42 403.77 34.76 20.71 16.35
> gradient.png 1.45 6.60 1.01 1.21 0.95
> lena.jpg 167.83 325.08 35.53 19.26 13.11
> map.png 194.42 305.59 89.83 37.78 34.59
> rainbow.png 11.84 229.73 3.83 3.74 3.13
> wiki-en.png 7.27 12.45 2.78 1.65 1.81
>
> All times include a convert/quantize and save call.
> - rgb is a plain save
> - adaptive is `convert('P', palette=ADAPTIVE)`
> - octree the new algorithm
> - octree+rle the new algorithm with RLE encoding enabled with my
> compress_type patch[1]
>
> The images are online [2], and there is also a .tar.gz with all
> images to download.
>
> The new quantizer is available at bitbucket[3]. You can use the new
> algorithm with `img.convert(256, 2)`.
>
> I'd love to see that in the next PIL release. I will add some more
> comments and will clean up the code a bit more, then I'm up for a
> code review. Comments are welcomed already, though.
>
> [0] http://osm.omniscale.de/ http://mapproxy.org
> [1] http://bitbucket.org/olt/pil-117/changeset/8d4661695edd
> [2] http://bogosoft.com/misc/pil-octree-tests/
> [3] http://bitbucket.org/olt/pil-117-octree
>
>
> Regards,
> Oliver
>
> _______________________________________________
> Image-SIG maillist - Image-SIG at python.org
> http://mail.python.org/mailman/listinfo/image-sig
More information about the Image-SIG
mailing list