我想找出哪种算法最适合用于缩小光栅图片的尺寸.最好的我指的是给出最好看结果的那个.我知道bicubic,但还有更好的东西吗?例如,我从一些人那里听说Adobe Lightroom有一些专有算法,它产生的结果比我使用的标准双三次更好.不幸的是,我想在我的软件中自己使用这个算法,因此Adobe小心谨慎的商业秘密是行不通的.
添加:
我检查了Paint.NET,令我惊讶的是,在缩小图片时,Super Sampling似乎比bicubic更好.这让我想知道插值算法是否可行.
它还让我想起了我自己"发明"但从未实现过的算法.我想它也有一个名字(因为这个琐碎的东西不能仅仅是我的想法),但我在流行的那些中找不到它.超级采样是最接近的.
这个想法是这样的 - 对于目标图片中的每个像素,计算它在源图片中的位置.它可能会覆盖一个或多个其他像素.然后可以计算这些像素的面积和颜色.然后,为了获得目标像素的颜色,可以简单地计算这些颜色的平均值,将它们的区域添加为"权重".因此,如果目标像素覆盖1/3的黄色源像素和1/4的绿色源像素,我会得到(1/3*黄色+ 1/4*绿色)/(1/3 + 1/4).
这自然是计算密集型的,但它应该尽可能接近理想,不是吗?
这个算法有名字吗?
不幸的是,我无法找到原始调查的链接,但随着好莱坞电影摄影师从电影转向数字图像,这个问题出现了很多,所以有人(也许是SMPTE,也许是ASC)聚集了一群专业摄影师并向他们展示画面已经使用一堆不同的算法重新调整.结果是,对于那些看着巨大电影的专业人士来说,人们的共识是Mitchell(也称为高质量的Catmull-Rom)是最适合放大的,而sinc是最适合缩小尺寸的.但是,sinc是一个理论上的过滤器,无法完成,因此无法完全实现,所以我不知道'sinc'实际上是什么意思.它可能是指sinc的截断版本.Lanczos是sinc的几个实用变体之一,试图改进它只是截断它并且可能是缩小静止图像的最佳默认选择.但是像往常一样,它取决于图像和你想要的东西:缩小线条图以保留线条是一种情况,例如,你可能更喜欢强调保留在收缩花朵照片时不受欢迎的边缘.
剑桥在Color中有各种算法结果的很好的例子.
fxguide上的人们汇总了大量有关缩放算法的信息(以及关于合成和其他图像处理的许多其他内容),值得一看.它们还包括可能对您自己的测试有用的测试图像.
现在ImageMagick有一个关于重采样过滤器的广泛指南,如果你真的想进入它.
具有讽刺意味的是,关于缩小图像存在更多争议,理论上可以完美地做到这一点,因为你只丢弃信息,而不是扩大规模,你试图添加的信息不是存在.但是从Lanczos开始吧.
有Lanczos采样比双三次慢,但产生更高质量的图像.
(Bi-)线性和(双)立方重采样不仅是丑陋的,而且在缩小小于1/2的因子时非常不正确.它们将导致非常糟糕的混叠,类似于如果您将采样率降低1/2,然后使用最近邻下采样,则会得到非常差的混叠.
我个人建议(区域)平均样本用于大多数下采样任务.它非常简单,快速且接近最佳.高斯重采样(半径选择与因子的倒数成比例,例如,半径为5,用于下采样1/5)可以提供更好的结果,具有更多的计算开销,并且它在数学上更具声音.
使用高斯重采样的一个可能原因是,与大多数其他算法不同,只要您选择适合重采样因子的半径,它就可以正常工作(不会引入伪像/混叠)进行上采样和下采样.否则,为了支持两个方向,您需要两个单独的算法 - 用于下采样的区域平均(对于上采样会降级到最近邻居),以及类似(bi)立方体用于上采样(对于下采样会降级到最近邻居).在数学上看到高斯重采样的这种优良特性的一种方法是具有非常大的半径的高斯近似于区域平均,并且具有非常小的半径的高斯近似(双)线性插值.
我刚才看到一篇关于Slashdot关于Seam Carving的文章,可能值得一试.
Seam carving是由Shai Avidan和Ariel Shamir开发的图像大小调整算法.该算法不是通过缩放或裁剪来改变图像的尺寸,而是通过智能地从图像中移除像素(或添加像素)而不重要.