ImageMagick 示例 --
重采样滤镜

索引
ImageMagick 示例前言和索引
重采样伪影 - 缩放效果如何?
块状效应,  吉布斯现象,  混叠效应,  模糊
 
重采样滤镜
重采样滤镜(续)
 
Nicolas Robidoux 的重采样(子部分)
在这里,我们将深入了解图像缩放和扭曲的底层方面,研究用于确定结果图像中每个像素最终颜色的重采样滤镜。这是一个广泛的、经过长期研究的领域,通常充满了意见和个人观点,而不是任何硬性的定量事实,因为无法确定什么是完美的缩放图像。这是一个已被证实的事实,并且形成了一个非常庞大的研究领域,永远不会结束。建议您阅读并理解缩放和比例运算符

重采样伪影- IM 缩放效果如何

图像缩放必须解决一个非常困难的问题。如何将一组值缩减为一个更小或更大的值数组,使其在我们的眼中看起来不错。在尝试执行此操作时,可能会出现很多问题,但它们可以归为四大类。

块状效应

从本质上讲,如果您仅通过复制像素来放大图像,则会创建更大的矩形像素块。事实上,使用“-scale”或“-sample”放大图像正是这样做的,生成放大的像素化图像。例如,这里我缩放了一个小图像,生成了大块的颜色,而不是漂亮的平滑图像。旁边是“缩放”版本,最后是使用高斯滤镜将其模糊超过正常水平,并将孤立像素替换为圆点,以消除部分块状感。

  magick storm.gif  -scale  300%  storm_scaled.gif
  magick storm.gif  -resize 300%  storm_resized.gif
  magick storm.gif -filter Gaussian -resize 300%  storm_resized_gas.gif
[IM Output]
原始
==> [IM Output]
缩放
[IM Output]
缩放
[IM Output]
高斯缩放
“块状效应”的主要原因是源图像的抗锯齿效果不佳,或者像素之间没有足够的平滑处理(颜色混合或模糊)来改善图像的整体外观。当非常低分辨率的图像被缩放至更大的比例或用于高分辨率设备时,也会出现这种情况。最常见的情况是在用户生成的新闻稿和杂志中使用位图图像,然后在非常高分辨率的激光打印机上打印。新闻稿在屏幕上看起来很棒,但在打印页面上却显得“块状”。这种情况很难修复,通常最好避免,方法是使用更高分辨率的剪贴画,或使用可缩放的矢量图像(例如 SVG 和 WMF 格式图像)。当然,在某些情况下,块状伪影实际上是理想的,并且在结果中得到增强。例如,当您尝试在较新的高分辨率显示器上重新创建一些旧的低分辨率视频游戏时,保留图像的旧“块状感”会增强“复古”外观。或者,当您尝试旋转图像时,而不会生成和合并新的颜色。实际上保留“块状感”但用对角线填充正方形的技术称为像素艺术缩放算法,并且已经开发了许多这样的方案。ImageMagick 中内置了一种方案,使用放大运算符。

吉布斯现象

吉布斯现象是您经常在靠近锐利边缘的非常低质量的 JPEG 图像中看到的效应。它通常是由缩放或图像压缩算法过度补偿边缘,或高品质滤镜与错误的支持尺寸一起使用造成的。例如,这里我使用一个特殊选项选择一个原始的 Sinc 滤镜,在一个非常锐利的颜色变化上。我还重复了使用 IM 的默认缩放运算符的操作,以及其针对图像放大的默认滤镜选择。

  magick -size 8x16 xc:'#444' xc:'#AAA' +append  gray_edge.gif
  magick gray_edge.gif -filter Sinc \
                         -resize 100x100\!  gray_edge_ringing.gif
  magick gray_edge.gif  -resize 100x100\!  gray_edge_resize.gif
[IM Output] ==> [IM Output] [IM Output]
以上清楚地显示了使用原始缩放滤镜产生的过度补偿,没有任何 IM 提供的优化。由 IM 默认放大滤镜生成的第二个图像也显示了非常轻微的吉布斯现象,但几乎不可察觉,实际上它是有益的,因为它在感知上锐化了边界。这是吉布斯现象的另一个例子,这次是通过在一个灰色背景上放大一个像素来实现的。

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Sinc \
          -resize 100x100\!   dot_sinc.gif
[IM Output]
此图像还清楚地显示了一维滤镜生成的二次效应。也就是说,吉布斯现象在水平和垂直(正交)方向上最强,具有 45 度的二次吉布斯现象。这次使用圆柱滤镜(通过扭曲缩放操作),显示它与缩放运算符使用的更正常的 2 通道正交对齐(张量)滤镜有何不同。

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Jinc \
          -distort resize 100x100\! +repage dot_jinc.gif
[IM Output]
这些效果通常不可见,并且仅在某些极端放大情况下使用原始“Sinc”或“Jinc”滤镜(请参见下面的加窗滤镜)时才会出现。通常不使用这种“原始”滤镜。

混叠和莫尔效应

混叠效应通常表现为沿图像边缘产生“阶梯状”效果。这通常是由于对图像进行原始采样(例如使用“-sample”)或在缩放过程中过度锐化图像造成的。阶梯状效果在图像的强烈缩小中最为明显,但在 IM 中很少见。但是,混叠也有其他影响,特别是包含某种像素级图案的图像中出现的较大规模的莫尔图案。这些低级图案通常会产生大规模的莫尔图案,包括:平行线的图案、织物纹理(丝绸在现实生活中表现出这种效果!),以及砖石建筑、栅栏和铺路的砖块和瓷砖图案。[IM 输出]有关产生强烈莫尔效应的缩放图像的一些示例,请参见维基百科,莫尔图案页面。检查缩放是否会产生混叠问题的经典方法是缩小环形图像(见右)。当任何形式的缩放以任何比例应用时,此图像通常会显示莫尔效应。特别是 Web 浏览器在显示此类图像时会显示此类莫尔效应,这是由于使用了超快速(但通常质量较差)的缩放技术造成的。
这里我展示了使用强烈混叠的“-sample”运算符、块平均的“-scale”运算符和正常的默认“-resize”缩放的“环形”图像。

  magick rings_sm_orig.gif  -sample 100x100  rings_sample.png
  magick rings_sm_orig.gif  -scale  100x100  rings_scale.png
  magick rings_sm_orig.gif  -resize 100x100  rings_resize.png
[IM Output]
样本
[IM Output]
缩放
[IM Output]
缩放
如您所见,所有缩放方法都产生了一些莫尔效应,但 IM 的默认缩放运算符在最终图像中产生的这种不良的二次图案最少。为了显示仅轻微缩放的效果,我从大型环形图像中裁剪了角,其结果首先显示,然后将其大小缩小了 5%。

  magick rings_lg_orig.png -crop 105x105+0+0  rings_crop.png
  magick rings_crop.png    -sample 100x100    rings_crop_sample.png
  magick rings_crop.png    -scale  100x100    rings_crop_scale.png
  magick rings_crop.png    -resize 100x100    rings_crop_resize.png
[IM Output]
裁剪后的原始图像
==> [IM Output]
样本
[IM Output]
缩放
[IM Output]
缩放
如您所见,即使是轻微的缩放也会显示缩放运算符可能具有的任何混叠。事实上,如果您仔细观察,您甚至可能会在原始起始图像的原始未缩放裁剪中看到非常轻微的莫尔效应,这是由仅使用光栅图像在适合在计算机屏幕上显示的密度下产生的限制造成的。也就是说,此测试图像在显示缩小图像引起的混叠效应方面有多敏感。

模糊

大多数人都熟悉“-resize”生成的模糊。事实上,这可能是对任何缩放图像的最大抱怨,并且有充分的理由。通常,非常小的缩放往往会产生模糊的图像,并且再次缩放只会使它变得更糟。问题在于,当您缩放图像时,您正在更改存储为“网格”或像素数组(称为“光栅”)的图像以适合完全不同的“网格”像素。这两个“网格”除了在非常特殊的情况下外,不会匹配,因此,必须修改图像数据以使其适应这种新的点模式。基本上,不可能直接缩放图像并期望它变得漂亮,尽管可以获得合理的结果。结果通常是像素数据略微模糊。缩放算法越好,锐利边缘的模糊越少。但是,某些缩放滤镜,尤其是专为放大图像而设计的滤镜,通常会添加比必要更多的模糊。这是为了对抗上面演示的“块状效应”伪影。对于图像缩小,模糊边缘通常用于避免锐利边缘处的“吉布斯现象”伪影并减少可能的混叠效应。然而,这是一个权宜之计,IM 努力避免这种情况。即便如此,也可以使用特殊的专家滤镜模糊设置来调整滤镜提供的模糊程度。但是请注意,虽然小于 1.0 的数字应该会减少模糊,但它也可能使其变得更糟,具体取决于使用的精确滤镜和缩放比率。无法保证。
在 IM v6.3.6-3 之前,滤镜模糊设置称为“-support”,这对于它所做的事情非常具有误导性。此选项已被弃用,不再可用。
修复缩放引起的模糊效果的更好方法是使用锐化运算符重新滤镜图像。有关更多详细信息,请参见锐化缩放图像

IM 缩放与其他程序

Bart van der Wolf 在... 提供了一个 IM 默认调整大小运算符与其他多个程序在调整真实世界图像大小方面的实用比较。
下采样示例
具体来说,对于 IM 调整大小的总结...
虽然锐化程度是一个品味问题,但缺乏混叠伪影产生了所有图像中最干净、最自然的图像。
他还继续研究了“环”测试,以直接比较各种 Photoshop 调整大小方法与 ImageMagick...
下采样方法
这些文章表明,正确地进行调整大小(并使用正确的滤波方法)对于图像处理的重要性。我们将在下一节中更仔细地研究这一点。

重采样滤波器

"-filter" 设置是控制“图像调整大小”以及“通用扭曲运算符”如何工作以产生干净结果并最大程度减少 重采样伪影 的关键控制。这在 20 世纪 80 年代后期一直是深入研究的主题,并且在此领域的主要研究人员 Paul Heckbert 发布了他的“zoom”图像调整大小程序。这个程序成为了当今大多数图像调整大小程序的鼻祖,尽管许多后来的程序实现不佳,因为它很容易出错。例如,看看测试 网络浏览器如何调整图像大小 的结果。在许多方面,这些滤波器与 卷积图像 甚至 模糊内核 密切相关。它们甚至也存在类似的问题。但是,滤波器旨在改善调整大小或以其他方式扭曲图像时最终结果的外观。滤波器的名称是过去一个世纪(或更久)图像处理专家和数学家的“名人堂”。它们通常不是滤波器的描述,而只是对最初发布该滤波器(或滤波器族)或对该滤波器进行最多研究的人员的标签。但是,这使得很难知道“Lagrange”滤波器(以 Joseph-Louis Lagrange 命名)是否比“Catrom”滤波器(以 Edwin Catmull 和 Raphael Rom 命名)更好。在这里,我将解释滤波器的主要方面。学习这些内容并非至关重要,但我决定记录我学到的内容摘要,作为对 IM 调整大小滤波器系统进行重大检修和扩展的一部分(IM 6.3.7-1)。特别感谢 Fred Weinhaus 在重新开发调整大小滤波器期间提供的研究帮助。他特别渴望添加“Lagrange”滤波器族,该滤波器在此次检修之前在 IM 调整大小中不存在。还要感谢 Nicolas Robidoux,他的数学帮助解决了 通用扭曲运算符 中的一个主要错误,然后开发了 圆柱滤波器,从而产生比使用 调整大小运算符 获得的更好的结果。

