ImageMagick 示例 --
模糊和锐化图像
图像模糊及其反面锐化是图像处理中非常重要的一个方面。在本节中,我们将探讨两者。
较小的radius将模糊的任何效果限制在距被模糊像素一定像素范围内的像素(正方形半径)。因此,使用非常小的radius(例如 '
正如您所见,模糊像这样的普通图像没有任何问题。它按预期工作。但是,如果我们再次尝试使用包含透明背景的图像...
等等,发生了什么!图像没有改变!实际上,算子确实起作用了。但是 “
总结一下...
正如您从上面看到的,“
请注意,与使用黑色圆圈时没有改变的图像不同,我们反而产生了一个可怕的黄色圆圈,黑色在边缘蔓延。令人作呕!这个问题是由一个事实造成的,很少有新的 IM 用户意识到这一点。
请注意,颜色 “#F000” 是完全透明的红色。这意味着图像的背景区域实际上是不可见的红色,而不是更典型的完全透明的黑色。这对于后续测试很重要。我们可以通过使用 “
现在,让我们再次尝试只模糊图像的颜色,使用默认的 '
正如您所见,图像的完全透明的红色背景现在已渗入可见的黄色圆圈,使其具有有趣的橙色边缘,就像之前一样。您可能喜欢这种效果,但有更好的方法来生成它,而不是依赖不可见的完全透明的颜色。为了证明您可以正确地模糊此图像,让我们正确地进行操作...
使用 alpha 通道进行模糊不会产生橙色,因为它之前那样,原因是在 “
最后一个例子展示了一个纯粹的灰度操作符在没有任何 alpha 通道与图像中颜色(透明或不透明)交互的情况下会产生的结果。也就是说,红色、绿色、蓝色和 alpha 通道彼此完全独立地模糊,就好像它们是独立的灰度图像一样。记住,默认情况下,"
请注意,sigma 设置(仅在放大步骤中使用)实际上只是所需 sigma 值的一半,因为你还在将图像大小加倍。你可以通过调整缩小比例和给定的 sigma 值来使最终的模糊结果更大。缩小步骤是产生加速的步骤,但你应该在放大步骤中至少进行一些模糊作为质量控制。这只是一个技术的示例。它实际上是为了对非常非常大的图像使用非常非常大的 sigma 值。例如,对现代数码照片使用 sigma 值为 10 或更大的模糊。这种技术也用于在 稀疏颜色牧羊人,替代方法 中生成单个图像的多级模糊。
正在建设中
锐化是计算机图形学算法,在电视节目和电影中最为常见。想象一下,警察力量 '清理' 银行抢劫犯汽车车牌的 '放大' 照片,或者模糊的商店摄像头视频中的人脸,你就会明白我的意思。基本上,他们是在试图恢复图像中因相机镜头或低分辨率图像造成的自然模糊而丢失的精细细节。锐化参数?(展开)
"
正如你所看到的,结果并不完美,因为将像素散布开来会使图像的锐利角落变得不那么清晰。特别是注意图像最顶部的两条线的拐角处产生的额外增厚,以及细线的几乎消失。即使重复操作或增加锐化区域的大小也不会帮助图像恢复到完全原始状态,因为你基本上已经失去了图像模糊带来的更精细的细节。然而,宏观细节可以很好地恢复。正是能够在模糊或高度放大的图像中恢复更精细细节的锐化算法,在警察力量、天文学家和政府间谍机构使用的软件包中赚大钱。
正在建设中
"
注意阴影图像是如何正确地从图像中偏移的。你甚至可以将模糊 'sigma' 值设为零,创建一个硬阴影,但它是半透明的阴影。
使用 "
虽然最简单的方法是使用 图层合并,但这往往会改变最终图像的整体偏移量。然而,偏移量不是由分层方法造成的,而是由于 "
你可能可以看到这里有一点剪切,因为原始图像没有足够的额外空间来容纳请求的阴影。
正如你所看到的,由于负偏移量,阴影被 "
另一种方法是在生成阴影后,将两张图片都平移适当的距离。这样,在你使用 "
所需的间距至少应为 2×'sigma'-'offset',在本例中为 2×3--5 ⇒ 11 像素,否则可能会裁剪阴影。但是,大约 'sigma'-'offset' 的间距通常可以产生可接受的裁剪程度。另一种选择是扩展原始图片,以便为最终的阴影留出足够的空间。这是处理阴影的最佳方法,同时保留图片在虚拟画布上的原始位置。例如,这里我用一些额外的空间来填充原始图片,以便容纳阴影,然后直接将阴影图片放在下面。我在显示的图片结果中添加了一个边框,这样你就可以看到最终的图片仍然居中在 "填充" 图片中。
所需的填充量应至少为 'sigma'+abs('offset'),或者最好为 2×'sigma'+abs('offset'),以确保阴影不被裁剪。填充可以是非对称的,以减少空间,但通常为了方便起见,使用对称填充(如上面所示)。
首先要记住的是,合成运算符 是非常低级的,不会读取任何图层或虚拟画布偏移量,无论是原始图片,还是 阴影运算符 可能存在的偏移量。事实上,我们仍然需要移除或调整可能出现的负向(错误)偏移量,这些偏移量是使用 重分页设置 添加的阴影。这意味着,你在上面示例中看到的偏移量仅仅是由于阴影扩大了输入图片,以给阴影留出一些空间而产生的。阴影的位置完全是由阴影图片扩展 2 倍 sigma 决定的。此外,如果你使用 "硬阴影"(sigma 为零),你最终也不会得到任何阴影偏移量,因此阴影会被原始图片隐藏,除了可能出现的暗色光晕边缘效果。你实际上放弃了 阴影运算符 提供的内置偏移量计算。当然,你可以计算并设置适当的 合成几何/重心 设置,最简单的方法是使用 "
请注意,居中的几何偏移量为负值,因为图片顺序已交换。
在这里,你可以看到使用模糊形状进行轮廓描边的一个问题。由于模糊的运作方式,形状的边缘始终至少有 50% 的透明度。为了弥补这一点,你可以扩大要进行阴影处理的形状或图片的大小(有关示例,请参阅 更密集的软轮廓字体)。更好的方法是调整阴影图片的透明度,使用 级别调整,以便形状边缘的 50% 透明度变为完全不透明。
另一种处理阴影定位和偏移量的方法是,基本上放弃所有 "
但是,请注意,偏移量与你通常用于定位阴影的偏移量相反。这是因为你实际上是在偏移文本形状而不是阴影,所以它是反方向的。然而,如果偏移量大于模糊 'sigma' 的两倍,这种方法将裁剪原始源图片,而不是阴影图片。因此,它不能用于 "硬阴影"(使用 '
但是,没有提供用于设置该阴影的颜色、模糊度和偏移量的控件,因为 "
等效的 IM 操作将是...
请注意,上面的值 8 是模糊 sigma 的两倍,以便为模糊的阴影提供足够的空间。但是,这意味着最终的图片将比原来大 4 倍 sigma 像素。为了弥补这一点,还添加了相同数量的负向偏移量。现在,由于将添加 2 倍 sigma 的负向偏移量到生成的图片,应注意避免阴影被裁剪,或相对于原始图片的定位不正确。这可以通过以下两种方法来实现:要么为原始图片提供一个初始的正向偏移量(例如 8-5 或 +3+3 像素),要么使用 图层合并,它可以理解负向偏移量,而不会裁剪最终的图片。基本上,使用以前的技术来正确处理可能出现的与阴影图片相关的负向偏移量。
正如我所说,"
你可以通过在图片中添加一些空间将物体移到中心以外的位置,以获得更有趣的 "
模糊参数是径向模糊覆盖的角度。也就是说,从原始图片开始,每个方向上的一半角度。因此,180 度的角度覆盖半圆,而 360 度的角度将在整个圆圈中模糊图片。
你甚至可以添加一些 图片扭曲,以使效果更有趣...
请注意,不仅物体有拖影,而且运动方向上的边缘也有背景模糊到里面。这种前沿模糊可以通过重新绘制或叠加原始图片并多次重新应用较小的 "
可以进行多次运动模糊,以影响移动物体拖尾的散布。有点像消散的烟雾或火焰。
这种技术可以用来在地面上生成散开的阴影。或者,你可以生成一个运动模糊,然后稍微径向模糊一下,但这需要一些图片移动才能使中心位置正确。你还可以添加一些额外的 图片扭曲,以使效果更有趣...
请注意,虽然 "
正在建设中
警告:本节已过时,用户想要正确地羽化图片应该查看 使用距离对形状进行羽化处理。这里显示的内容被称为 "模糊羽化",正如后面的部分所示,这是一种 "错误的羽化技术"。即使这样,它仍然是一种有用的方法,但仅适用于 "凸起" 的图片形状。当你从图片中剪出一个形状时,你通常希望稍微羽化或模糊形状的边缘,以使它看起来更平滑,并淡化可能意外包含在形状外部的任何部分,或者让图片融入背景,而不让它显而易见它是一个复制粘贴的。基本上,与某些形状的 "硬" 边缘相比,要软化它以 "模拟" 抗锯齿或镜头模糊,以便粘贴更加无缝。
但是,由于我在 GIF 图像上叠加了一个布尔透明度,结果导致了高度的锯齿,或者说阶梯状的边缘,图像在背景上看起来非常不协调。如果你处理的是现实生活中的图像,上述结果看起来会非常不自然。
顺便说一下,这与在缩略图上生成 柔和边缘 的技术完全相同。要查看更多示例,请查看 Fred Weinhaus 的 "feather" 蒙版脚本的结果。正如你所看到的,这种方法在简单情况下非常有效,即叠加图像和背景之间存在高对比度时。但是,当你想要使用更大的羽化模糊因子,或者两张图像都是非常浅的颜色时,就会出现严重的问题。
请注意,由于模糊会延伸到形状区域内和形状区域外,因此必须调整 alpha 通道,使形状边缘为零(完全透明),但随着远离边缘,会迅速变得完全不透明。一个这样的 alpha 通道调整示例由 具有透明度处理的 CLUT 提供。此调整至关重要,否则你不会弱化形状外部区域,而是会在形状外部区域添加一个半透明阴影或光晕。基本上是之前被图像透明度隐藏的某种半透明“未定义颜色”。但是,模糊有一个特别棘手的问题,即它也会使形状的轮廓变得平滑。例如......
如果你模糊这个特定的形状,你会得到......
请注意,蒙版的顶点比边缘更弱化。此外,内部角度似乎被“填充”,这会导致透明度下的完全透明像素变成半透明。也就是说,具有未定义颜色的像素实际上可能会变得可见!如果你对图像进行阈值处理,你就可以更清楚地看到这一点。
这就是使用“模糊”作为图像羽化方法的问题。在处理手指、耳朵以及双腿之间的区域等内容时,这尤其令人担忧。也就是说,对附肢本身形状以及它们之间空间的影响。如果图像具有卡通风格的边界轮廓,那么对于“1 像素”羽化来说,这并不是一个大问题。但对于现实生活中的图像(没有明确的边界),这是一个真正的难题。一个合适的解决方案是找到一种方法来衡量一个点与形状边缘的距离,但确保两个靠近的边缘不会将它们的效果叠加在一起。现在,IM 中已经添加了这种距离测量操作,称为 距离形态学。有关使用它进行羽化的详细信息,请参见 使用距离进行羽化形状。
模糊图像
模糊图像使其变得模糊可能看起来不像一个有用的操作,但实际上对于生成背景效果和阴影非常有用。它对于平滑“锯齿”效果也很有用,以抗锯齿图像的边缘,以及圆化特征以产生突出显示效果。模糊非常重要,它是图像调整大小的组成部分,尽管它使用了不同的模糊方法,该方法仅限于原始图像单个像素的边界内。ImageMagick 中有两个通用的图像模糊算子。 “-gaussian-blur
”扩展和 “-blur
”。两者结果非常接近,但由于 “-blur
” 是一种更快的算法,所以通常比前者更受欢迎,即使前者在数学上更准确。(参见 模糊与高斯模糊算子。) 模糊/高斯参数
“-blur
” 和 “-gaussian-blur
” 的参数相同,但对于图像处理新手来说,参数值可能令人困惑。-blur {radius}x{sigma}上述中重要的设置是第二个sigma值。可以将其视为对图像要“扩展”或模糊多少的近似值,以像素为单位。将其视为用来模糊图像的刷子的尺寸。数字是浮点值,因此可以使用非常小的值,例如 '
0.5
'。第一个值radius也很重要,因为它控制了算子在扩展像素时应该查看的区域大小。此值通常应该为 '0
' 或至少是sigma的两倍。为了向您展示选项的效果,让我们使用这个简单的图像,它周围有很多空间(模糊算子需要很多空间来工作),并创建一个包含各种算子设置结果的表格。我特意使用了一种包含粗线和细线的字体,看看小线细节和大的颜色区域的模糊情况。
|
![]() |
1
')有效地将模糊限制在每个像素的直接邻居范围内。请注意,虽然sigma是浮点型,但radius不是。如果给出了浮点值(或内部计算),则会将其向上舍入到最接近的整数,以确定模糊的“邻域”。每个邻居对最终结果的贡献程度仍然由sigma控制。非常小的sigma(小于 '1
')会将它们的贡献限制在少量,而较大的sigma会从所有邻居那里贡献更相等的量。最大的sigma '65355
' 将产生对正方形邻域中所有像素的简单平均值。还要注意,对于较小的radius但较大的sigma,您会看到模糊结果中出现伪影。这在“-blur 5x8
” 的输出中尤其明显。这是因为小的正方形邻域“切断”了模糊区域,在模糊的平滑高斯曲线中产生了突然的停止,从而产生了环绕伪影,沿尖锐的边缘。所以...
永远不要使用小于sigma的radius进行模糊
理想的解决方案是简单地将radius设置为 '0x
',如上表最后一行所示。在这种情况下,算子将尝试自动确定给定sigma的最佳radius。IM 使用的最小半径为 3,通常为 Q16 版本 IM 的 3 * sigma(对于 IM Q8 使用更小的半径,因为它精度较低)。我使用非零radius的唯一时间是对于非常小的sigma或专业模糊。所以..
如果可能,对模糊操作使用radius为零
sigma 的小值通常仅用于模糊未进行抗锯齿处理的图像的线条和平滑边缘(有关更多信息,请参见抗锯齿)。在这种情况下,我发现 '1x0.3
' 的模糊是一个有用的值,可以消除图像中的大部分“锯齿”。但是,大值对于生成模糊图像、背景或阴影效果(参见复合字体)甚至图像突出显示效果(如高级示例页面所示)非常有用。由于 IM 处理“x
” 风格参数的方式,上面的sigma是可选的。但是,它是更重要的值,因此radius应该是可选的,因为radius可以自动确定。因此,对这些类型卷积算子的单个值参数毫无用处。这不太可能改变,因为它已经存在很长时间了,而且会破坏太多东西。 模糊使用通道设置
为了演示模糊,让我们从在浅蓝色背景上生成一个模糊的黑色圆形开始...
|
![]() ![]() |
|
![]() ![]() |
-blur
” 作为灰度通道算子,受 “-channel
” 设置的限制,仅限于三个颜色通道。这意味着仅模糊了图像的三个颜色通道,而图像的透明度或 alpha 通道保持不变。但是,在上面,该图像是在“none
” 颜色的背景画布上的一个完全不透明的圆圈,IM 将其定义为完全透明的黑色!这意味着我们有一个黑色圆圈,位于透明的黑色背景上。换句话说,图像中的所有颜色都是黑色,有些部分不透明,其他部分透明。因此,当我们模糊图像时,我们只模糊了黑色和黑色,正如您可能猜到的那样,产生了黑色!因此,结果在颜色上没有变化。此外,我们从未触碰图像的 alpha 或透明度通道,因此我们最终得到的只是图像的透明度没有改变。也就是说,一个黑色圆圈!我们真正想做的是模糊所有四个图像通道,尤其是 alpha 通道。为此,我们将 “-channel
” 设置设置为图像的所有四个通道(例如:使用 'RGBA
' 值)。
|
![]() |
在模糊具有透明度的图像时,始终使用 “
-channel RGBA
” 设置。
![]() ![]() |
IM 版本 5.5.7 会自动模糊所有四个颜色通道,但对于具有透明度的图像,算子会产生其他错误影响。有关更多详细信息,请参见模糊与透明度错误。 |
![]() ![]() |
某些图像格式(如 GIF 和 JPEG)不处理半透明像素。因此,我建议您尽可能使用 PNG 格式来存储任何具有某种形式的半透明颜色的图像。 |
-channel
” 设置对于灰度算子(如 “-blur
”)非常重要。但它并不是使用此类算子时唯一重要的内容。例如,让我们再次尝试上一个“忘记了“-channel
” 设置” 的示例,但这次使用黄色圆圈。
|
![]() ![]() |
透明像素有颜色,即使你看不见它。
在上面的情况下,该透明颜色是黑色,它渗入了黄色圆圈。当然,我们可以通过正确设置 “-channel
” 设置来修复透明图像,事情确实按预期进行。
|
![]() |
模糊内部机制
让我们使用更复杂的示例进一步推进这一步,这将让我们确切地探索 “-blur
” 在内部做了什么。在这里,我们创建了一个非常特殊的图像,一个黄色圆圈,它是在完全透明的红色背景上绘制的。这将让我们看到透明颜色在模糊图像时的效果。
|
![]() |
-alpha off
” 算子有效地删除图像的 alpha 通道来查看图像透明部分的颜色。
|
![]() |
RGB
',“-channel
” 设置。
|
![]() |
|
![]() |
-blur
” 算子看到 alpha 通道参与其中时(根据当前的 “-channel
” 设置),它将仅使用可见像素进行模糊,根据该 alpha 通道。如果 alpha 通道不参与,它将完全忽略它,完全透明的红色将与黄色混合,产生各种橙色阴影。基本上,模糊算法已修改为忽略图像中的所有完全透明像素,无论它们是什么颜色。任何半透明像素仍然参与其中,但它们对结果的影响也由它们的可见程度来调节。结果是圆圈变成了一个模糊的半透明黄色斑点。这正是用户可能想要实现的目标。如果您真的喜欢,您可以分别模糊颜色和 alpha 通道,从而有效地断开算法对颜色通道的“可见性调整”。结果更像是阳光透过脏的棕色雾霭。
|
![]() |
-channel
" 设置为 'RGB
',默认行为是不模糊 alpha 通道,并且模糊图像中可见颜色下的不可见颜色。难道你不高兴"-blur
" 不再是纯粹的灰度操作符了吗?尽管你也可以这样使用它,如果你真的想要的话。不过,你并不总是拥有这种选择...![]() ![]() |
在 IM 版本 6.2.4-4 之前,"-blur " 和 "-gaussian-blur " 操作符作为纯粹的灰度操作符应用,因此不会根据它们的 alpha 通道 '可见性' 调整颜色权重。结果是,任何带有透明度的模糊形式几乎总是会产生可怕的 '黑色光晕' 效应,就像前面例子中刻意产生的那样。这被归类为 IM 分发版中一个重大的长期错误,并且很难绕过。有关此问题的更多详细信息,请参见 带有透明度的模糊错误 页面。 |
FUTURE: Blur and Trimming Images.
模糊与高斯模糊算子
关于哪个操作符 "-blur
" 或 "-gaussian-blur
" 更适合模糊图像,一直存在一些困惑。首先,"-blur
" 速度更快,但它使用的是两步技术。首先在一个轴上,然后在另一个轴上。另一方面,"-gaussian-blur
" 操作符在数学上更准确,因为它同时在所有方向上进行模糊。两种方法之间的速度差异可能很大,可以达到 10 倍甚至更多,具体取决于所涉及的模糊量。在更技术性的语境中,"-blur
" 是一个 2 通道、1 维正交卷积滤波器,而 "-gaussian-blur
" 是一个 2 维圆柱卷积滤波器。有关更多详细信息,请参见 卷积。两种方法的结果应该是相同的,与其他 '过滤' 卷积操作的使用不同。然而,两通道系统意味着存在一个中间阶段,在这个阶段可能会发生舍入或量子效应。Cristy 在他报告时也证实了这一点... 你应该始终使用 "-blur
" 而不是 "-gaussian-blur
",因为它速度更快。由于舍入,内部的一些像素将不同,由于 虚拟像素 边缘效应的损失,边缘像素也可能不同,同样是在中间阶段。总而言之,这两个操作符略有不同,但差异很小。由于 "-blur
" 速度快得多,所以使用它。我在几乎所有涉及模糊的例子中都使用它。 使用调整大小进行大模糊
对图像使用大的 sigma 值进行模糊速度很慢。但是,可以使用一种技术来加速此过程。然而,这只是一个粗略的方法,需要一些数学上的严谨性才能改进结果。本质上,大模糊之所以慢,是因为你需要一个大的窗口或 '内核' 来将许多像素合并在一起,对于图像中的每个像素都是这样。然而,调整大小(使图像变小)会做同样的事情,但在这个过程中会生成更少的像素。该技术基本上是缩小图像,然后再次放大它,以生成强烈的模糊结果。 高斯滤波器 特别适用于此,因为你可以直接指定 高斯 sigma 定义。例如,这里我使用两种方法对小玫瑰图像使用 sigma 值为 5 进行模糊。
magick rose: -blur 0x5 rose_blur_5.png magick rose: -filter Gaussian -resize 50% \ -define filter:sigma=2.5 -resize 200% rose_resize_5.png |
![[IM Output]](../images/rose.png)

![[IM Output]](rose_blur_5.png)
![[IM Output]](rose_resize_5.png)
锐化图像


The most important factor is the sigma. As it is the real control of the sharpening operation. It is only due to historical accident it is the second term in the above. It can be any floating point value from .1 for practically no sharpening to 3 or more for sever sharpening. 0.5 to 1.0 is rather good. Radius is just a limit of the effect as is the threshold. Radius is only in integer units as that is the way the algorithm works, the larger it is the slower it is. But it should be at a minimum 1 or better still 2 times the sigma.首先忘记第一个数字,只使用 0,它将使用你提供的 'sigma' 因子的最佳数字。sigma 越大,锐化程度越高。
-sharpen 0x.4 | 非常小 |
-sharpen 0x1.0 | 大约一个像素大小的锐化 |
-sharpen 0x3.0 | 可能太大 |
-sharpen
" 操作符有点像反向模糊。事实上,它的工作原理几乎相同。有关如何将其与模糊相关的示例,请参见 通过插值和外推进行图像处理。例如,让我们模糊一个简单的图像,然后尝试再次锐化它以消除模糊。
magick -font Gecko -pointsize 72 label:A A_original.jpg magick A_original.jpg -blur 0x3 A_blur.jpg magick A_blur.jpg -sharpen 0x3 A_blur_sharp.jpg magick A_blur_sharp.jpg -sharpen 0x3 A_blur_sharp_x2.jpg |
![[IM Output]](A_original.jpg)

![[IM Output]](A_blur.jpg)

![[IM Output]](A_blur_sharp.jpg)

![[IM Output]](A_blur_sharp_x2.jpg)
非锐化图像


-sharpen
" 和 "-unsharp
" 操作符都使用相同的技术,即从原始图像中减去模糊。有关 "-sharpen
" 和 "-unsharp
" 实际工作原理的内部细节,请参见 非锐化卷积。
From comments on Sharpening with ImageMagick from Alex Beels Matching GIMP unsharp Take gimp radius and add 1 => IM sigma Threshold divide by 255 => IM Threshold So GIMP radius=2 amount=1.5 threshold=5 results in -unsharp 0×3+1.5+0.0196 Another suggested that im_sigma = sqrt(gimp_radius) Raw notes from Fred Weinhaus Blur Image for test. A_original.jpg magick A_original.jpg -blur 0x3 A_original_blur3.jpg sharpen is just a gaussian type blurred image subtracted from the image to make an edge image (high pass filter), then equally blends that back with the original, so one has a high pass enhanced image. magick A_original_blur3.jpg -sharpen 0x3 A_original_blur3_sharp3.jpg unsharp is more complex. It is similar. It takes the difference (edge result) as above, i.e. like sharpen BUT only blends some fraction or multiple of that with the original image, AND only if the difference is above a threshold. Thus unsharp 0x3+1+0 is basically the same as sharpen 0x3 magick A_original_blur3.jpg -unsharp 0x3+1+0 A_original_blur3_unsharp3_1_0.jpg compare -metric rmse A_original_blur3_sharp3.jpg A_original_blur3_unsharp3_1_0.jpg null: 164.661 (0.00251256) The difference may be due to whether one uses a separable (gaussian) blur filter or not in one or the other but not both. Or it could be just some slight differences elsewhere in the IM implementation. If one blends less with the original, one gets less sharpening. magick A_original_blur3.jpg -unsharp 0x3+0.5+0 A_original_blur3_unsharp3_0p5_0.jpg If one blends more with the original, one gets more sharpening. magick A_original_blur3.jpg -unsharp 0x3+2+0 A_original_blur3_unsharp3_2_0.jpg If one increases the threshold, then one gets less sharpening again. magick A_original_blur3.jpg -unsharp 0x3+2+0.2 A_original_blur3_unsharp3_2_0p2.jpg Several of my (Fred's) scripts, binomialedge, gaussianedge, sharpedge use this blending concept (between the high pass filtered result and the original image) and a description is there with the scripts. The thresholding in my scripts is done differently and for a different purpose. Sharpen using de-convolution There is a technique of using de-convolution (division in a Fast-Fourier generated frequency form of images), This works best when the exact 'blur' that was applied to the original image is known, or calculated in some way. At the moment only raw 'DIY' methods are as yet available in IM and a number of such methods are demonstrated (trialed) in the sub-section Fourier Multiply/Divide.
生成阴影
"-shadow
" 操作符是一个高级操作符,它是在 IM 示例页面中开发的。基本上,它代表了对给定图像的透明形状进行非常复杂的模糊和重新着色。这是 IM 用户一直在执行的操作,但需要相当多的知识才能弄清楚如何正确地实现。该操作符将获取一个图像(通常是克隆,可能已经有一些透明度),并将它变成一个阴影图像,然后可以将其放置在给定偏移量的原始图像下方(通常是使用特殊的 图层合并 操作符。例如,以下是一种使用海军蓝阴影颜色对现有图像进行阴影处理的标准方法,以匹配此网页。
|
![]() |
|
![]() |
-layers merge
" 将阴影图像与原始图像分层,可以轻松地从任何方向生成光源的阴影,而不仅仅是从左上角。
|
![]() |
+repage
" 去除了最终 '图层' 图像中可能存在的任何负或正偏移量。有关替代技术的详细信息,请参见 阴影和偏移量问题。![]() ![]() |
图层合并 方法是在 IM v6.3.6-2 中添加的。在此之前,你需要使用类似的图层扁平化操作符 "-mosaic "。然而,这个操作符存在问题(见下文)。 |
形状阴影
现在 "-shadow
" 是针对形状图像设计的(这就是它复杂的原因)。例如,这里是一个典型的阴影字体。DstOver
' 合成方法,以避免需要交换两个图像的顺序。
|
![]() |
阴影和偏移量问题
阴影的问题在于,模糊的阴影会向各个方向延伸。为了弥补这一点,"-shadow
" 操作符通过在原始图像周围添加一个边框来扩大实际的原始图像,这个边框的大小是给定模糊 'sigma' 值的两倍。也就是说,如果你使用 'x3
' 模糊阴影,它将使图像扩大 12 个像素(每边扩大 2 倍,即 3 个像素)。为了弥补这种扩大,阴影图像也会获得一个适当的负 虚拟画布偏移量,以便它能够相对于被阴影处理的图像正确地定位。对于普通图像,这意味着生成的阴影图像将具有负偏移量。然而,当你的 IM 没有 'merge
' 可用的 "-layers
" 方法时,就会产生问题。例如,这里我们尝试在图像的左侧添加一个阴影,就好像光线从右上角照射过来一样。
|
![]() |
-mosaic
" 操作符剪切了。不好!一个解决方案是在原始图像中添加一个初始偏移量,这样最终的阴影图像偏移量就不会是负数。
|
![]() |
-mosaic
" 将它们拼合在一起之前,就可以去除任何负向的平移。注意使用 "-repage
" 的 "!
" 标志,将给定的偏移量加到两张图片上。
|
![]() |
|
![]() |
![]() ![]() |
请注意,虽然上面的 "-compose Over " 设置实际上不需要,但建议使用。否则,以后的操作(即使在其他 "magick " 命令中)也可能受到影响,产生意想不到的结果。也就是说,非标准的合成设置可能会影响其他操作,包括:图片叠加、添加边框或框架,或者只是其他合成。 |
阴影和合成
论坛上的许多人会生成一个阴影图片,然后尝试使用低级 "-composite
" 来合并图片。例如,将原始图片直接叠加到生成的(较大的)阴影图片上。
|
![]() |
-gravity Center
" 设置,因为扩展后的阴影图片在所有方向上都扩展了相同的距离。
|
![]() |
阴影轮廓
你还可以使用 "-shadow
" 来生成形状的模糊轮廓,例如文本。通过使用 图层合并,IM 将自动添加半透明模糊所需的额外空间。
|
![]() |
|
![]() |
-shadow
" 生成的偏移量(使用 "+repage
"),并将原始图片居中叠加在较大的阴影图片上。通过添加 "-geometry
" 合成偏移量,你可以将阴影作为一个单独的动作进行偏移。
|
![]() |
x0
' 模糊 'sigma'),除非你在阴影图片中添加一些填充空间,以便原始图片可以叠加在上面。但是,对于软模糊阴影来说,这很少会成为问题。有关阴影的一些实际示例,请参阅 缩略图阴影 和 更好的 3-D 徽标生成。 蒙太奇命令中的阴影
从 IM v6.3.1 开始,"magick montage
" 的 "-shadow
" 设置开始使用该运算符提供的软 "形状" 阴影。
|
![]() |
magick montage
" 从未提供过此类控件,超出了简单的启用/禁用选项。 阴影内部机制
在内部,"-shadow
" 非常复杂。基本上,它不仅需要扩大图片以容纳 "软模糊阴影",还需要模糊图片的现有形状,适当设置其颜色,最后调整虚拟页面/画布的偏移量;所有这些都需要根据用户的规格进行。例如,给出以下 "-shadow
" 命令...
magick image_clone.png -shadow 60x4+5+5 image_shadow.png |
magick image_clone.png -alpha set \ -bordercolor none -border 8 -repage -8-8\! \ -channel A -virtual-pixel transparent \ -blur 8x4 -evaluate multiply .60 +channel -fill {background_color} -colorize 100% \ -repage +5+5\! image_shadow.png |
![]() ![]() |
据我所知,PNG 和 MIFF 格式是唯一可以处理负向偏移量和半透明像素的图片格式。我建议在保存阴影图片以供将来使用时使用 PNG 格式。 |
-shadow
" 是一项非常复杂的操作。当然,虽然上面的示例非常接近 "-shadow
" 在内部所做的操作,但它并不完全相同。实际的 "-shadow
" 运算符不会更改任何全局设置,例如边框/背景/填充颜色,或当前的虚拟像素设置。此外,如果模糊 sigma 设置为 0,它将短路 "-blur
" 运算符的使用,以防止模糊函数对零 sigma 或半径发出警告。FUTURE: overlaying multiple shadows Overlaying two images with shadows, produces an unrealistic darkening of the shadow where the shadow overlaps. This darkening would be correct if each object was lit by separate light sources, but more commonly the objects are lit by the same light source. The solution is to overlay the one image over the other, applying the shadow effects to the opaque parts of each layer image in turn. That is, the background shadow should be generated separately into each layer. Remember the shadow cast by the top most layer should become fuzzier than the shadow contribution of the bottom most layer. This complexity gets worse when you have three objects shadowing each other. Also the offset and blurring from the shadow of each object should technically be separate. To generate that level of complexity, probably a 3-d ray-tracing program should be used instead (sigh).
专业模糊
在 IM 版本 6 中添加了一些其他类型的模糊,它们有非常特殊的用途。这些模糊以特定的方式工作,而不是像大多数其他 "卷积" 类型的操作那样,在所有方向上都工作。它们可能不像其他生成专业模糊的方法那样有效,例如在更正常的模糊之前和之后扭曲图片。例如,请参阅 极坐标循环技巧 和 椭圆形(映射)模糊。
警告:所有这些模糊都是实验性的,语法可能会更改!
径向模糊
你可以使用 "-radial-blur
" 将图片在圆圈中模糊,就像它在旋转一样。虽然从技术上讲,这是一种旋转或角度模糊,而不是径向模糊。注意:你可以使用 去极坐标-极坐标 - 旋转模糊 技术获得更高质量的结果(尽管速度要慢得多)。但是,请注意,与普通的 "-blur
" 运算符一样,"-radial-blur
" 受 "-channel
" 设置的影响。
|
![]() |
-radial-blur
" 效果。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
全圆径向模糊可用于生成粗略的圆形渐变。但是,要制定出能够生成正确渐变的正确形状是非常困难的,而且可能不值得付出努力。我尝试过,不过...
|
![]() ![]() |
运动模糊
你可以通过使用 "-motion-blur
" 在一个方向上添加线性渐变的模糊(给定半径和 sigma,以及模糊应该发生的角)。这会使你的图片看起来好像它(或相机)正在以非常快的速度移动。
|
![]() |
-motion-blur
" 来改善。
|
![]() |
|
![]() |
|
![]() |
请注意,虽然 "
-radial-blur
" 在两个方向上都模糊,但 "-motion-blur
" 仅在一个方向上模糊。在这两种情况下,我建议你在边缘周围用额外的空间填充你的图片(通常使用 "-border
"),因为这两种专业模糊都有很强的边缘效果,最好避免。如果你发现上面内容更实用或更有趣的示例或用法,请将副本发送给我(地址在页脚)。使用模糊对形状进行羽化处理


例如,这里我有一张 GIF 图片,我在上面叠加了一个浅色的背景。
|
![]() |
但是,通过稍微模糊图像的透明度,我可以使叠加更平滑地融入背景。
|
![]() |
请注意,由于模糊会延伸到形状区域内和形状区域外,因此必须调整 alpha 通道,使形状边缘为零(完全透明),但随着远离边缘,会迅速变得完全不透明。一个这样的 alpha 通道调整示例由 具有透明度处理的 CLUT 提供。此调整至关重要,否则你不会弱化形状外部区域,而是会在形状外部区域添加一个半透明阴影或光晕。基本上是之前被图像透明度隐藏的某种半透明“未定义颜色”。但是,模糊有一个特别棘手的问题,即它也会使形状的轮廓变得平滑。例如......
|
![]() |
|
![]() |
|
![]() |
相关操作符
Basic image modifications -despeckle -enhance -noise -spread -displace -median Set each channel color of the pixel to the median value of all all pixels within a given radius. (median = center most value of all values found, half on one side, half on the other). This is a way of "de-speckling" an image (such a dust in a scan). But could distort edges, cause some color channel aburation, and remove thin lines. This filter is the best technique to use for removing Salt & Pepper noise, especially on gray scale images. It is suggested that a trim for a scan use a median filtered image for attempting to find the appropriate bounding box. -adaptive-sharpen radius x sigma Adjust sharpening so that it is restricted to close to image edges as defined by edge detection. See forum discussion https://magick.imagemagick.org/viewtopic.php?f=1&t=10266 -adaptive-blur radius x sigma Blur images, except close to the edges as defined by an edge detection on the image. Eg make the colors smoother, but don't destroy any sharp edges the image may have. -adaptive-resize Resize but attempt not to blur across sharp color changes