ANTIALIAS vs BICUBIC in PIL(Python Image Library)?

ANTIALIAS is no longer the proper term, it was replaced by LANCZOS which is a more descriptive term for the algorithm used. You can still use ANTIALIAS in your code for backward compatibility purposes but it's not recommended.

LANCZOS uses a larger pattern than BICUBIC and should produce slightly sharper results. It will also be slower.

The documentation has been changed since the question was asked, and the references to 2x2 or 4x4 have been removed. You probably weren't the only one confused by them.

resample – An optional resampling filter. This can be one of PIL.Image.NEAREST
           (use nearest neighbour), PIL.Image.BILINEAR (linear interpolation),
           PIL.Image.BICUBIC (cubic spline interpolation), or PIL.Image.LANCZOS (a high-quality
           downsampling filter). If omitted, or if the image has mode “1” or “P”, it is set
           PIL.Image.NEAREST.

The below is no longer valid, it was fixed in Pillow 2.7. I'm leaving it here for those with older versions, although I'd highly advise you to upgrade.


I've now gone through the source to figure out the details. I'm not terribly pleased by what I saw.

First, BICUBIC. There are a number of formulas which can be classified as bicubic, the most common of these being the Catmull-Rom interpolation. That's not what PIL uses. Don Mitchell and Arun Netravali wrote a paper that analyzes all the variations and characterizes them using two variables B and C; the one used by PIL corresponds to B=0 and C=1. In the Mitchell-Netravali paper this is clearly in the Ringing artifact region. This means that enlarged images will have unnatural bright or dark halos around edges.

Next up is ANTIALIAS. This is based on a Lanczos-3 filter, which would ordinarily be a good choice for both downsizing and upsizing. Unfortunately there's a bug in the code when upsizing - rather than taking in an area of 6x6 pixels to calculate the result, it's truncated at 2x2 pixels. This makes it barely better than bilinear.