滤波器的工作原理

调整图像大小时,您基本上是在尝试根据原始源图像中的像素确定新图像中每个像素的正确值。但是,这些新像素与旧像素的位置并不完全匹配,因此需要以某种方式确定这些像素的正确值。所做的是尝试使用原始源像素值的一些加权平均值来确定新像素的良好值。围绕新像素位置的真实像素形成了一个贡献值的“邻域”。此邻域越大,调整大小的速度越慢。这是一种称为 卷积 的技术。每个真实相邻像素(称为“样本”)对产生最终像素的贡献量由加权函数确定。这是您可以使用“-filter”设置选择的“滤波器”。该滤波器反过来通常具有理想的邻域大小,称为滤波器的“支持”,但也称为其“窗口”。预定义的二维“滤波器”也称为“卷积核”。
FUTURE: some diagrams may be helpful here
这些加权函数或“滤波器”的设计是一项非常复杂的工作,涉及一些复杂的数学、频率分析甚至傅里叶变换。如果您对此感兴趣,一个良好的起点是 维基百科:奈奎斯特-香农采样定理。但是,您真的不需要深入了解就可以理解现有的滤波器及其对图像的影响。

滤波器

插值滤镜

最简单的调整大小滤波器函数是插值方法。它们获取源图像中的特定像素位置,并尝试根据周围像素的颜色简单地确定该位置的图像的逻辑颜色值。由于始终只有固定且最少的像素参与,因此此类滤波器是一种非常快速的调整大小或以其他方式扭曲图像的方法。但是,这也是该滤波器的缺点,因为它不会将大量像素合并在一起以形成比原始图像小得多的图像。这反过来会导致强烈的 混叠和莫尔效应。插值通常仅用于“点”采样图像,当图像缩放未知或不需要时。例如,在旋转图像或轻微扭曲时,图像的缩放或大小不会改变,因此插值可以产生合理的结果,尽管不是非常准确的结果。有关更多信息,请参阅 IM 的 插值设置。但是,它不适用于一般图像调整大小。

使用“-filter”设置为“Point”基本上意味着使用未缩放的插值滤波器。对于 调整大小运算符,它只会选择最靠近新像素位置的像素,仅此而已。这意味着 调整大小运算符 将简单地使用源图像中实际像素的颜色。不会尝试合并颜色或为生成的图像生成更好的颜色。因此,使用“-filter point -resize ...”将产生与“-sample”(参见 采样运算符)相同的结果,尽管后者更快,因为其代码专门设计用于通过点采样调整图像大小,并具有控制精确采样点的功能。
对于 扭曲运算符,选择“-filter Point”将强制使用 插值点采样 而不是 圆柱滤波器。有关更多详细信息,请参阅 扭曲运算符中的图像滤波器

如果您希望对普通图像调整大小使用相同的 插值点采样,则可以使用 插值调整大小 运算符。或者使用点过滤的 扭曲调整大小 以获得相同的结果。

在这里,我从一个 10x10 像素的散列图案开始,将其缩小,然后缩放,以便您可以看到结果。

  magick -size 10x10 pattern:gray50  checks_10.gif
  magick checks_10.gif -filter point -resize 9x9  checks_point-1.gif
  magick checks_10.gif -filter point -resize 8x8  checks_point-2.gif
  magick checks_10.gif -filter point -resize 7x7  checks_point-3.gif
  magick checks_10.gif -filter point -resize 6x6  checks_point-4.gif
  magick checks_10.gif -filter point -resize 5x5  checks_point-5.gif
[IM Output]
 
==> [IM Output]
点-1
[IM Output]
点-2
[IM Output]
点-3
[IM Output]
点-4
[IM Output]
点 50%
实际上发生的事情是,图像中删除了单个像素行和列。即使在此级别,您也会在生成的图像中获得极端的 块状混叠,并且在某些特定情况下(如上所示)会产生完全不切实际的结果。因此,不建议将“Point”滤波器或更快的等效 采样运算符 用于普通图像调整大小。

方框

Box”滤波器设置与“point”完全相同,只有一个细微的差异。在缩小图像时,它将平均并合并像素。生成的图像越小,平均的像素越多。 [IM 输出] 这是滤波器加权函数的图形,从中您可以了解为什么将其称为“Box”滤波器。基本上,落在“方框”内的任何像素都将直接用于计算新像素的颜色。现在,由于滤波器仅为 1/2 像素宽,这意味着对于未实际调整大小的图像,只会使用一个像素(最接近的像素)。换句话说,当不涉及缩放(或仅放大)时,最靠近新位置的像素将形成新像素的颜色。但是,如果图像正在缩小,则更多源图像将被压缩到该“方框”的边界内。结果是,将对更多像素进行平均以产生较小图像中像素的颜色。例如,以下是在使用“Box”滤波器缓慢压缩时棋盘格像素图案的放大视图。

  magick checks_10.gif -filter box -resize 9x9  checks_box-1.gif
  magick checks_10.gif -filter box -resize 8x8  checks_box-2.gif
  magick checks_10.gif -filter box -resize 7x7  checks_box-3.gif
  magick checks_10.gif -filter box -resize 6x6  checks_box-4.gif
  magick checks_10.gif -filter box -resize 5x5  checks_box-5.gif
[IM Output]
 
==> [IM Output]
方框-1
[IM Output]
方框-2
[IM Output]
方框-3
[IM Output]
方框-4
[IM Output]
方框 50%
如您所见,随着图像使用“Box”滤波器缩小,越来越多的像素合并在一起,但合并发生在特定、等距的行和列中。这会导致在缩小和放大图像时出现各种伪影和莫尔或 混叠 效应。建议将“Box”滤波用于“合并”图像。也就是说,以整数倍缩小图像以确保结果中的每个像素都是相同数量的相邻像素(“合并”)的平均值。因此,生成的图像将保持清晰的外观,就像上面的最终图像一样。还建议使用更快的 缩放运算符 而不是“方框滤波器”。它将产生几乎相同的结果,除了缩小图像仅几个像素的特殊情况。在“合并”时,它将产生相同的结果。
缩放运算符 与“方框滤波器”并不完全相同,因为它使用特殊的“像素混合”算法实现。有关确切详细信息,请参阅 缩放内部
在放大时,“Point”和“Box”滤波器都将产生相同的“像素复制”行和列,因为它们都导致使用简单的“最近邻”选择。

  magick -size 5x5 pattern:gray50  checks_5.gif
  magick checks_5.gif -filter box   -resize 6x6    checks_box+1.gif
  magick checks_5.gif -filter box   -resize 7x7    checks_box+2.gif
  magick checks_5.gif -filter box   -resize 8x8    checks_box+3.gif
  magick checks_5.gif -filter box   -resize 9x9    checks_box+4.gif
  magick checks_5.gif -filter box   -resize 10x10  checks_box+5.gif
[IM Output]
 
==> [IM Output]
方框+1
[IM Output]
方框+2
[IM Output]
方框+3
[IM Output]
方框+4
[IM Output]
方框+5
缩放运算符 也产生类似的结果,但在放大时会进行一些像素颜色混合,除非放大倍数为整数。

三角形

[IM 输出]Triangle”或“双线性”插值滤波器只是将最近邻的插值再向前推进一步。它不是像“Box”那样直接对附近的像素进行平均,而是根据新像素位置与邻域(或“支持”区域)内原始像素的接近程度对其进行加权。新像素越靠近源图像像素,该像素贡献的颜色就越多。这在图像缩小时会产生更全局的颜色平均。

  magick checks_10.gif -filter triangle -resize 9x9 checks_tri-1.gif
  magick checks_10.gif -filter triangle -resize 8x8 checks_tri-2.gif
  magick checks_10.gif -filter triangle -resize 7x7 checks_tri-3.gif
  magick checks_10.gif -filter triangle -resize 6x6 checks_tri-4.gif
  magick checks_10.gif -filter triangle -resize 5x5 checks_tri-5.gif
[IM Output]
 
==> [IM Output]
三角-1
[IM Output]
三角-2
[IM Output]
三角-3
[IM Output]
三角-4
[IM Output]
三角
如您所见,由于角像素与原始图像的角非常匹配,因此它们更清晰可见,但在中间,附近像素中没有一个与正在生成的新像素完全匹配,您会获得整个邻域的更平均颜色。棋盘格像素图案的结果是倾向于淡入淡出平均灰色。但是,由于“支持”邻域更大,因此在放大图像时,将涉及更多像素。从而在生成添加到图像中的像素时产生颜色平均。

  magick checks_5.gif -filter triangle -resize 6x6  checks_tri+1.gif
  magick checks_5.gif -filter triangle -resize 7x7  checks_tri+2.gif
  magick checks_5.gif -filter triangle -resize 8x8  checks_tri+3.gif
  magick checks_5.gif -filter triangle -resize 9x9  checks_tri+4.gif
  magick checks_5.gif -filter triangle -resize 10x10 checks_tri+5.gif
[IM Output]
 
==> [IM Output]
三角+1
[IM Output]
三角+2
[IM Output]
三角+3

[IM Output]
Tri+4
[IM Output]
Tri+5
对于大规模放大,结果就像在每个像素之间添加了一个颜色渐变。例如,这里我生成一个非常小的图像,其中只有一个白色像素(显示的是放大的视图)。然后我将该图像放大到非常大。

  magick xc: -bordercolor black -border 2x0 pixel_5.gif
  magick pixel_5.gif  -filter triangle -resize 300x  pixel_triangle.gif
[IM Output]
单像素图像
(放大)
==> [IM Output]
三角形滤波器放大
如果要绘制上面图像中的颜色图(使用“im_profile”脚本),您将看到三角形滤波器图形的副本。
[IM Profile]
图像剖面
如您所见,中心像素与相邻像素合并以产生这些点之间的线性颜色渐变。所有插值滤波器都在相邻像素之间产生类似的渐变模式,这也是它们非常适合图像放大的原因。

其他插值滤镜

[IM Output] 在右侧,我绘制了各种插值滤波器,除了“Point”,它实际上是未缩放“Box”滤波器(纯“NearestNeighbor”插值)的一种非常特殊的情况。其他插值滤波器包括“Hermite”,其结果与三角形非常相似,但在放大时产生更平滑的圆角,从而使渐变过渡更加平滑。点击右侧的图形查看这三个滤波器函数的图形。
[IM Output]Lagrange”滤波器被称为“通用”插值滤波器。通过改变“支持”大小(参见下面的支持专家设置),它可以生成所有先前查看过的插值滤波器(除了“Hermite”)。默认设置(如右侧图形上显示的Lagrange 3阶滤波器(support=2.0),用紫色线表示)提供了一个合理的“三次”滤波器。它工作得很好,尽管渐变变化可能导致放大时出现一些明显的块状效果,但在位图图像和线条图中,这可能是一件好事。稍后将详细介绍其他Lagrange滤波器阶数。 [IM Output] Catrom”(Catmull-Rom)滤波器是一种众所周知的标准三次滤波器,通常用作插值函数,并且可以使用相同名称。此滤波器产生相当锐利的边缘,但在大型图像放大时不会产生“Lagrange”滤波器可能产生的明显渐变变化。它基本上等同于内置的“锐化调整大小”(参见锐化调整大小的图像),尽管有些人认为它太锐利了,并且无法控制锐化程度。“Catrom”滤波器更有趣的一点是,它几乎是2瓣“Lanczos”滤波器的相同三次等效滤波器,这可能是最常用的加窗Sinc滤波器(见下文)。我们还将在后面的三次滤波器中更仔细地研究此滤波器。

