PIL中的抗锯齿和双立方插值哪个好?
我正在使用PIL来调整图片的大小,我的情况是想把原始图片放大。
我对使用`resample=ANTIALIAS`这个算法有点困惑。
根据下面的文档,ANTIALIAS
在缩小图片时似乎是最好的选择。我想知道在什么情况下BICUBIC
会更好?(我测试的一些案例显示,双立方插值是更好的选择)
An optional resampling filter.
This can be one of NEAREST (use nearest neighbour),
BILINEAR (linear interpolation in a 2x2 environment),
BICUBIC (cubic spline interpolation in a 4x4 environment),
or ANTIALIAS (a high-quality downsampling filter).
If omitted, or if the image has mode “1” or “P”, it is set NEAREST.
我还对文档中的2x2环境下的线性插值
和4x4环境下的三次样条插值
感到困惑。这是什么意思呢?
谢谢。
2 个回答
ANTIALIAS
这个词现在不太合适了,它被更准确的词LANCZOS
替代了,这个词更能描述所用的算法。你在代码中还是可以用ANTIALIAS
,因为它可以兼容旧版本,但不推荐这样做。
LANCZOS
使用的模式比BICUBIC
大一些,通常能产生稍微清晰的效果。不过,它的处理速度会慢一些。
自从提问以来,文档也有了变化,之前提到的2x2或4x4的内容已经被删除了。你可能不是唯一一个对此感到困惑的人。
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.
下面的内容已经不再有效了,这个问题在Pillow 2.7中已经修复。我把它留在这里是为了帮助那些使用旧版本的人,不过我强烈建议你升级。
我现在已经查看了源代码,想弄清楚细节。看到的结果让我有点不满意。
首先是BICUBIC
。有很多公式可以被称为双立方插值,其中最常见的是Catmull-Rom插值。但PIL使用的并不是这个。Don Mitchell和Arun Netravali写了一篇论文,分析了所有的变种,并用两个变量B和C来描述它们;PIL使用的对应于B=0和C=1。在Mitchell-Netravali的论文中,这明显属于“振铃伪影”区域。这意味着放大的图像在边缘会出现不自然的亮或暗的光环。
接下来是ANTIALIAS
。它是基于Lanczos-3滤波器的,通常对于缩小和放大图像都是个不错的选择。不幸的是,在放大的时候代码有个bug——它并没有使用6x6像素的区域来计算结果,而是缩减到了2x2像素。这使得它的效果几乎和双线性插值差不多。
这些内容是按照复杂程度从低到高排列的。它们之间会有视觉上的差别。主要的区别在于算法执行所需的时间。
你需要决定什么对你来说更重要,是速度还是质量。如果你只处理5张图片,那就选择质量。如果你要处理10万张图片,可能就要考虑速度了。这真的取决于你用这个做什么。
2x2和4x4的环境意味着算法会查看一个2x2或4x4的像素区域。