插值和IM的插值设置

IM的插值设置用于在诸如FX DIY运算符(“-fx”)和颜色查找替换运算符(“-clut”)以及一些较旧的圆形失真函数等运算符中生成图像的未缩放“点”查找。但是,它们目前使用单独的代码实现,并且具有不同的设置名称。这些插值设置包括:“NearestNeighbor”,实现“Point”(或未缩放的“Box”)滤波器,以及“BiLinear”以获取未缩放的“Triangle”滤波器。旁注:目前,平滑的三角形滤波器“Hermite”尚未直接实现为插值设置,这很可惜,因为它是一个非常好的插值滤波器。

高斯模糊滤波器

在傅里叶变换到频域的复杂数学中,调整大小滤波器旨在去除可能存在的任何高频噪声。这种噪声是由真实世界图像采样到像素引起的,当您调整图像大小时,这种噪声会表现为混叠和莫尔条纹效应。因此,高斯钟形曲线成为早期作为调整大小或重采样滤波器的自然候选者,因为它是在现实世界中影响的理想模型。

高斯

[IM Output] 高斯滤波器是一种非常特殊的滤波器,它在频域中生成相同的“钟形曲线”形状。这使得它非常有用,因为它可以以高度可控的方式确保很好地去除这种高频噪声。但是,如果检查滤波器图形,您会发现距采样点一个像素的距离处,您有一个非零值。事实上,它的值确实相当高。这导致单个像素产生大量模糊,即使实际上没有执行调整大小。例如,这里我使用高斯滤波器和正常的IM滤波器(在这种情况下为“Lanczos”,我们将在后面讨论)调整了标准IM徽标的大小。

  magick logo:  -filter Gaussian  -resize 150x logo_gaussian.png
  magick logo:                    -resize 150x logo_normal.png
[IM Output]
高斯
[IM Output]
正常调整大小
如果仔细观察,您会发现左侧“Gaussian”滤波图像比正常调整大小的图像更模糊。尤其是在魔杖周围和巫师帽子上较小的星星的细节方面。这种图像模糊是您为消除图像缩减中的所有混叠效果以及图像放大中的所有块状效果而付出的代价。它也不会产生任何振铃效果(当完美应用时)。但所有这些都是以最终图像的极端模糊为代价的。
事实上,在大型放大期间,此滤波器将生成圆点,而不是方形点。例如,这里我将一个3x3像素图像(中心有一个点)大大放大。

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   -resize 99x99  -normalize dot_gaussian.jpg
[IM Output]
如您所见,单个像素放大成完美的圆点。只有高斯和类似高斯的滤波器才能做到这一点。

高斯Sigma专家控制

您可以使用特殊的专家选项“-define filter:sigma={value}”直接控制高斯滤波器以指定高斯曲线的实际“sigma”值。默认情况下,此值为“0.5”,这与Box滤波器的大小相同。在许多方面,您可以将高斯滤波器视为本质上是“模糊的盒子”。添加此专家选项是为了能够创建非常小的高斯模糊,而不会减小滤波器的支持范围(见下文)。但是,增加“sigma”可能会导致滤波器被裁剪。因此,当增加“sigma”值时,默认“支持”(2.0)也会相应增加。这仅在增加默认“sigma”值时才会发生。支持专家设置可用于覆盖此自动效果,但通常不需要。
filter:sigma”专家选项仅适用于高斯滤波器。此专家控制不会影响其他滤波器。

对于其他滤波器,可以使用模糊滤波器专家控制实现更通用的控制,我们将在后面讨论。

其他类似高斯的滤镜

[IM Output] 如果研究右侧的对比图,您会发现“Quadratic”滤波器以及稍微复杂一些的“Spline”滤波器都很好地遵循了“Gaussian”滤波器的加权曲线。并且作为多项式函数,它们的计算速度也快得多,这就是它们最初被发明的原因。虽然“Quadratic”比高斯滤波器稍微模糊一点,“Spline”滤波器甚至更模糊,其等效Sigma设置约为“0.65”。这使得“Spline”滤波器成为提供的最模糊的滤波器(无需修改)。检查图表,您会发现与高斯滤波器类似,与插值滤波器不同,它们在距采样点1.0的距离处具有非零值。这会导致附近的像素合并其颜色,并导致您看到的模糊。“Spline”滤波器在1.0距离处具有最高值,在任何调整大小(或失真)图像中产生最大量的模糊。这种额外的模糊去除了大型放大中可能存在的任何“块状”效果的最后一点。并且可以与锐化调整大小的图像技术一起使用,以放大线条图,从而在结果中几乎没有“阶梯状效果”。“Mitchell”滤波器也显示在比较图中。此滤波器在距采样点1.0的距离处也存在一些模糊,这也使得此滤波器略微模糊,就像我们看到的其他滤波器一样。但是,它的曲线中也有一些负权重,虽然会产生振铃效果(参见后面的加窗Sinc滤波器),但会抵消锐利边缘附近的模糊。

滤镜支持专业控制

高斯滤波器被称为IIR(无限脉冲响应)滤波器,这仅仅意味着它使用的响应“曲线”永远不会达到零。也就是说,无论您离采样点有多远,您仍然会从非常远的像素获得对结果的一些非零贡献。从数学角度来看,这实际上是一件好事,因为它意味着结果在数学上更加完美。在实际应用中,这非常糟糕,因为无限滤波器要求您使用原始图像中每个像素的加权平均值来生成目标图像中的每个新像素。这意味着大型图像使用此滤波器完美调整大小需要非常长的时间。但是,对于“Gaussian”滤波器,距采样点约2个像素(其默认“sigma”设置的4倍)以外的任何范围通常在最终结果方面会产生非常小的影响,因此通常可以忽略不计。即使是sigma的3倍通常也被认为是合理的。此范围称为滤波器的“支持窗口”,是程序对滤波器的实际限制。如果确实需要,可以使用特殊的专家设置“-define filter:support={value}”更改滤波器的“支持”。
例如,我使用 1.25 的较小支持值(或 sigma 值的 2-1/2 倍)调整了一个单像素图像的大小(参见右侧的结果图)。当然,这小于通常接受的 sigma 值 3 倍的最小值。


magick pattern:gray5 -crop 5x1+0+3 +repage pixel_5.gif magick pixel_5.gif -filter gaussian -define filter:support=1.25 \ -resize 300x pixel_gaussian.png
[IM Output]
[IM Output]
单像素图像
==> [IM Output]
高斯滤波
[IM Profile]
图像剖面
通过使用较小的“support”设置,将“step”(支持窗口截断函数的位置)移动到 1.25 的位置。这反过来会导致滤波器配置文件中出现更大的“停止”,并导致您在放大图像中看到的“混叠”效果。也就是说,图形“峰值”附近的摆动,以及滤波器“支持”限制边缘的突然“下降”。您可以将“support”理解为一个在像素上滑动的“窗口”,这些像素被平均在一起以生成放大的图像结果。由于支持大小为 1.25,因此滤波器的总支持区域为 2.5 像素宽(在图像放大期间未缩放),因此水平调整大小阶段可能涉及 2 或 3 个像素。当此支持“窗口”在图像上滑动时,每个进入或离开的像素都会在滤波器的“曲线”中产生突然的“变化”。也就是说,结果中轻微抖动的起因。也就是说,在这些点上,根据滤波器加权曲线,一个像素被添加到或从正在平均在一起的像素总数中删除。这反过来会在调整大小的图像中产生四个这样的“抖动”或“锯齿”,在单个白色像素进入/离开支持范围时,外部边缘上最初有两个,以及当第二个黑色像素(构成三个像素加权平均)进入/离开支持范围时,还有一对抖动。如果滤波器没有这样的突然“停止”,也就是说,滤波器在支持限制设置处变为零,那么您将看不到“抖动”,并且不会产生可见的效果。使用设置为整数或半整数的支持大小(例如“Gaussian”滤波器的默认“support”设置为“2.0”)将始终确保每当一个新像素进入支持范围时,另一个像素就会离开,因此相同数量的像素始终是该平均值的一部分。这将消除两个“中心”抖动,但不会消除外部的初始抖动,从而标记支持限制。即使是滤波器中的急剧斜率变化(不连续性),例如您从三角形拉格朗日滤波器获得的斜率变化,也可能在生成的图像中产生可见的伪影。
在 IM v6.3.6-3 之前,高斯滤波器的“support”设置为“1.25”这个值,这会在放大图像中产生振铃效果(如上所示)。为此,高斯滤波器的“support”更改为“1.5”,以确保始终对相同数量的像素进行平均,并减少较小的步长。

从 IM v6.6.5-0 开始,高斯滤波器的默认“support”设置增加到“2.0”。这对滤波器的整体速度影响很小,但使“停止”实际上不存在。它还简化了其他特殊用途的滤波器编码,特别是用于EWA 扭曲可变模糊映射

但是请注意,如果使用非常大的支持设置,那么当然需要对更多像素进行平均,从而使调整大小操作变慢,而不会对结果产生任何真正的改进。只有窗口化 Sinc/Jinc拉格朗日滤波器通常可以通过使用大于 2.0 的支持窗口来产生更好的结果。请记住,这些是“专家”选项,因此使用这些选项更有可能使情况变得更糟而不是更好。也就是说,为什么它们不是简单的命令行选项,而是通过特殊的“-define”选项提供的。当然,欢迎您像我上面所做的那样进行尝试,以便更好地理解事物,并且 IM 提供了这些选项,以便您可以做到这一点。

滤镜模糊专业控制

一个特殊的专家选项“-define filter:blur={value}”可用于调整滤波器提供的模糊量。“1.0”的值产生默认操作,而较小和较大的值会调整整体“模糊度”。基本上,这沿着 X 轴(像素与采样点的距离)线性放大或缩小滤波器的曲线,并且通常使滤波器整体上或多或少地变得模糊。使用较小的设置会导致滤波器函数(及其支持窗口)变小。对于高斯类似高斯滤波器,效果就像您将滤波器的“sigma”值(默认值为 0.5)乘以这个“blur”因子。此设置还会按相同比例放大或缩小滤波器的支持窗口以防止裁剪,但这可以使用支持专家滤波器设置来覆盖。例如,我在这里使用类似高斯的样条滤波器,使用三种不同的“blur”设置调整图像大小。

  for blur in 0.5 1.0 1.5; do \
    magick logo: -define filter:blur=$blur -filter Spline \
            -resize 150x logo_blur_$blur.png; \
  done
[IM Output]
模糊 0.5
<== [IM Output]
模糊 1.0
==> [IM Output]
模糊 1.5
如您所见,此特殊设置将允许您控制“Spline”滤波器结果的整体模糊度。由于“支持窗口”的大小也按滤波器模糊设置缩放,因此使用非常小的缩放值会导致重采样“错过”所有像素,或仅生成零加权像素。结果会生成规则的“黑色”线条或块。例如...

  magick rose: -define filter:blur=0.1 -filter Gaussian \
          -resize 100x100  rose_black_bars.png
[IM Output]
增加支持窗口的大小(在它按模糊缩放之前)可能有助于防止这些影响,但由于大多数滤波器只会为落在其“自然”支持范围之外的像素生成零权重,因此它不适用于所有滤波器。通常在整个支持范围内生成有用的非零值的唯一滤波器是盒式滤波器Sinc/Jinc 窗口化滤波器。当滤波器的支持变得太小而无法始终找到至少一个要采样的像素时,在圆柱滤波器中也可以看到类似的效果。拉格朗日滤波器使用支持专家滤波器设置来确定适合“支持窗口”的适当“阶数”,从而变形为各种其他形式(见下文)。
对包含负权重的滤波器使用错误的支持设置(基本上是我们接下来要看的任何滤波器)可能会产生反锐化和否定效果,以及不成比例的更强的混叠效果。在极少数情况下,它甚至可以生成无限加权颜色(在 IM 的普通非 HDRI 版本中,这些颜色会被钳制为纯黑色和白色)。

建议在将此特殊选项与任何滤波器一起使用时谨慎和专业。
在 IM v6.3.6-3 之前,“filter:blur”定义被“-support”选项错误地设置,这在它所做的确切事情方面非常具有误导性。此选项已被弃用,不再可用。

高斯插值滤波器变体

[IM Output]类似高斯的滤波器上使用“0.75”的模糊控制值,或对高斯滤波器使用“0.375”的Sigma 控制值,将生成我称为高斯插值器的变体。这种锐化的高斯滤波器与我们上面讨论的插值滤波器具有相似的特性。但它不包含任何在放大图像中可能明显的急剧停止或其他渐变变化。在这方面,它非常类似于“Hermite”滤波器(参见图形),但具有非对称倾斜,似乎更适合用作插值器。

  magick logo: -filter Gaussian -resize 150x logo_gaussian.png
  magick logo: -define filter:blur=0.75 -filter Gaussian \
          -resize 150x logo_gaussian_interpolate.png
[IM Output]
高斯
==> [IM Output]
高斯插值器
(模糊=0.75 或 sigma=0.375)
事实上,我发现它使高斯滤波器产生了更令人接受的结果,既不太锐利,也不太模糊。但是,减少滤波器的模糊会增强混叠效果,因此更有可能从低像素级别的图案生成大规模的莫尔纹效果。这是使用滤波器不太模糊形式的权衡。

  magick rings_crop.png -filter gaussian -resize 100x100  rings_gaussian.png
  magick rings_crop.png -filter gaussian -define filter:blur=0.75 \
                              -resize 100x100  rings_gaussian_interpolate.png
[IM Output]
高斯
==> [IM Output]
高斯插值器
(模糊=0.75 或 sigma=0.375)

加窗Sinc滤镜

Sinc 滤波器

数学已经确定,用于调整图像大小的理想滤波器(使用 2 通道“张量”调整大小技术)是Sinc()函数。(参见奈奎斯特-香农采样定理)。[IM Output]Sinc()在数学上是完美的,它具有一些我想指出的特殊特征。首先,在滤波器加权函数的每个整数距离处都变为零。这非常重要,因为它意味着滤波器不会过度模糊图像(不像高斯滤波器)。它还意味着,如果在不调整大小的情况下对图像进行重采样(“无操作”调整大小),则图像将完全不受滤波器影响。因此,它是一个插值滤波器,尽管它非常复杂。Jinc()函数与Sinc()密切相关,并且具有使其可用作二维滤波的滤波器的特性,例如通用图像扭曲运算符所使用的特性。稍后在圆柱滤波器中将详细介绍此函数。现在,只需注意它也可以用作窗口化 Jinc 滤波器的基础函数即可。Sinc()Jinc()滤波器与我们之前讨论过的滤波器的另一个主要区别在于,许多权重为负。也就是说,对于图像中的每个像素,它们会从最终颜色中减去一些附近的颜色像素。这可能看起来有点奇怪,但它会导致对象边缘的强烈锐化。当然,任何负权重通常都需要由曲线更远处的更多正权重来抵消,这会产生您看到的从采样点延伸很长一段距离的波浪状函数。这些额外的正(和负)权重“瓣”会导致图像中出现振铃伪影,这些图像包含非常强的颜色边界,例如高对比度的线图或边界,例如红色屋顶到蓝色天空。如果基于这些函数的滤波器应用不当,这些振铃效果会变得更加明显。

窗口函数

不幸的是,此函数也是IIR(无限脉冲响应)函数,也就是说,它的影响会一直持续到无穷大,就像之前提到的高斯滤波器一样。这意味着要使用“Sinc”,您需要生成图像中每个像素(以及超出范围)的加权平均值,以便为目标图像中的每个新像素创建最佳表示。这成本高得令人望而却步,使得直接使用这些完美的滤波器变得不切实际。当然,您也不希望由于出现振铃效应而使用它。但与高斯滤波器不同,“Sinc”函数不会在距采样点短距离处逐渐减小到接近零。事实上,即使在距采样点10个像素处(参见上图),您也可能对最终结果产生明显的影响。但是,使用支持距离为10的滤波器调整图像大小将需要对最终结果中每个像素至少进行20x20或400个像素的平均。这会导致调整大小速度非常慢。因此,不建议使用原始形式的“Sinc”滤波器,而且几乎从未使用过,尽管通过使用专家滤波器控件,IM不会阻止您这样做,如果您确实想这样做的话。建议并提供的则是“Sinc”函数的“加窗”形式,这些形式是由图像处理专家开发的,可用于将无限的Sinc(和Jinc)函数限制在更实用的范围内。这些加窗滤波器包括诸如“Blackman”、“Bohman”、“Hann”、“Hamming”、“Lanczos”、“Kaiser”、“Welch”、“Bartlett”和“Parzen”之类的滤波器。

加窗滤波器的工作原理

[IM 输出] 例如,右侧的图表显示了三个函数(点击查看放大视图)。红色函数是数学上理想的Sinc()函数,它延伸到无穷大。绿色函数是“Hann”加窗函数(基于简单的Cosine()曲线)。它与Sinc()相乘以调制滤波器的较远分量,在支持窗口的边缘达到零(或接近零)(默认情况下,此滤波器的距离为4.0像素单位)。基本上,通过为“-filter”选择选择“Hann”,您实际上是在选择'Hann()' '加窗函数' 来调制'加权函数',例如'Sinc()'(或'Jinc()')。因此,“加窗滤波器”实际上是两个函数。Sinc或Jinc函数(取决于图像处理运算符),以及您专门选择的作为要使用的滤波器的“加窗函数”。(请参见下面的专家滤波器控件)。
在v6.3.6-3之前,IM犯了一个严重错误,实际上直接使用加窗函数作为滤波器的加权函数。这反过来导致所有这些滤波器(Lanczos除外)在用于调整大小时产生严重混叠的图像。因此,IM用户常常误解或很少使用这些滤波器。现在这个问题已经得到修复。

各种加窗滤镜

[IM 输出] 右侧是IM在编写时可用的所有各种加窗函数的图表(后来又添加了一些)。是的,有很多,因为加窗函数一直是众多信号处理专家深入研究的课题。所有加窗滤波器函数通常都将用于使用支持3或4来调制Sinc(或Jinc)加权函数(对于Sinc,为3或4个波瓣),具体取决于所使用的加窗函数的类别(见下文)。例如,“Blackman”加窗滤波器将使用4个波瓣,“Lanzcos”将使用3个波瓣。这取决于您的IM版本,因此如果您想确定,请检查详细滤波器专家选项。如您所见,所有加窗滤波函数都产生了原始Sinc()函数的衰减形式,该函数也显示在图中。除了特定滤波器产生的振铃量之外,通常很少有其他方法可以将一个加窗滤波器与另一个滤波器区分开来。可能最好的加窗滤波器之一是“Lanczos”。虽然其他人则坚信“Blackman”、“Bohman”、“Hann”(余弦锥形钟)、“Hamming”(余弦钟变体)、“Cosine”(单个余弦波瓣)作为加窗函数。所有这些函数在其公式中都基于使用Sinc或Sine/Cosine函数,这据称可确保函数具有良好的频率响应。其他加窗滤波器包括“Welch”(抛物线)、“Parzen”(三次样条)、“Kaiser”(贝塞尔)以及可能最简单的“Bartlett”(三角形或线性)。通常,这些函数因其简单性和快速的计算而被创建,尽管它们通常被认为具有较差的“频率响应”。此外,许多这些加窗函数本身也被用作重采样滤波器。例如,“Bartlett”(这可能是所有加窗函数中真正的奇葩)实际上与“Triangle”滤波器以及“Bilinear”插值滤波器使用的数学函数相同。所有函数(“Bartlett”除外)都形成了两大类加窗函数。
  • 锥形“钟形”曲线,例如“Hamming”、“Hann”、“Kaiser”、“Blackman”、“Bohman”和“Parzen”。
  • 以及未锥形的“波瓣”型加窗函数,它迅速下降到零,然后被窗口的支持“切断”,例如“Lanczos”、“Welch”和“Cosine”。
如果您研究上面的加窗函数图,您可以看到两种滤波器样式的形状差异。但是,这两大类加窗函数似乎并不像使用三角函数定义的曲线获得的整体“频率响应”那样重要。锥形“钟形”加窗函数将使用波瓣支持超过Sinc加权函数(或圆柱体(扭曲)重采样中的Jinc函数)的4个波瓣。未锥形的“波瓣”型加窗滤波器将默认为使用3个波瓣支持。由于加窗函数滚降的不同,这导致了两种加窗滤波器之间的大致等效性。这也意味着,默认情况下,未锥形的加窗滤波器将比锥形的滤波器略快。滤波器应具有的默认波瓣数在IM论坛讨论中进行了讨论,添加余弦加窗?。当然,如果您愿意,您可以更改波瓣支持,甚至可以更改任何调整大小滤波器的常规支持。它们都差不多,只是在产生的振铃和阻塞效应的量上存在非常细微的差异。[IM 输出] 右侧是相同的加窗函数,但使用IM根据函数的锥形/未锥形特性定义的默认波瓣支持。如您所见,在前两个波瓣(影响最大的主要波瓣)上,任何滤波器之间几乎没有差异,并且所有滤波器在该范围内都显示出非常相似的“滚降”。但是,函数的顺序变化不大,极值仍然在“Welch”和“Parzen”之间,而“Lanczos”则恰好位于所得曲线滚降的中间。 [IM 输出] 右侧是用户使用上述默认值选择这些加窗函数将提供的所得加窗Sinc滤波器。如您所见,最终的加权曲线都非常相似,并且如预期的那样,所有曲线都夹在“Welch”和“Parzen”的极值之间。您可以在维基百科,加窗函数上查看大多数这些各种加窗函数及其在傅立叶频谱中的结果的更详细的定义和图表。
总而言之:我发现这些不同的加窗函数在结果上并没有太大区别。此外,我对研究论文结果的阅读也似乎更多地是对其适用性的定性意见,而不是任何具体的东西。我的感觉是,几乎可以使用任何加窗函数,但如果我必须选择一个,您最好坚持使用最流行的“Lanczos”加窗滤波器。它位于所有上述滤波器的中间,具有良好的频率谱响应,并且通常是一个很好的重采样滤波器选择。另一方面,一位图像处理专家(他一直是ImageMagick重采样滤波器的重要推动者)对此表示不同意见。尽管他根据特定图像的确切要求选择滤波器。您可以在Nicolas Robidoux推荐的技术中查看他的建议和评论。

Lanczos 滤镜

我们已经多次提到了“Lanczos”滤波器。它可能是加窗滤波器中最著名的滤波器,它位于我们看到的加窗滤波器范围的中间。本质上,它不会“滚降”得太快或太慢,并且在所得的傅立叶变换中具有良好的频率响应。基本上,“Lanczos”为任何类型的滤波器工作提供了一个很好的起点,并且已广泛用于最近开发的加窗Jinc圆柱滤波器(见下文)。“Lanczos”滤波器基本上使用Sinc()函数的第一个“波瓣”来对Sinc()函数进行加窗。也就是说,滤波器的加权函数用于设置滤波器自己的加窗函数。许多人认为这是选择它而不是许多其他加窗Sinc滤波器的良好理由。尽管几乎没有真正的证据表明它是最好的,但它是一个可靠的中档滤波器。默认情况下,IM将“Lanczos”滤波器定义为具有3个“波瓣”。这样做的原因是因为加窗函数本身是“未锥形的”,因为它只是一个切断的单个波瓣,函数的第一个零交叉与窗口支持限制相吻合。请参阅上面的加窗滤波器的工作原理[IM 输出] 但是,一个2波瓣的“Lanczos2”滤波器(具有默认波瓣为2的Lanczos,为方便用户选择而添加)也被发现很受欢迎,因为它可以避免加窗Sinc滤波器可能产生的正振铃伪影。“Catrom”(实际上是“Catmull-Rom滤波器”)几乎与“Lanczos2”滤波器完全相同,但由于它是三次滤波器,因此在数学上生成的速度要快得多。但是,这通常不是IM在处理图像之前缓存滤波器值的方式所带来的问题。话虽如此,在IM论坛中的一段长时间的讨论似乎表明,对于正交(张量)调整大小,4波瓣“Lanczos”实际上更适合缩小图像,同时防止具有非常细密图案的图像中的莫尔纹,但代价是产生更多振铃

波瓣中的加窗大小

正如我提到的,底层的 Sinc(和 Jinc)滤波器函数实际上是无限大的。尽管默认情况下 IM 使用指定的窗口函数将其限制在一个更小、更实用的尺寸。但是,在某些情况下,您可能确实希望尝试使用更大、更慢的窗口(支持)尺寸来获得图像更精确、更准确的缩放。这可以通过使用 滤波器支持 专家控制来非常简单地实现,就像我们对 高斯类 滤波器所做的那样。窗口函数本身(在大多数情况下)会将 Sinc(和 Jinc)在 支持 设置范围内降至零。但是,随着窗口函数按比例缩放以适应“支持”窗口,生成的滤波器函数也会发生变化。 [IM 输出] 例如,在右侧,我绘制了“Lanczos”窗口滤波器,相对于Sinc()函数作为参考,使用从 2 到 8 的各种“支持”设置。请注意,滤波器的实际大小受使用的实际支持大小限制。支持越小,滤波器速度越快,但函数越不精确地遵循数学理想的Sinc()函数。仔细观察每条曲线。“绿色”(支持=2)曲线仅具有主要的中心峰值,加上一个负“瓣”(相当于“Lanczos2”滤波器)。在此之后,函数只是零,并且未使用。下一个“紫色”(支持=3,以及默认的“Lanczos”滤波器)曲线,具有更大的第一个负“瓣”,然后是一个较小的正“瓣”。随着支持尺寸以整数增量增加,这种情况会持续出现更多瓣。附加的瓣的高度越来越小,对最终结果的影响越来越小,但初始“瓣”变得越来越高(影响更大,因此产生更多的 振铃 效应)。为了获得最佳效果,您将使用支持设置,以生成一个包含那么多上/下“瓣”的滤波器。也就是说,您将使窗口函数,以及滤波器的“支持”,结束于“零交叉”。但是,虽然Sinc()函数在整数“支持”设置处具有“瓣”(零交叉),但Jinc()加权函数则没有。这给希望调整用于 扭曲操作符 的滤波器的支持窗口的用户带来了问题。事实上,Jinc()在高度 无理数 位置处具有“零交叉”。这些零交叉很难计算出来,除非是数学专家。为了更容易地根据“瓣”的数量设置滤波器,创建了另一个特殊设置,“-define filter:lobes={整数}”。如果滤波器被二维图像重采样操作符(例如 通用扭曲操作符)使用,该操作符通常使用Jinc()作为基本函数,它将查找滤波器前 20 个零交叉点的表,并将“支持”设置设置为该值。这意味着您不必尝试为Jinc()函数查找合适的支持设置,只需指定要使用的瓣数即可。因此,最好根据滤波器要包含的“瓣”的数量来指定窗口 Sinc 或 Jinc 滤波器,而不是指定更直接的“支持”设置。如果滤波器定义未使用Sinc()Jinc()函数,则“filter:lobes”设置用于计算滤波器使用的适当“支持”设置。但是请注意,“filter:support”设置将覆盖任何给定的“filter:lobes”设置,因此最好只定义“filter:lobes”专家选项,尤其是在使用 通用扭曲操作符 时。

拉格朗日滤镜

就像“高斯”滤波器是一个数学上缓慢的函数(这并不会对整体速度产生太大影响,这要归功于 IM 对结果的缓存),Sinc/Jinc 窗口滤波器 由于需要计算用于加权和窗口函数的三角函数,因此计算起来更加缓慢和复杂。“Lagrange”滤波器使用分段三次多项式函数来近似窗口滤波器。(参见 维基百科:拉格朗日多项式)。就像 窗口滤波器 可以根据 支持设置 进行调整一样,“Lagrange”滤波器也会根据该设置进行自我调整。默认的 支持 设置为 2.0,会生成一个“Lagrange”滤波器(阶数为 3)。此滤波器非常适合图像的放大和缩小,具有最小的 块状振铃 效应,并且没有 模糊 效应。
支持专家控制 实际上是在定义应使用的拉格朗日滤波器的“阶数”。也就是说,默认的 2.0 支持拉格朗日滤波器会生成阶数为 3 的拉格朗日滤波器(阶数 = 支持 × 2 - 1,因此支持=2.0 => 拉格朗日-3 滤波器)。这就是为什么您只能使用半整数大小的设置。

因此,要获得阶数为 4 的拉格朗日滤波器,您将使用选项
  -define filter:support=2.5
[IM 输出] 使用更大的 支持 设置,“Lagrange”滤波器会生成 窗口 Sinc 滤波器,而无需进行复杂的三角函数计算,甚至无需额外的窗口函数。支持设置越大,滤波器模拟Sinc()函数的效果越好,但计算速度也越慢。(参见左侧较大支持拉格朗日滤波器的图表)。
[IM 输出] 使用较小的 支持 设置和“Lagrange”滤波器可以模拟大多数各种 插值滤波器。也就是说,“0.5”的支持尺寸将生成“Box”滤波器,“1.0”将生成“Triangle”滤波器。支持 设置限制为以半整数进行调整,使用任何其他支持因子都没有什么意义。
[IM 输出] 其他半整数支持,拉格朗日滤波器(生成偶数阶)会产生一组非常分离的滤波器权重,并且类似于“Box”滤波器,它们会产生一些强烈的 块状 缩放伪像。另一方面,对于小规模缩放,这可以确保图像在非常小的缩放调整中保持清晰。这些“偶数”阶“Lagrange”滤波器实际上突出了使用此滤波器的主要缺点,即加权函数不是“平滑”的梯度。在大规模放大中,这意味着您可能会看到生成的梯度发生明显变化。但是,这很少成为问题,除非是在那些极端情况下。基本上,它表示一个滤波器,它会普遍为当前的“支持”设置创建合适的滤波器,而不管该设置的大小如何。它是一个自窗口缩放滤波器。
Lagrange”滤波器直到 IM 版本 v6.3.7-1 才完全定义并可用。

三次滤镜

由于许多图像专家试图找到一种更好、计算速度更快的图像缩放滤波器,因此出现了一系列滤波器,并被称为三次滤波器。它们非常类似于前面显示的 拉格朗日滤波器,并且由一组较小的固定分段组成。但是,与拉格朗日滤波器不同的是,这些片段的设计是为了组合在一起形成一条平滑的曲线,以减少尖锐的 块状 效应。 [IM 输出] 左侧图表中显示了四个此类预定义在 IM 中的“平滑”三次滤波器,并且众所周知它们用作缩放滤波器。“Spline”滤波器(也用作通用“Cubic”滤波器函数的别名和默认设置)模拟 高斯模糊滤波器。此曲线也称为“B 样条”插值曲线,也常用于通过一系列点绘制平滑线条。它也常用于动画中的相机和物体运动,以产生通过用户提供的控制点的平滑流动。还显示了“Catrom”,或更准确地说,“Catmull-Rom 滤波器”或“Keys 三次卷积”,它会生成 插值滤波器 的平滑非模糊形式。但是它可能会稍微过度。它本质上是一个理想的自锐化滤波器,因此也是通常用于基本 双三次插值 的函数。最后是“Hermite”三次滤波器,它是一种平滑的三角形 插值滤波器,它将在输入坐标处平滑地减慢(滚降)。基本上,它会圆角化强边缘,同时保留原始图像中的平坦“颜色级别”。

三次滤波器族

以上是三次曲线最常见的“命名”滤波器,但它们也属于特定的三次滤波器族。“B 样条”三次滤波器族本质上等同于结果的不同程度的 模糊。通常从非常 模糊 的“Spline”滤波器到“Hermite”滤波器产生的边缘圆角但 块状 的结果。然后是“Cardinal”族,它产生的滤波器在 块状振铃 伪像之间进行折衷,并且“Catmull-Rom 滤波器”(“Catrom”)由此演变而来,作为这些伪像的平衡折衷方案。这两个族随后合并形成“Keys 三次滤波器族”,该族将“Catmull-Rom 滤波器”(Keys α = 0.5)与“B 样条三次滤波器”(Keys α = 0.0)联系起来。Keys 族滤波器还具有保留图像中可能存在的任何线性(仿射)梯度的特殊属性。Keys 族滤波器的 振铃模糊 效应仅在图像包含强烈的颜色变化而不是平滑的颜色梯度时才会发挥作用。对各种滤波器感到困惑吗?当然,您会困惑。其他人也是如此!问题在于,滤波器的结果通常非常主观,取决于图像以及您使用的“族”的限制。什么才是好的滤波器,这实际上取决于你问谁,你是在放大还是缩小,以及你正在处理什么图像。在某种程度上,它仍然很令人困惑。我花了超过两年的时间摸索、阅读和玩弄各种滤波器,才想出了这个总结的开始,即使现在它仍在不断发展。图像缩放是一个非常主观的领域,很难(实际上已被证明是不可能的)以任何真实的方式量化。不存在“完美”的缩放。

Mitchell-Netravali 滤波器

在此,Don P. Mitchell 和 Arun N. Netravali 发表了一篇论文,“计算机图形学中的重建滤波器”,其中定义了两个变量“B”(用于“B样条”曲线)和“C”(用于“Cardinal”曲线,等效于“Keys”滤波器的α值)。使用这两个值,您可以生成任何平滑拟合(连续的一阶导数)的分段三次滤波器。[IM Output] 更重要的是,他们随后调查了一组 9 位图像处理专家,而不是仅仅依靠他们自己的观点,对使用不同 B 和 C 值稍微放大图像产生的伪影进行分类。该调查的结果如右侧的重建图所示。“绿色”区域表示专家认为产生可接受结果的值,而其他各个区域则产生各种类型的伪影。此图像很重要,因为它确实显示了各种伪影与可以生成的各种不同类型的滤波器之间的关系。您还可以从结果中看出为什么“Keys”滤波器族变得如此重要,因为它是一种生成良好三次滤波器的更好方法之一。它的滤波器基本上沿着一条直线穿过图像处理专家认为“可接受”的区域。通过这项调查,Mitchell 和 Netravali 确定最佳滤波器是“Keys”滤波器族中的一个滤波器,它位于可接受区域的中间,使用 B、C 值为 1/3、1/3。该滤波器现在被称为“Mitchell-Netravali 滤波器”,在 IM 中可用作“Mitchell”滤波器设置。基本上,它是所有调整大小伪影的折衷方案。它也是 IM 图像放大的默认滤波器。所有内置的“命名”三次滤波器:“Mitchell”、“Robidoux”、“Catrom”、“Spline”和“Hermite”;也在上图中做了标记,显示了这些专家对这些特定滤波器的看法。还显示了代表“B样条”、“Cardinal”和“Keys”滤波器族的线条。在内部,所有这些滤波器仅在滤波器的预定义 B、C 设置方面有所不同,实际上 IM 使用相同的内部函数来生成所有三次滤波器,只是使用不同的 B、C 设置来定义这些滤波器。

三次 B、C 专家控制

您可以使用特殊的专家设置来设置三次滤波器正在使用的 B、C 设置。为此,您需要选择通用“Cubic”滤波器“函数”(或任何其他命名的三次滤波器),以及所需的“b”和“c”专家设置。例如...
   -filter Cubic
   -define filter:b=value
   -define filter:c=value
当调整大小或扭曲运算符使用专家设置时,它将覆盖给定滤波器的内部默认值。因此,只要您在使用图像处理运算符之前已使用“-define”或“-set”设置了所有所需的全局专家设置,上述选项的顺序就无关紧要。如果“b”或“c”设置之一未定义或未设置,则将在假设您希望使用“Keys”滤波器族(在 Mitchell-Netravali 调查图中的虚线上)的情况下根据另一个值计算其值。请记住,“c”等效于 Keys α 设置,而“b”可以认为是三次样条“模糊”设置。这些专家设置为了用户能够“调整”其图像大小调整以获得他们想要的确切效果提供了一种好方法(无论他们是在使用调整大小还是扭曲)。“b”设置这两个设置中更容易理解。只需将“b”视为“模糊度”。b=0 的值非常锐利(Catmull-Rom 滤波器),它往往会产生负光晕环绕和一些混叠或莫尔效应。b=1 的值往往会产生过度模糊(样条或高斯状)的效果。这使得专家(甚至普通用户)可以轻松调整此值以找到对他们来说“良好”的滤波器。
右侧是一个表格,其中列出了特定“命名”三次滤波器的 B、C 值。请记住,“Hermite”是唯一一个不属于“Keys”滤波器族的内置三次滤波器。它还具有所有 BC 三次滤波器中最小的支持('1.0'),并且不包含负叶。'Robidoux' 和 'RobidouxSharp' 滤波器与 'Mitchell' 非常相似,但它们不是调查的结果,而是为了作为圆柱形滤波器的特殊用途而通过数学方法确定的。“Robidoux”滤波器是通用扭曲运算符使用的默认滤波器(见下文)。  
滤波器 B
 模糊 
C
Keys α
Hermite 0.0 0.0
Spline 1.0 0.0
Catrom 0.0 1/2
Mitchell 1/3 1/3
Robidoux 0.3782 0.3109
Robidoux
锐化
0.2620 0.3690
Robidoux
柔和
0.6796 0.1602
Parzen”窗口滤波器使用“Spline”滤波器作为其窗口函数。因此,您可以根据 B、C 专家选项重新定义此窗口滤波器。这是否有用以及它对生成的加窗 Sinc(或 Jinc)有什么影响尚不清楚,也不推荐使用。

圆柱形滤波器- 用于扭曲

正如我们已经多次谈到的那样,扭曲运算符使用滤波器设置以与调整大小运算符略有不同的方式重新采样图像。具体来说,扭曲使用“采样点”与源图像采样区域内实际像素之间的“径向”距离来应用滤波器,以确定每个像素的权重,从而确定采样点的最终颜色。调整大小相反,使用正交对齐的滤波器两次处理图像。一次在 X 方向,然后再次在 Y 方向,因此它仅限于图像的简单矩形调整大小,并且不涉及使用虚拟像素。也就是说,扭曲应用滤波器以产生“圆柱形”形状而不是“框”形状,以便允许图像的自由形式扭曲,包括旋转和任何方向的可变缩放(拉伸和压缩),而不仅仅是沿着 X 或 Y 轴。因此,滤波器本身通常需要进行调整或专门为此类用法而设计。

插值圆柱滤镜

这里我使用“”滤波器将单个像素图像放大 30 倍,使用等效的调整大小扭曲运算符。

  magick xc:  -bordercolor black -border 1 \
          -filter Box   -resize 3000%      dot_resize_box_black.png
  magick xc:  -bordercolor black -border 1 \
          -filter Box   +distort SRT 30,0  dot_distort_box_black.png
[IM Output]
调整大小
[IM Output]
扭曲
正如您所看到的,当“”滤波器用作圆柱形滤波器时,您会得到一个圆圈(或 3 维空间中的圆柱体)。但是,由于滤波器的处理方式,您会得到一些采样两个像素(相等)以产生完美的中间色灰色的区域。您可以将圆柱形框滤波器想象成将源图像转换为一整套重叠的圆形像素,这些像素会融合在一起(而不是相加)。以下是用“圆柱形框”滤波器放大图像的结果的一个更生动的示例...

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box   +distort SRT 30,0  color_box_distort.gif
[IM Output]
对于扭曲的图像,这些圆形像素也会扭曲成一组重叠的椭圆。例如...

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -alpha set -virtual-pixel transparent -filter Box \
          +distort Perspective '0,0 0,0  0,3 0,90 3,0 90,30 3,3 90,60' \
          color_box_distort.png
[IM Output]
圆柱形“”滤波器的支持“半径”从“0.5”增加到“0.707”(sqrt(2)/2)。这确保滤波器始终会在圆形采样区域(对角线)中找到至少一个源像素。这是任何圆柱形滤波器的最小实用支持大小。

没有其他滤波器存在此覆盖问题,需要增加支持。
如果支持度至少不是“0.707”,那么您的图像中可能会出现滤波器“错过”所有源像素的区域,从而产生重采样失败

使用更大的支持设置也会产生有趣的图案。当“圆圈”变大时,更多像素将融合在一起。例如...

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box -define filter:support=0.83 \
          +distort SRT 30,0  color_box_distort_overlap.png
[IM Output]
结果是一种混合插值的圆形形式。

在 1.0 或更大的支持度下,每次重采样都将至少两个像素的“框”或“平均”混合。


以下是许多插值滤波器的比较。使用灰色是为了让您可以看到过冲和欠冲。顶行使用正交调整大小,而底行使用圆柱扭曲。

  for filter in box triangle hermite lagrange catrom
  do
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   -resize 2000%      dot_resize_$filter.png
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   +distort SRT 20,0  dot_distort_$filter.png
  done
[IM Output]
[IM Output]
方框
[IM Output]
[IM Output]
三角形
[IM Output]
[IM Output]
Hermite
[IM Output]
[IM Output]
拉格朗日
[IM Output]
[IM Output]
Catrom
您可以看到结果如何相似,但两种不同的滤波器应用方式都会产生不同风格的伪影,包括内部和外部(环绕)。内部伪影在“三角形”滤波器中尤其明显。但是请记住,插值滤波器对于扭曲图像的极端缩小(缩小)并不是特别好,但它们对于放大(放大)非常好。

圆柱高斯

唯一一个在正交“调整大小”和圆柱“扭曲”形式之间产生结果差异的滤波器是特殊的“高斯”滤波器...

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   +distort SRT 33,0  -normalize  dot_distort.jpg
[IM Output]
这实际上是该滤波器的一个特殊属性(称为可分离性),也是许多圆柱形重采样实现将其用作默认滤波器的原因之一。它是原始 EWA 论文的默认值,但在结果中也非常模糊。ImageMagick 在首次实现扭曲时也使用它,但现在不使用了。就像正交调整大小一样,“高斯”滤波器即使在将它应用于特殊的“环”图像时,也不会在生成的图像中产生任何混叠伪影。但代价是结果模糊,即使实际上没有涉及多少或根本没有扭曲。同样,如Sigma 专家控制中的讨论所述,您还可以将此滤波器用作一种插值滤波器。
从 IM v6.6.5-0 开始,IM 不再将此滤波器用作图像扭曲的默认滤波器。而是使用另一个滤波器“Robidoux”滤波器,该滤波器专门设计用于产生更锐利的结果。

无论如何,在此版本之前,由于其实现中的错误,扭曲也非常模糊。如果您有旧版本并希望使用图像扭曲,请升级。

在 IM v6.6.7-6 之前,IM 会为圆柱形高斯使用略大的“sigma”值,即 1/sqrt(2) 或大约 0.707,而不是 1/2。这导致了稍微更模糊的结果,目的是减少可能的混叠伪影

这是一个错误,它是由遵循一篇研究论文的建议而产生的,即将圆柱形框滤波器的更大支持传递到高斯滤波器中。提出的理由是高斯本质上是一个模糊的框。事实并非如此。高斯是模糊的脉冲,而不是模糊的框。此版本删除了该错误,这意味着当使用高斯滤波器时,您现在应该能够获得调整大小或扭曲的等效结果。

我个人发现使用这个稍微更大的 sigma 值确实可以平滑掉在进行线条图放大时沿混叠对角线边缘的任何“阻塞”伪影。但这是一个特殊情况。

加窗 Jinc 圆柱形滤波器

[IM 输出] Jinc() 函数(有时不准确地称为“Bessel”滤波器)是用于圆柱形滤波操作的“Sinc”等效函数。虽然与Sinc()非常相似且密切相关,但它旨在使用径向或圆柱距离对矩形值数组进行滤波,而不仅仅是在正交(轴对齐)方向上进行滤波。如果您查看提供的Jinc()函数图,您会发现它的第一个“零交叉点”(表示最近邻的第一个环)落在 1.0(对于正交邻域)和 2 的平方根之间。也就是说,零交叉点的大致值为“1.2196699”。Jinc()函数的工作原理是,如果采样点等于实际像素值,则Jinc()函数会为稍微靠近的正交邻域像素分配正值,但随后为稍微远离的对角邻域像素分配类似的负值,依此类推,因为它在二维值数组中移动得更远。因此,当不执行缩放(失真)时,理论上邻域的贡献应该相互抵消。这就是为什么Jinc滤波器在数学上是方形数组圆柱形重采样的首选解决方案,因此是扭曲椭圆重采样方法 (EWA) 的“理想”滤波器。这并不是说从人的角度来看它是一个“完美”的滤波器。因此,在使用扭曲操作符时选择任何加窗滤波器,都会用等效的“Jinc()”函数替换正常的“Sinc()”函数。由于Jinc()函数的零交叉点位于非整数位置,因此务必根据上面为加窗 Sinc 滤波器介绍的特殊瓣数支持设置来指定滤波器的支持范围。使用“加窗 Jinc”滤波器最大的问题是,当源图像包含像素级散列模式(例如“pattern:gray50”提供的模式,请参阅内置模式)时。在这种情况下,所有正交邻域都与对角邻域不同,因此图像会因“Jinc()”函数而严重模糊。但是,几乎所有其他模式,例如线条、边缘、角点,在使用“加窗 Jinc”滤波器时都保持相当清晰锐利,使其仍然是一个很好的函数。这个“问题”可能是一件好事,因为它意味着可以使用二维圆柱 Jinc 派生滤波器作为从图像中去除强像素散列类型模式的方法,例如由颜色减色抖动生成的模式,而不会大幅影响图像其余部分的清晰度。也就是说,它可以用作“抖动去除方法”(见下文)。

无操作情况下的扭曲和滤波器

理想情况下,无操作扭曲应该返回完全相同的图像。但是正如您在前面的示例中看到的,实际上可能不会发生这种情况。调整大小(两遍一维)滤波器:Lanczos(Sinc-Sinc)、Lanczos2、Catrom、Hermite、Triangle 和许多其他调整大小滤波器都具有此属性。如果图像未缩放,则像素模式将完全保留。另一方面,平滑或模糊滤波器(如 Gaussian、Cubic 和 Quadratic)如果应用于接近无操作的情况,将使图像模糊。请注意,即使是调整大小滤波器的默认值 Mitchell-Netravali 也包含一些模糊,因为它基本上是 B 样条“Cubic”平滑滤波器和 Cublic 双瓣 sinc 等效 Catmull-Rom 滤波器的混合。
调整大小操作符默认情况下会自我短路,因此在无操作情况下不会执行任何操作。因此,除非您专门指定滤波器,否则您无法生成“无操作”调整大小。

扭曲在无操作情况下永远不会短路,这是为了确保动画的一致性,在这些动画中,扭曲缩放可能会经过“无操作”情况。这通常不是调整大小需要考虑的事情。

虽然许多调整大小滤波器会在无操作情况下保留图像。圆柱形(扭曲)方法基本上永远不会产生完美的无操作扭曲。任何无操作扭曲至少会最小程度地扭曲图像的颜色,即使图像本身没有扭曲。发生的情况是,通过使用圆柱形滤波器,正交邻域像素的贡献将不同于对角邻域像素的贡献。从本质上讲,它们与查找点的距离不同(以无操作情况下的实际像素为中心)。“Jinc”函数试图通过抵消正交邻域的贡献与对角邻域的贡献来减少这种颜色失真。也就是说,实际上是其数学定义的一部分。在最坏的情况下,“像素级散列”,每个对角像素邻域都与每个正交像素邻域不同。在这种情况下,滤波器权重将增强而不是抵消贡献。因此,对于任何包含“像素级散列”的图像的无操作扭曲,此类型的图像往往会产生非常严重的颜色失真。例如,我在这里实际上使用此特殊属性从图像中去除散列模式。不使用缩放,只是对图像应用二维“卷积”的扭曲。

  magick -size 100x100 pattern:gray50  hash.png
  magick hash.png -filter Lanczos -distort resize 100% hash_removed.png
[IM Output] ==> [IM Output]
散列的感知灰度级比散列的整体灰度级暗得多的原因是人类颜色感知的工作方式。

解决方法是在上述内容中包含“-set colorspace RGB”,以告诉 IM 我们正在线性 RGB 颜色空间中调整大小。请参阅使用颜色空间校正调整大小

上面实际上等效于使用类似 Jinc 的核函数进行卷积。但正如您所看到的,Jinc 函数的特殊属性(在本例中为 EWA Lanczos 或 Jinc 加窗 Jinc)完全去除了原始图像中存在的强散列模式。它现在唯一保留的部分是在边缘,其中围绕图像本身的“深渊”(没有虚拟像素贡献)可能会影响结果。加窗 Jinc 滤波器的实际瓣数对结果也有巨大的影响。使用 2 个瓣时,“像素级散列”往往会保留,尽管会变暗或模糊。

  magick hash.png -filter Lanczos2 -distort resize 100% hash_2_lobes.png
应用于 Jinc 函数的加窗方法的贡献也会对这种效果产生重大影响。在某些情况下甚至会进一步增强散列模式。
[IM Output]
因此,问题就变成了如何调整扭曲滤波器,以便最大程度地减少滤波器为无操作扭曲生成的色差。Nicolas Robidoux 选择的方法是选择一种模糊(滤波器核支持的重新缩放),该模糊尽可能地保留正交边缘。

圆柱 Lanczos 滤波器

现在,如上所述,“Lancoz”通常定义为一个“Sinc()”函数,用于滤波器的加权和加窗。但当用作 EWA 圆柱滤波器时,这两个加权函数都将被“Jinc()”函数替换。也就是说,不仅加权函数被替换(对于其他线性加窗滤波器也是如此),而且它还替换了加窗函数,产生了一个 Jinc 加窗 Jinc 加权函数。因此,“圆柱 Lanczos”将选择一个具有相同瓣数(默认为 3)的“Jinc 加窗 Jinc”。这种技术最初由 Andreas Gustafsson 在关于交互式(局部)图像扭曲(第 24 页)的论文中提出。他专门使用了 2 瓣圆柱 Lanczos(Jinc 加窗 Jinc)滤波器,他将其命名为“Lanczos2D”(见下文)。这仅仅是平面 (EWA) 情况的明显扩展。因此使用了相同的名称。有关此内容的更多信息,请参阅此BC 样条讨论中的帖子

Lanczos2 - 2 瓣 Lanczos

为了方便起见,这个名为“Lanczos2”的双瓣版本包含在 IM v6.6.4-10 中,专门用于扭曲。它实际上只是一个圆柱形“Lanczos”(Jinc-Jinc)滤波器,具有“filter:lobes=2”专家设置。请参阅上图,并且由于 IM 滤波器会自动在使用Sinc()Jinc()函数之间切换,因此它不仅适用于“2D”(圆柱形)用途。它也可以用于调整大小(作为 Sinc-Sinc 函数),尽管我不推荐它,因为它可能有点太小,并且实际上等效于各种其他三次函数。

LanczosSharp - 略微锐化的 Lanczos

观察到,与正交调整大小结果中的类似加窗Sinc()函数相比,对Jinc()函数进行加窗会导致更模糊的 EWA 扭曲结果(尤其是在细线情况下)。对于轻微的扭曲,尤其如此。基本上,Jinc()函数具有一些特殊属性,并且对Jinc()函数进行加窗会破坏这些特定且理想的属性。经过一些计算,劳伦森大学数学教授 Nicolas Robidoux 得出了一种略微锐化的 3 瓣圆柱 Lanczos 版本,现在称为“LanczosSharp”,在某种程度上解决了图像扭曲问题。但是,生成的滤波器仍然具有加窗 Jinc 圆柱滤波器的低级“像素级散列”模式的强烈模糊。

锐化的 Lanczos2

[IM 输出] 同样的问题在“Lanzcos2”滤波器中更为严重,因此 Nicolas 还使用稍微更大的模糊专家控制生成了一个更锐化的“Lanczos2Sharp”滤波器。这导致滤波器在“无扭曲”情况下对垂直或水平线仅产生最小的模糊。这种锐化滤波器导致零点发生轻微偏移,因此现在位于大约“1.1684”处。这看起来可能不多,但它对滤波器为几乎没有扭曲的图像生成的模糊量产生了巨大影响。

Lanczos 半径

[IM 输出] 这是一个 EWA Lanczos 滤波器,其模糊(锐化)程度使得所使用的瓣数(默认为 3)适合于整数支持半径。也就是说,3 瓣 EWA Lanczos(基于加窗 Jinc)被锐化到恰好具有半径 3 的支持。您可以使用瓣数专家控制来获得相同的结果,但由于它涉及基于 Jinc 函数的已知零交叉点的调整,因此这不是一个容易进行的计算。Nicolas 建议添加此滤波器,以便您无需进行该计算,并允许您测试此非常具体的锐化滤波器。未来:Jinc 加窗 Jinc 滤波器的模糊因子的表格。
包括瓣数作为参考。

Robidoux 圆柱滤波器

[IM 输出] 奇怪的是,实验表明,使用 Mitchell-Netravali 滤镜作为圆柱滤镜,在“无失真”的情况下产生了几乎等效的“锐利”结果。然而,该滤镜与其用作圆柱滤镜之间没有任何关系,因为它是由“社会研究”为正交(缩放)滤波而选择的。'Mitchell' 滤镜在保留低级“像素哈希”模式方面特别出色,而普通的 加窗 Jinc 滤镜 在圆柱滤波图像中会破坏这些模式。Nicolas 随后发现,通过一个奇怪的巧合,'Mitchell' 非常接近上面讨论的 'Lanzcos2' 滤镜的“锐化”形式。这反过来又导致他开发了一种 Keys 三次滤镜,它可以完美地保留垂直(和水平)线。此外,这种新滤镜的计算成本更低,因为三次函数的计算成本远低于 Jinc 函数。从 IM v6.6.5-0 版本开始,此三次滤镜已作为 'Robidoux' 滤镜添加到 IM 中,并且也是 Distort 及其 椭圆加权重采样 方法使用的默认滤镜,特别是由于其在仅具有最小失真的图像中具有最小模糊的特性。也就是说,这并不是说它是“最佳”滤镜,甚至 Nicolas 本人也喜欢使用其他滤镜,但它是一个非常好的折衷方案,就像 'Mitchell' 是正交(张量)缩放的良好折衷方案一样。我在 三次映射(由 Mitchell-Netravali 调查 生成)上标记了此滤镜,因此您可以看到它与 'Mitchell' 滤镜的关联程度有多密切。实际上,它可以作为正交缩放或圆柱形失真图像的合理滤镜。

Robidoux 锐化圆柱滤镜

'RobidouxSharp' 滤镜是 'Robidoux' 滤镜的略微更锐化的版本,尽管有些人认为结果过于锐利。它专门设计用于在“无失真”情况下,以最小的误差保留包含纯黑和白色像素的图像。具体来说,正交相邻像素的权重在“无失真”情况下与对角相邻像素的负权重完全匹配。巧合的是,'Mitchell' 滤镜恰好几乎完全位于 'Robidoux' 滤镜和 'RobidouxSharp' 滤镜之间,并且都属于 Keys 三次 滤镜族。因此,用户可以在这三种滤镜中进行选择,以控制接近“无失真”情况下的模糊锐利度。有关此滤镜的详细信息,请参阅 IM 论坛上的 BC 样条曲线 讨论。

Robidoux 软化圆柱滤镜

这是后来添加的,与其他看到的圆柱滤镜非常不同。是的,它更加模糊,使其更适合于放大或扩展图像,从而避免在砖房照片上出现一些阶梯效应。有关此内容的更多信息,请参阅 BC 样条曲线讨论中的帖子,以及来自 照片处理论坛讨论 的此讨论。

圆柱滤镜总结

Nicolas Robidoux 在关于 EWA 中 Jinc 滤镜的正确缩放 的漫长且正在进行的论坛讨论中,给出了圆柱滤镜的总结...
如果 Robidoux 太柔和,RobidouxSharp 太锯齿化,我建议您尝试使用 Mitchell(使用 distort Resize),它几乎处于中间位置。

由于 JPEG 涉及(离散)余弦变换,因此我不惊讶基于傅里叶考虑的滤镜(Lanczoses 等,无论是使用 Sinc 缩放还是使用 Jinc 失真)通常比基于“平滑函数的良好近似”(基于 Keys 三次:Robidoux、Mitchell、RobidouxSharp、CatRom,无论使用缩放还是失真)的滤镜效果更好。这种优势在 PNG(不会通过傅里叶域破坏信息)中似乎较少。

Nicolas 还有更多要说的。他甚至有自己的部分 Nicolas Robidoux 的重采样,现在已成为一个独立且内容丰富的页面。

专家滤镜控制

在以上各节中,我介绍了许多特殊的“专家”控制,这些控制将允许您以各种方式修改各种滤镜。您可以使用 全局定义设置(或等效的 设置选项)来定义这些专家设置。IM 命令行选项参考页面中“-filter”提供了所有专家选项的完整摘要。“-filter”设置实际上仅用于适当地查找和设置专家控件,以便定义给定的“命名”缩放滤镜。这些设置将覆盖上面指定的默认值,在为特定的缩放或失真图像处理操作设置滤镜时。
"-filter" 设置 'Point' 完全绕过上述所有滤镜设置,并退化为未缩放的“最近邻”直接查找(缩放)或插值查找(失真)。因此,此命名滤镜设置有效地完全关闭了缩放图像查找滤镜。
现在,虽然它们可用,但我还想最后说明一点。
除非您是专家(或只是在玩耍)——最好不要使用它们!
精通图像处理的人很少,除非您确切地知道滤镜的作用以及更改它们如何影响滤波方法,否则您可能只会破坏图像处理的有效性,并产生不良效果。尤其是在除测试用例之外的图像中。也就是说,这并不是说用户不应该使用它们,许多 IM 示例确实使用了它们,但通常是为了提供一些特殊效果。当使用特殊选项时,也会解释其使用原因,您应该坚持该效果给出的说明。当然,欢迎您使用它们,并且您可以通过使用它们来生成一些非常有趣且非常不寻常的效果。

“详细”滤镜控制

设置“filter:verbose”可能是您在理解其他滤镜控件方面的最佳帮手。例如,您可以验证 Lanczos 滤镜是否根据支持 3 的 Sinc 加窗 Sinc 定义。

  magick null: -filter Lanczos -define filter:verbose=1 \
          -resize 2    null:    | grep '^#'
[IM Text]
请注意,在内部,Lanczos 滤镜是根据快速多项式等效“SincFast”(4 瓣)函数定义的,而不是根据计算量大得多的三角函数库函数定义的完整“Sinc”函数。在这里,我们看到 Lanczos 滤镜在用作圆柱形(EWA 算法)“-distort”滤镜时被定义为 Jinc 加窗 Jinc 滤镜。

  magick null: -filter Lanczos -define filter:verbose=1 \
          -distort SRT 0   null:   | grep '^#'
[IM Text]
由于使用了各种专家设置,“filter:verbose”设置是用户检查最终结果滤镜的唯一方法。在滤镜设置的“#”注释标题之后,会返回一组由滤镜生成的数据点。这些数据点专门用于绘制滤镜数据,并让您进一步验证和检查滤镜产生的内容,而无需根据测试图像的结果进行猜测。例如,提取 Welch 加窗 Sinc 滤镜的数据...

  magick null: -filter Welch -define filter:verbose=1 \
          -resize 2 null:  > filter_welch.dat
或者上面使用的原始 Welch 加窗函数,其中窗口函数的范围缩放为 0 到 1。

  magick null: -define filter:filter=Box \
                -define filter:window=Welch \
                -define filter:support=1.0 \
                -define filter:verbose=1 \
           -resize 2 null:  > window_welch.dat
然后,您可以使用“gnuplot”命令(就像我在上面 加窗 Sinc 滤镜 中做的那样)绘制该数据...

  gnuplot
    set grid
    plot "window_welch.dat" with lines

专家滤镜控件的其他示例

可以使用以下方法创建“原始 8 瓣 Sinc”滤镜...

  -define filter:filter=Sinc
  -define filter:lobes=8
直接使用 Blackman 加窗函数作为滤镜(就像 IM 在 v6.3.6-3 之前错误地做的那样)。

  -define filter:filter=Blackman
  -define filter:support=4.0
未定义时,加窗函数将默认为“Box”。“Box”加窗函数将导致不加窗基本滤镜函数。例如,默认情况下,“高斯”滤镜具有“Box”加窗函数。“Box”加窗函数的唯一影响是剪裁函数的加窗区域。请参阅上面的 滤镜支持专家控制。使用以下方法强制使用原始 Jinc 函数(显式设置“Box”加窗):

  -define filter:filter=Jinc
  -define filter:window=Box
  -define filter:lobes=3
一个 12 瓣“Lanczos”加窗滤镜,剪裁到结果加窗滤镜的前 8 瓣...

  -filter Lanczos
  -define filter:win-support=12
  -define filter:support=8
通过忽略(在 8 处剪裁支持)结果加窗 Sinc 滤镜的窗口调制“尾部”(到 12),这使其速度提高了大约四倍。但是,由于支持剪裁,这可能会导致一些额外的但很小的伪影。使用高斯“模糊”图像!这等效于 -gaussian 5x2 操作,但通过使用无操作的失真!

  -filter Gaussian
  -define filter:sigma=2
  -define filter:support=5
  -distort SRT 0
注意:您不能为此使用 -resize,因为它可能会短路操作并导致操作根本不执行。从“Mitchell-Netravali”调查中创建不同的滤镜。

  -filter Cubic
  -define filter:b=0.5
  -define filter:c=0.5
创建您自己的 α 值为 0.4 的“Keys 三次”滤镜...

  -filter Cubic
  -define filter:c=0.4
Nicolas Robidoux 在探索“插值 EWA 滤镜”时创建了这个奇怪的滤镜。

  -define filter:blur=.7071067811865475
  -define filter:c=.49257366
  -define filter:b=2.089813051319261
  -filter Cubic
当用于放大图像时,像素会转换为类似于 混合 方案中的菱形图案,但使用菱形而不是正方形。任何专家选项的使用均需自行承担风险。它们并非用于生产用途,而是作为探索或生成棘手或其他无法实现的缩放函数的方法。使用需谨慎!

缩放滤镜总结

以下是本人在学习、重写和记录 ImageMagick 中所有可用滤镜后的一些个人观点。如果您认为我可能错了,或想表达您的意见,欢迎您在 IM 论坛上发表您的看法,并邀请我回复。 插值滤镜,例如 'Hermite',非常适合大幅放大图像,在最终结果中产生最少的模糊,尽管输出通常可以在后期处理中进一步人工锐化。 高斯模糊滤镜,例如 'Mitchell',最适合基本上由线条图和卡通图像组成的图像。您可以使用特殊的 滤镜模糊设置 控制滤镜对图像的 模糊锯齿 效果。 窗函数 Sinc/Jinc 滤镜Lagrange 等价物是用于真实世界图像的最佳滤镜,尤其是在缩小图像时。它们在基本结果上都非常相似。更大的支撑,或者更好的是,更大的瓣数设置,通常会产生更好的结果,尽管您也可能会得到更多 振铃 效果,但计算成本会更高。 三次滤镜 是一组快速简单的滤镜,具有固定的支撑(通常为 2.0),可以产生从 'Hermite' 平滑插值滤镜、定性评估的 'Mitchell' 用于图像放大、非常模糊的高斯 'Spline' 滤镜,或使用 'Catrom' 的锐利窗函数 sinc 类型滤镜。通常,如果调整大小的结果可以接受,则保持原样,因为您更有可能使情况变得更糟,而不是更好。

滤镜比较

放大...为了进行最终比较,这里我展示了 12 个代表性调整大小滤镜的选择。图像是一个像素宽的线条中锯齿状阶跃的放大,在深灰色背景上。原始图像本身“锯齿化”,因此您应该能够看到各种滤镜去除任何现有锯齿效果的效果如何。

  magick -size 10x6 xc:grey20 +antialias -draw 'fill white line 4,0 5,5' \
          -filter {filter_type} -resize 100x   {result}
[IM Output]
上面从 插值滤镜 开始,然后继续 高斯模糊滤镜,展示这些滤镜产生了多少模糊,并在这样做时去除了原始图像中的“锯齿”。这些滤镜不会产生振铃。第二行从三个 窗函数 Sinc 滤镜 开始,展示了它们可能产生的强烈振铃效果。请记住,这些滤镜实际上是为缩小图像而设计的,而不是放大。这接着进入使用其默认“插值”设置的 'Lagrange' 和 'Catrom' 插值三次滤镜。最后一张图像是 'Mitchell' 滤镜,展示了“专家”主观上认为用于放大图像的最佳“理想”滤镜,在最终结果中,四种 重采样伪影 均最小化。我本人也同意他们的发现,但仅限于放大。这就是为什么 'Mitchell' 是 IM 使用的默认“放大”滤镜的原因。缩小...为了了解 锯齿 效果,这里我缩小了我们之前制作的 大圆环图像 的裁剪区域(大小为 105x105 像素),以查看相同 12 个代表性滤镜中的每一个会产生什么样的莫尔纹效果。

  magick rings_crop.png -filter {filter_type} -resize 100x {result}
[IM Output]
如您所见,插值滤镜 滤镜具有非常严重的锯齿莫尔纹效果,这是由它们产生的块状伪影的副作用造成的。另一方面,高斯模糊滤镜 的模糊伪影消除了结果图像中的所有这些块状莫尔纹效果,尽管结果图像中存在整体模糊(线条不清晰)。'Gaussian' 滤镜本身确实显示出几乎不可察觉的锯齿效果,这是由其无限 (IIR) 滤镜被 滤镜支撑设置 裁剪造成的,但这非常小。另一方面,窗函数 Sinc 滤镜 生成具有圆形莫尔纹效果的非常清晰的图像,在所有三个代表性滤镜中,强度大致相同。这是由这些滤镜产生的振铃伪影引起的,产生了干涉图案。最后,三次滤镜也显示了一些非常轻微的莫尔纹效果,但这仅仅是由于负瓣振铃造成的。'Mitchell' 滤镜产生的振铃效果最小。请注意,'Mitchell' 确实会从几乎所有调整大小伪影中产生非常小的影响。也就是说:网格状莫尔纹 - 锯齿/块状,圆形莫尔纹 - 振铃,以及线条模糊。但是,所有伪影都处于非常低的水平,这就是它是一个很好的全能滤镜的原因。这里还有一个比较,但这次是将 较小的圆环图像 大幅缩小。

  magick rings_sm_orig.gif -filter {filter_type} -resize 100x {result}
[IM Output]
如您所见,插值滤镜 产生了大量的 锯齿伪影,而 高斯模糊滤镜 往往比其他滤镜模糊更多的线条。但所有其他滤镜都倾向于产生合理的结果。

最佳滤镜?

也就是说,这是您需要自己解决的问题。然而,通常这取决于您正在处理的图像类型和调整大小操作。对于放大图像,'Mitchell' 可能是您可以使用的最佳滤镜,而基本上任何 窗函数滤镜(默认值为 'Lanczos')都适合缩小图像,尤其是在涉及某种低级图案时。但是,如果您没有图案,但有很多直边(例如 GIF 透明度),您可能最好使用锐化的 高斯滤镜 或 'Mitchell',以避免强烈的振铃效果。'Lagrange' 滤镜也相当不错,尤其是在缩小图像时使用更大的 滤镜支撑设置。对于有兴趣的人,我建议您查看 IM 用户讨论主题 一种比较调整大小后图像质量的方法?,它基本上表明无法定量确定“最佳滤镜”,只能定性或主观地确定“最佳滤镜”。选择权在您手中,而选择是 ImageMagick 的一个关键特性。

IM 的默认滤镜...

正是出于这些原因,'Mitchell' 成为放大图像的默认滤镜,以及缩小涉及透明度或包含调色板(或颜色映射)的图像的默认滤镜。但是,在所有其他情况下,即缩小普通图像(通常是照片)时,将使用 'Lanczos'。对于 扭曲,滤镜设置默认为 'Robidoux' 滤镜,该滤镜专门设计用于在没有实际扭曲发生时最大程度地减少图像模糊。当然,您可以覆盖这些选择。

Nicolas Robidoux

Nicolas Robidoux 是一位图像处理专家,他对如何从图像调整大小中获得最佳结果有更多建议。因此,他拥有自己的章节...
Nicolas Robidoux 的重采样.