ImageMagick 示例 --
图像变换
- 索引
-
ImageMagick 示例前言和索引
-
艺术化变换
-
计算机视觉变换
-
阴影 3D 高亮
-
使用 FX,DIY 图像操作符
-
Evaluate 和 Function,快速 FX 操作符
-
渐变上的数学运算
艺术化变换
凸起或凹陷边框
"-raise
" 操作符是一个非常简单的图像变换,几乎算不上变换。它所做的只是为现有图像添加一个矩形斜角高亮。
|
![]() |
|
![]() |
-raise
" 操作符重新着色图像的边缘像素。这使得它成为一个图像变换。![]() ![]() |
实际上,图像框架 是通过添加边框,然后凸起边框来实现的! |
![]() ![]() |
该操作符仅适用于矩形图像,对于具有透明背景的图像将失败,因为颜色修改也将是透明的。基本上,它是一个相当愚蠢的操作符! |
添加内边框
用户希望添加一个覆盖图像边缘的边框,而不是在图像外部添加边框。解决方案是在图像周围绘制一个矩形。由于内置的 rose in 是 70x46 像素,因此这是结果。
|
![]() |
-strokewidth
" 控制。也就是说{stroke width} = {border width} * 2 - 1
-strokewidth
" 为 11。如果您不知道图像的大小,则可以 修剪 图像,然后像往常一样添加 边框。这可能更容易,尽管可能不如通用。
|
![]() |
随机像素扩散
"-spread
" 将用源图像中随机的附近颜色的颜色替换每个像素。此随机选择是根据 像素插值 和 虚拟像素设置 的使用情况进行的。例如...
|
![]() |
另请注意,"-spread " 还会使用 虚拟像素设置。
|
![]() |
-interpolate Nearest
" 来强制特定像素的颜色查找,从而防止这种颜色混合。为了避免虚拟像素和可能的“边缘颜色偏差”问题,我建议您使用 "-virtual-pixel Mirror
"。因此,这是一种更传统的随机“扩散”像素...
|
![]() |


+spread
" 来实际交换图像内的像素,这意味着图像中的任何像素都不会被复制或丢失。原始图像中的每个像素仍然存在,只是被移到了新的位置。但是,由于像素的处理方式,像素可能会被“双重交换”。也就是说,一个特定的像素可能会被交换,但随后会被选中再次与后面的像素交换。这意味着特定像素的漂移可能比扩散参数请求的更远。这种双重交换还意味着像素更有可能向右下角扩散。当然,这种运动是平衡的,但大量像素向左上角的漂移较小。例如,这里我扩散了像素,并在前面添加了参考。
|
![]() |
|
![]() |
暗角照片变换
一个特殊的操作符,用于使图像呈圆形并具有柔和模糊的轮廓。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
复杂的拍立得变换
感谢 Timothy Hunter(RMagick 名人)完成的工作,"-polaroid
" 变换操作符已添加到 IM v6.3.2 中。
Polaroid® 是 Polaroid Corporation 的注册商标。
例如,这里我给照片缩略图一个拍立得外观。图像正在查看 凯旋门内(向下)的螺旋楼梯,巴黎。这是一个非常长的楼梯!。
|
![]() |
![]() ![]() |
请注意,生成的图像具有半透明阴影,因此您要么必须使用 PNG 格式的图像,要么 "-flatten " 将结果展平到 GIF 或 JPG 格式的固定背景颜色上。 |
-bordercolor
" 设置),“卷曲”纸张,并在阴影上添加反向卷曲。阴影颜色可以通过 "-background
" 颜色设置来控制。如您在上面看到的,操作符的加号形式将以随机量旋转结果。此操作符使 照片索引 比您原本获得的更加有趣且不那么静态。操作符的减号形式允许您控制图像的旋转角度。
|
![]() |
如果图像具有 "-caption " 元数据,则该文本也将通过 "caption: " 图像创建操作符添加到拍立得框架的下边框中。也就是说,它将换行到照片的宽度。
|
![]() |
其他标准文本设置(根据 "caption: "),允许您控制添加的标题的外观。
|
![]() |
![]() ![]() |
"-caption " 图像元数据属性之所以使用,是因为内部使用了 "caption: " 文本到图像生成器。另一方面,IM 命令 " montage " 使用 "-label ",因为它使用非换行的 "label: " 文本到图像生成器。 |
-density
" 的两倍绘制文本。不要增加字体的 "-pointsize
",因为那样不会以相同的方式放大文本。
RMagick 拍立得效果。步骤包括:创建和追加字幕、添加边框、用波浪卷曲照片、添加反向卷曲阴影,最后旋转图像。有关更多示例和其他 DIY 方法,请参阅拍立得缩略图示例和拍立得照片蒙太奇。您可能还会对RubbleWeb IM 示例,其他中的一些拍立得示例感兴趣。油画,彩色斑点
“-paint
”运算符旨在将图片转换为绘画,方法是在画布上应用厚厚的“斑点”颜料。结果是将邻域颜色合并成更大的单色区域。
magick rose: -paint 1 rose_paint_1.gif magick rose: -paint 3 rose_paint_3.gif magick rose: -paint 5 rose_paint_5.gif magick rose: -paint 10 rose_paint_10.gif magick rose: -blur 0x3 -paint 10 rose_blur_paint_10.gif |
![[IM Output]](../images/rose.gif)

![[IM Output]](rose_paint_1.gif)
![[IM Output]](rose_paint_3.gif)
![[IM Output]](rose_paint_5.gif)
![[IM Output]](rose_paint_10.gif)

![[IM Output]](rose_blur_paint_10.gif)
-paint
”应该生成单一纯色区域,但在较大的半径值下,它往往会在某些区域产生垂直渐变。这非常令人讨厌,可能是错误。有人知道吗?可以使用“-paint
”的替代方案。一种是使用“-statistic Mode
”代替,它为每个像素分配给定矩形邻域内的“主要颜色”,并且可以产生更好的结果。
|
![]() |
|
![]() |
|
![]() |
炭笔画,场景的艺术家素描
炭笔效果旨在模拟艺术家对给定图像的炭笔素描。运算符“-charcoal
”在某些方面类似于计算机视觉使用的边缘检测变换。基本上,它试图将图像中物体的主要边界和边缘转换为铅笔和炭笔阴影。一个参数应该表示边缘线的粗细。
magick rose: -charcoal 1 rose_charcoal_1.gif magick rose: -charcoal 3 rose_charcoal_3.gif magick rose: -charcoal 5 rose_charcoal_5.gif |
![[IM Output]](../images/rose.gif)

![[IM Output]](rose_charcoal_1.gif)
![[IM Output]](rose_charcoal_3.gif)
![[IM Output]](rose_charcoal_5.gif)
![]() ![]() |
从技术上讲,“-charcoal ”运算符是“-edge ”运算符,并对原始图像的灰度转换应用了一些阈值处理。 |
铅笔素描变换
“-sketch
”运算符基本上将线条笔触模式应用于图像,以生成看起来像艺术铅笔素描的效果。参数控制笔触的长度和角度。但是,最好将其应用于具有明显阴影的较大图像。请参阅铅笔素描,了解此运算符的完整示例及其内部工作原理。浮雕,创建金属质感
“-emboss
”运算符试图生成灰度图像在金属板上进行酸性压印的效果。在许多方面,它与我们将在下面看到的“-shade
”运算符非常相似,但没有 3D 外观边缘。其参数是半径/sigma,只有 sigma 重要。我发现该参数用处不大,实际上可能存在错误。该参数在最近版本的 IM 中也发生了变化。我只是不知道发生了什么事。如果您能理解,请帮助我理解。
magick rose: -emboss 0x.5 rose_emboss_0x05.gif magick rose: -emboss 0x.9 rose_emboss_0x09.gif magick rose: -emboss 0x1 rose_emboss_0x10.gif magick rose: -emboss 0x1.1 rose_emboss_0x11.gif magick rose: -emboss 0x1.2 rose_emboss_0x12.gif magick rose: -emboss 0x2 rose_emboss_0x20.gif |
![[IM Output]](../images/rose.gif)

![[IM Output]](rose_emboss_0x05.gif)
![[IM Output]](rose_emboss_0x09.gif)
![[IM Output]](rose_emboss_0x10.gif)
![[IM Output]](rose_emboss_0x11.gif)
![[IM Output]](rose_emboss_0x12.gif)
![[IM Output]](rose_emboss_0x20.gif)
magick rose: -colorspace Gray -emboss 0x.5 rose_g_emboss_0x05.gif magick rose: -colorspace Gray -emboss 0x.9 rose_g_emboss_0x09.gif magick rose: -colorspace Gray -emboss 0x1 rose_g_emboss_0x10.gif magick rose: -colorspace Gray -emboss 0x1.1 rose_g_emboss_0x11.gif magick rose: -colorspace Gray -emboss 0x1.2 rose_g_emboss_0x12.gif magick rose: -colorspace Gray -emboss 0x2 rose_g_emboss_0x20.gif |
![[IM Output]](../images/rose_grey.gif)

![[IM Output]](rose_g_emboss_0x05.gif)
![[IM Output]](rose_g_emboss_0x09.gif)
![[IM Output]](rose_g_emboss_0x10.gif)
![[IM Output]](rose_g_emboss_0x11.gif)
![[IM Output]](rose_g_emboss_0x12.gif)
![[IM Output]](rose_g_emboss_0x20.gif)
If anyone knows exactly what the emboss algorithm is supposed to do, please let me know.
隐写术,将秘密图像隐藏在图像中
“-stegano
”运算符实际上更像是一个“有趣”的运算符。例如,间谍可以使用它将信息隐藏在随机图像的“混乱”中。首先警告...
不要将 JPEG、GIF 或任何其他“有损”图像编码与隐写术一起使用
例如,让我们生成一条您想发送给同伴间谍的密码信息(图像)...
|
![]() |
||
|
|
![]() |
|
![]() |
|
![]() |
||
|
PAE
”度量表明最大差异仅是此图像使用的 8 位颜色值中的一个颜色值。也就是说,微不足道。微不足道到图像的细微更改或修改都会破坏隐藏在其中的消息。差异如此之小,您甚至无法使用 JPEG 及其有损压缩作为图像格式,或任何其他有损图像格式(包括 GIF)作为容器图像。此外,如果您使用错误的“偏移密钥”,您将无法获取消息...
|
![]() |
加密图像数据
运算符“-encipher
”和“-decipher
”基本上会将图像数据加密成乱码。也就是说,图像内容本身在图像稍后解密之前根本无法识别。例如,这可以用于保护公共服务上的敏感图像,以便只有拥有秘密密码的其他人才能稍后查看它。但首先警告...
不要将 JPEG、GIF 或任何其他“有损”图像编码与加密一起使用
例如,让我们使用保存在不太“秘密”的文件“pass_phrase.txt”中的密码来加密上面创建的秘密消息图像。
![]() ![]() |
加密图像假定它使用 8 位图像文件格式保存。因此,建议通过在最终保存到输出文件之前设置“-depth 8 ”来强制执行此限制。上面也需要“ png24 ”以确保输出不是调色板或颜色映射的“png8:”图像,这也不起作用。 |
|
![]() |
echo "password" | magick message.gif -encipher - \ -transpose -depth 8 png24:message_obfuscate.png echo "password" | magick message_obfuscate.png -transpose \ -decipher - message_restored_2.png |
![[IM Output]](message.gif)

![[IM Output]](message_obfuscate.png)

![[IM Output]](message_restored_2.png)
-transpose
”,则图像将无法正确解密。另请注意,由于使用了流密码(请参阅下面的专家说明),因此仅使用某种“-roll
”将无法防止图像被解密,至少部分如此。请注意,在上面我没有使用文件来保存“密码”,而是使用标准输入将短语馈送到“magick
”命令中,这允许您使用其他程序或命令从用户那里获取短语,生成它,或其他方法,而不是使用包含明文密码的文本文件。密码也可以从其他免费下载的文件和图像中生成。例如,您可以使用众所周知、免费下载的参考图像的签名或注释字符串来解密图像。例如,这里我使用“rose.gif
”图像的签名来加密,然后解密“message.gif
”图像。
magick identify -format %# rose.gif |\ magick message.gif -encipher - -depth 8 png24:message_signed.png magick identify -format %# rose.gif |\ magick message_signed.png -decipher - message_restored_3.png |
![[IM Output]](message.gif)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_signed.png)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_restored_3.png)
-encipher
”和“-decipher
”使用的文件可以是二进制文件。因此,您甚至可以直接使用图像本身作为密码。
magick message.gif -encipher rose.gif -depth 8 png24:message_binary.png magick message_binary.png -decipher rose.gif message_restored_4.png |
![[IM Output]](message.gif)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_binary.png)

![[IM Output]](../images/rose.gif)

![[IM Output]](message_restored_4.png)
![]() ![]() |
在 IM v6.4.8-0 之前,二进制文件会在找到的第一个“NULL”字符处停止。如果使用 PNG 图像,则这种情况会很早发生。 |
![]() ![]() |
IM v6.3.8-6 版本中添加了“-encipher ”和“-decipher ”操作符,但需要在构建配置中包含“--enable-cipher ”选项。然而,到了 IM v6.4.6 版本(具体时间不详),这个配置项不再需要,它变成了标准的配置设置。因此,您现在很可能可以直接使用它。 |
![]() ![]() |
加密的实现是使用基于分组密码的自同步流密码。 这意味着即使图像的部分下载内容因传输错误而损坏,您仍然可以对其进行解密。即使图像的某些部分被破坏,您也可以解密并检查成功下载的部分。您不需要下载整个图像才能解密并检查成功下载的部分。 但是,您确实需要密码才能有机会成功解密图像,因为它是一种非常强大的加密方式。 |
像素化图像
像素化图像基本上是将图像转换为一系列较大的彩色“像素”,这些像素只能显示原始图像的模糊轮廓。这两种技术都涉及缩小图像(以生成更少的像素),然后以某种方式放大它们,以便使用缩放操作符或采样操作符创建“像素块”来生成颜色块。正是图像的缩减方式决定了将使用哪种颜色。单个像素样本或合并的平均颜色。
magick rose: -sample 25% -scale 70x46\! rose_pixelate_sampled.gif magick rose: -scale 25% -scale 70x46\! rose_pixelate_scaled.gif magick rose: -resize 25% -scale 70x46\! rose_pixelate_resized.gif |
![[IM Output]](../images/rose.gif)

![[IM Output]](rose_pixelate_sampled.gif)
![[IM Output]](rose_pixelate_scaled.gif)
![[IM Output]](rose_pixelate_resized.gif)
像素网格
图像网格化与图像像素化非常相似。在这种情况下,我们只想放大图像,以生成图像细节的清晰像素级视图。通常是一个非常小的图像。最简单的方法就像前面的示例一样,只需缩放一个小图像,以放大像素。
magick rose: -crop 10x10+12+20 +resize grid_input.png magick grid_input.png -scale 1000% grid_scale.png |
![[IM Output]](grid_input.png)

![[IM Output]](grid_scale.png)
在这里,我们生成一个黑白“网格”,并使用屏幕合成进行叠加(叠加白色,同时保持黑色区域不变)。
|
![]() |
scale*image_size+gap_size
(在本例中为 10*10+1 => 101)。我还交换了这两个图像,以便最终图像大小来自图块图像,而不是来自缩放图像(缩放图像的大小少了一个像素)。但是,这可能会丢失原始图像中的任何图像元数据,因为我使用了图块图像作为目标。在这里,我生成圆形的彩色“斑点”,但这次使用了乘法合成(叠加黑色,同时保持白色区域不变)。
|
![]() |
例如,这里我使用基本形态学操作符在彩色叠加层上生成菱形“孔”。为此,绘制单个“种子”像素并使用菱形形态学内核进行扩展。
|
![]() |
![]() ![]() |
请注意,“tile: ”编码器会将图像中的任何透明度替换为当前背景颜色。如果您想保留平铺图像的透明度,请设置“-background none ”或“-compose Src ”。前者更容易。 |
图块间距
类似的问题是在图像中分隔图块网格。这不仅仅是将单个像素缩放成“像素块”,而是将图像的矩形区域之间插入空间。也就是说,在图像的规则间隔处拼接额外的像素。目前,最佳解决方案是将图像分解成行和列,并在拼接额外间距到每个图块上,然后再附加图块以重新组合在一起。例如……
magick rose: -background SkyBlue \ -crop 10x0 +repage -splice 3x0 +append \ -crop 0x10 +repage -splice 0x3 -append \ grid_tile.png |
![[IM Output]](../images/rose.gif)

![[IM Output]](grid_tile.png)
|
![]() |
3
”是要添加的间隙宽度,“10
”是图块大小。您只需要在结果中添加边框或其他边缘即可。稍微多做一些工作,您甚至可以为上述网格中每个图块的放置添加一些随机的“抖动”,以获得不太规则的效果。这两种方法的问题在于,生成大量的小图像,然后再将它们拼接在一起确实会产生大量的工作。特别是对于非常小的图块尺寸。IM 论坛讨论中提议了一种更好的方法,即对拼接操作符进行特殊扩展拼接(添加图块网格间隙)。计算机视觉变换
边缘检测
“-edge
”操作符突出显示图像中颜色渐变的区域。它是一个灰度操作符,因此分别应用于三个颜色通道中的每一个。
magick mask.gif -edge 1 mask_edge_1.gif magick mask.gif -edge 2 mask_edge_2.gif magick mask.gif -edge 3 mask_edge_3.gif magick mask.gif -edge 10 mask_edge_10.gif |
![[IM Output]](mask.gif)

![[IM Output]](mask_edge_1.gif)
![[IM Output]](mask_edge_2.gif)
![[IM Output]](mask_edge_3.gif)
![[IM Output]](mask_edge_10.gif)
-edge
”操作符的结果时,这一事实可能极其重要。例如,如果您要对包含黑色轮廓的图像进行边缘检测,“-edge
”操作符会“加倍”黑色线条,产生奇怪的结果。
但是,在进行边缘检测之前对图像进行反转,加倍的线条会向内移动并合并在一起,从而消除“加倍线条”效果。
|
![]() |
我发现边缘往往过于锐利,导致生成的图像边缘不平滑。因此,我发现对结果进行非常轻微的模糊处理可以改善外观。
|
![]() |
Canny 边缘检测器
在 IM v6.8.9-0 版本及更高版本中,IM 现在支持 Canny 边缘检测器。(请参阅 IM 论坛上的公告示例)。这是一种非常先进的边缘检测算法,它在所有锐利边缘处生成非常强(二进制)的单像素宽线条,并且干扰噪声非常少。例如,这里我们将其应用于上面使用的测试图像。
magick mask.gif -canny 0x1+10%+30% mask_canny.gif magick piglet.gif -canny 0x1+10%+30% piglet_canny.gif magick piglet.gif -negate -canny 0x1+10%+30% piglet_canny_neg.gif magick rose: -canny 0x1+10%+30% rose_canny.gif |
![[IM Output]](mask.gif)

![[IM Output]](mask_canny.gif)
![[IM Output]](piglet_canny.gif)
![[IM Output]](piglet_canny_neg.gif)
![[IM Output]](rose_canny.gif)
来自抗锯齿形状的边缘轮廓
普通边缘检测方法的最大问题是结果高度锯齿化。也就是说,无论形状是平滑(反锯齿)还是锯齿化,它都会产生非常类似阶梯的像素效果。例如,这里是一个平滑的反锯齿语音气泡(“WebDings”字体字符“(
”)。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
|
![]() |
来自位图形状的边缘轮廓
位图图像更难处理,因为它们没有任何可用于生成平滑轮廓的反锯齿像素。例如,这里是一个从“WebDings”字体(字符“Y
”)中提取的花哨“心形”形状。但是我故意将其生成为锯齿状位图,以模拟从网络下载的糟糕位图图像。例如,包含透明度的 GIF 图像的轮廓。
|
![]() |
|
![]() |
反转边缘会生成边缘图像,但用于黑色区域的内部。
|
![]() |
|
![]() |
EdgeIn
”形态学方法或其他类似方法创建稍微更好的边缘。
|
![]() |
-filter Cubic
”设置或其他重采样滤镜来生成更厚的边缘。
|
![]() |
0.7
”的模糊效果最好,并且将限制设置为 3 个像素以加快速度。
|
![]() |
-evaluate multiply 2 -negate
”。使用抗锯齿边框,如果只想平滑原始形状而不是获取其轮廓,则现在可以重新添加原始形状。只需记住,轮廓正好位于原始图像的边缘,因此尺寸将比前面的示例大半个像素。您是否知道从形状(抗锯齿或位图)生成抗锯齿轮廓的其他方法?如果是这样,请将其邮件发送给我或IM论坛。您将获得认可。 使用光栅到矢量转换器进行边缘化
最理想的解决方案之一是使用非IM的“光栅到矢量”转换程序将此位图形状转换为矢量轮廓。可以执行此操作的程序包括:“ScanFont
”、“CorelTrace
”、“Adobe的Streamline
”以及“Vector Magic
”。但是,大多数这些程序都需要您支付一定的费用。“VectorMagick”和另一个跟踪程序“AutoTracer”提供了免费使用的在线图像转换器。其他免费解决方案包括“AutoTrace
”或“PoTrace
”。欢迎提出更多建议。这些跟踪程序使用简单,但通常需要某种形式的图像预处理和后处理。它们具有有限数量的输入格式,并输出矢量图像,这将创建输入图像的“平滑”形式。我更喜欢“AutoTrace
”,因为它不会缩放生成的SVG数据,从而产生标准的线宽,但是您不能在“管道”中使用它。为了获得最佳效果,最好确保我们只向其提供基本的位图图像,我们可以通过对输入图像进行阈值处理来确保这一点,同时将其转换为autotrace理解的图像格式。然后,我可以将该图像转换为SVG矢量图像。
|
![]() |
![]() |
|
![]() |
![]() |
autotrace:
”图像输入委托直接执行上述序列。这只需要安装“autotrace
”命令即可。例如
|
![]() |
AutoTrace
”委托库构建,则还可以让IM直接从内存中的图像生成SVG图像。有关此内容的详细信息,请参阅SVG输出处理。例如……现在,SVG输出当然会表示原始图像的平滑版本,这实际上不是我们在此示例中想要的。但是,由于我们现在以矢量形式拥有了位图的形状,因此我们可以简单地调整SVG的“style
”属性,以便“stroke
”轮廓,而不是“fill
”形状。然后,可以将修改后的SVG重新馈送到ImageMagick中,以重新创建干净的轮廓栅格图像。例如……
|
![]() |
autotrace
”命令本身的选项来指定就好了,但这目前不是一个功能。您还可以进一步修改SVG输出以加厚边缘,或指定其他笔画或背景颜色,更改矢量边缘形状的填充颜色。例如,这里我们使用红色填充生成形状的更粗的轮廓,所有这些都是经过抗锯齿处理的。
|
![]() |
d="..."
”路径元素,以便在绘图命令中直接用作SVG路径字符串。然后,这将允许您使用任何其他IM绘图设置以及该矢量轮廓,从而完全控制最终结果。有关使用“AutoTrace
”程序的另一个示例,请参阅使用Autotrace的骨架。霍夫线检测器
霍夫线检测器(IM v6.8.9-1中添加的“-hough-lines
”)是一个非常复杂的变换,包含许多阶段(有关详细信息,请参阅维基百科,霍夫变换)。基本上,它旨在检查图像,查找黑色背景上的白色线条,并尝试返回图像中存在的任何线段(线性序列像素)的确切位置。这对于图像旋转移除或确定图像中的透视变换非常重要,因此可以重复或移除。以下是运算符的完整选项集
-background {background} -stroke {line_color} -hough-lines {W}x{H}+{threshold} |
现在让我们将霍夫线检测器应用于此图像。
|
![]() |
-hough-line
”运算符的阈值。由此您可以看到第一条和最后一条线(它们非常匹配)的强度大致相等,因此很难选择其中一条而不是另一条。如果发生这种情况,我建议您尝试改进边缘检测步骤。请注意,MVG图像未定义任何颜色。此示例中的颜色设置实际上未使用。仅当您在将上述结果转换为“栅格”图像时实际“绘制”矢量时才会使用颜色,就像我们之前所做的那样。您还可以查看正在查找每个方向上白色像素的中间“搜索图像”或“累加器”,方法是使用特殊的define。
|
![]() |
houghlines
”,但具有不同的“垂直距离”累积处理。局部自适应阈值


-lat
”运算符尝试根据周围窗口中像素的值自适应地对每个像素进行阈值处理。这通常用于对背景不均匀(即照明不均匀)的图像进行阈值处理。它基于以下假设:小窗口中的像素将具有大致相同的背景颜色和大致相同的前景颜色。For example. magick input.png -lat 17 output.png在上面,使用17像素正方形“窗口”来确定每个点处图像的平均颜色,如果像素比此平均值暗,则将其设为黑色,如果比此平均值亮,则将其设为白色。较小的窗口尺寸将使阈值对照明的小变化更敏感,计算速度更快,但会受到图像噪声的不利影响。
Example较大的窗口尺寸将使阈值对照明的小变化不太敏感,计算速度较慢,受图像噪声的影响较小。这会使阈值选择对像素值的小变化或多或少敏感。
Example
The window does not need to be square. for example... magick input.png -lat 15x25 output.png您还可以提供一个偏移量,该偏移量将添加到计算出的平均颜色中,从而使每个像素的局部阈值变亮或变暗。例如,这可以用于减少噪声或像素值微小变化的影响。
magick input.png -lat 15x25+2%当使用扫描仪或数码相机获取图像时,通常会发生这些微小变化。使用正偏移值可使自适应阈值对像素值的微小变化不太敏感。使用负阈值可使自适应阈值对像素值的微小变化更敏感。或者,可以在使用“-lat”处理图像之前减少图像中的噪声。
In summary, each pixel is thresholded using the following logic: AVG = average value of each pixel in the window IF (input pixel is > AVG + OFFSET) Output pixel is BLACK else Output pixel is WHITE --- An alternative is to subtract a blurred copy of the original image using (Modulus) Subtraction, then thresholding. magick rose: -colorspace gray -lat 10x10+0% x: is roughly equivalent to... magick rose: -colorspace gray \( +clone -blur 10x65535 \) \ -compose subtract -composite -threshold 50% x: The special "-blur 10x65535" is a linear averaging blur limiting itself to a 10x10 window. The 'Subtract' composition being a mathematical modulus type of operation will wrap the values that goes negative back round to a value greater than 50%. If you want to include an offset you can do so by also subtracting a solid color background image by using a -flatten... for example magick rose: -colorspace gray -lat 10x10+10% x: is roughly equivalent to... magick rose: -colorspace gray \( +clone -blur 10x65535 \) \ -compose subtract -background gray10 -flatten -threshold 50% x:以上内容是从D Hobson <dhobson@yahoo.com>提供的初始注释中修改的。
-adaptive-sharpen Sharpen images only around the edges of the images -segment cluster-threshold x smoothing-threshold Segmentation of the color space (not image objects) This can produce very verbose output. This applies the "fuzzy c-means algorithm" if you want to know more. Also related is -despeckle. to remove single off color pixels. Generate a 3d stereogram of two images (one for each eye) This is also known as an anaglyph magick composite left.jpg right.jpg -stereo anaglyph.jpg
3D阴影高亮显示
阴影用法
我一直认为ImageMagick提供的“-shade
”运算符是最有趣的运算符之一。该运算符的文档仅粗略地暗示了其功能。我花费了大量个人研究来理解该运算符,甚至找出如何最好地利用它可以为IM用户提供的强大功能。基本上,此运算符的作用是假设给定图像称为“高度场”。也就是说,表示某个对象或地形的表面的灰度图像。“白色
”表示图像中的最高点,而“黑色
”表示最低点。这种表示来自20世纪80年代的计算机视觉研究,其中使用了具有强“相机光”的照片,使近点变亮,远处点变暗。![]() ![]() |
由于“-shade ”需要灰度图像,因此该运算符会自动删除输入图像中的任何颜色。同样,图像中可能存在的任何透明度对运算符来说完全无用且被忽略。 |
-shade
”获取此灰度高度场并对其照射光线。结果是将由此产生的光照阴影的表示形式。请记住,您必须将输入图像视为输出的“表面”,才能使其有任何意义。为了进行演示,我们需要一个“高度场”图像,因此让我们绘制一个。
|
![]() |
-shade
”的输入,还用于蒙版图像,从阴影结果中剪切出相同的形状。请参见下面的蒙版阴影图像。对于“-shade
”操作符,此图像看起来像一个平坦的黑色平面,上面有一个垂直向上升起的平坦白色平台。因此,只有此图像的边缘会产生有趣的效果。为此,这两个参数定义了光线照射的方向。第一个参数是光线照射的方向。因此,'0
' 度角将来自东方(左侧),'90
' 则为从北方(或顶部)逆时针方向,依此类推。例如...
magick shade_a_mask.gif -shade 0x45 shade_direction_0.gif magick shade_a_mask.gif -shade 45x45 shade_direction_45.gif magick shade_a_mask.gif -shade 90x45 shade_direction_90.gif magick shade_a_mask.gif -shade 135x45 shade_direction_135.gif magick shade_a_mask.gif -shade 180x45 shade_direction_180.gif |
![[diagram]](../img_diagrams/shade_elevation.gif)
magick shade_a_mask.gif -shade 90x0 shade_elevation_0.gif magick shade_a_mask.gif -shade 90x15 shade_elevation_15.gif magick shade_a_mask.gif -shade 90x30 shade_elevation_30.gif magick shade_a_mask.gif -shade 90x45 shade_elevation_45.gif magick shade_a_mask.gif -shade 90x60 shade_elevation_60.gif magick shade_a_mask.gif -shade 90x75 shade_elevation_75.gif magick shade_a_mask.gif -shade 90x90 shade_elevation_90.gif |
0
' 时,形状仅在光线照射的一侧突出显示。其他所有部分都是黑色,因为没有光线照射到任何其他表面。我称之为“黎明高光”,它有其自身的特殊用途。这使我们想到了第一个值得注意的要点。“-shade
”处理后的图像通常比高光区域具有更多的黑暗或阴影区域。阴影并不相等。随着光线在“高度场”图像上变得更高。图像的整体亮度将变得更白,直到“正午”或高度为'90
' 时,任何平坦区域都将呈现出明亮的白色,并且只有斜坡和边缘被阴影处理成灰色,其中灰色为最大值,或“悬崖状”的斜坡变化。此“正午”图像是另一种特殊情况,有点类似于边缘检测系统,尽管对于锐利边缘,它的宽度在 2 到 4 个像素之间。我过去曾使用此图像生成“-shade
”图像的斜角边缘的蒙版,以便使平坦区域透明。如果高度角超过'90
' 度,则将获得与光线来自另一个方向相同的结果。因此,参数'0x135
' 将产生与'180x45
' 完全相同的结果。负高度角也将产生相同的结果,就像光线从下方照射到“半透明”表面一样。因此,'0x-45
' 将与'0x45
' 相同。换句话说,对于特定的阴影,通常还有其他 4 个参数也会产生相同的结果。从上面可以看出,我认为'120x45
' 参数最适合直接使用阴影输出。例如,这里它创建了一些斜角文本...
magick -size 320x100 xc:black \ -font Candice -pointsize 72 -fill white \ -draw "text 25,65 'Anthony'" \ -shade 120x45 shade_anthony.jpg |
![[IM Output]](shade_anthony.jpg)
-shade
”的主要问题之一是实际产生的斜角的厚度。我上面使用的此类锐利边缘始终会产生大约 4 个像素宽的斜角,既进入蒙版区域也超出蒙版区域。无法调整此厚度,除非在使用“-shade
”操作符之前和之后调整图像大小。如果您想了解特定高度照明角度下“平坦区域”的亮度,则可以使用以下命令对平坦的纯色表面进行阴影处理。
|
![[IM Text]](shade_elevation_45.txt.gif)
45
' 度的高度产生了大约 70% 灰度的相当明亮的纯色,对于一般观看来说,这是一个合理的灰色级别。但是,如果您计划使用阴影生成各种形状的 3D 高光,那么实际的灰色级别变得非常重要。我们将在创建叠加高光中介绍这一点。基本上,这就是“-shade
”操作符。但是,有效地使用它呈现了一系列技术和可能性,我们将在接下来进行介绍。蒙版阴影形状
如上所述,简单的“蒙版”形状通常与“-shade
”一起使用,以从简单的形状生成复杂的三维效果。例如,让我们对直接阴影蒙版图像执行此操作。
magick shade_direction_135.gif shade_a_mask.gif \ -alpha Off -compose CopyOpacity -composite shade_beveled.png |
![[IM Output]](shade_direction_135.gif)

![[IM Output]](shade_a_mask.gif)

![[IM Output]](shade_beveled.png)
-shade
”操作符生成的斜角大约有一半实际上超出了蒙版区域。换句话说,直斜角在蒙版时会减半。另一方面,垂直或“正午”阴影图像(使用'90
' 度高度角)可用于仅提取斜角边缘,使图像中心为空心。
magick shade_direction_135.gif \ \( shade_elevation_90.gif -normalize -negate \) \ -alpha Off -compose CopyOpacity -composite shade_beveled_edge.png |
![[IM Output]](shade_direction_135.gif)

![[IM Output]](shade_elevation_90.gif)

![[IM Output]](shade_beveled_edge.png)
-shade
”操作符效果的位置(和强度),但实际上并没有完全覆盖这些效果。通过将“正午”阴影图像与原始蒙版组合,您可以稍微增加该蒙版的大小,以生成更好的蒙版斜角图像。
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
|
![]() |
|
![]() |
阴影形状图像
“Alpha Extract 操作符”不仅会将形状图像的 Alpha 通道提取为灰度蒙版,而且还会产生保留“关闭”Alpha 通道中形状的副作用。由于它是“关闭”的,因此许多图像处理操作符(包括“-shade
”)将不会对其进行处理,从而保留其细节。这意味着对于形状图像,您可以提取形状,完成工作,然后在完成所有图像处理后,只需再次打开Alpha On即可恢复透明度!例如,这里我在透明背景上绘制一个“心形”,对图像进行一些模糊和阴影处理,然后恢复图像的原始形状轮廓。
|
![]() |
圆形阴影边缘
如您在上一个示例中看到的,通过模糊图像形状蒙版,“边缘悬崖”的“斜率”将被平滑,就像随着时间推移而磨损一样。这会为阴影图像产生不错的圆形效果。
magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \ shade_circle_mask.gif magick shade_circle_mask.gif -shade 120x45 shade_blur_0.gif magick shade_circle_mask.gif -blur 0x1 -shade 120x45 shade_blur_1.gif magick shade_circle_mask.gif -blur 0x2 -shade 120x45 shade_blur_2.gif magick shade_circle_mask.gif -blur 0x3 -shade 120x45 shade_blur_3.gif magick shade_circle_mask.gif -blur 0x4 -shade 120x45 shade_blur_4.gif magick shade_circle_mask.gif -blur 0x5 -shade 120x45 shade_blur_5.gif |
magick shade_blur_3n.gif shade_circle_mask.gif \ -alpha Off -compose CopyOpacity -composite shade_blur_3n_mask.png |
![[IM Output]](shade_blur_3n.gif)

![[IM Output]](shade_blur_3n_mask.png)
创建叠加高光
“-shade
”操作符的输出非常不错,但您实际上很少想要形状的普通灰度图像。它需要一些颜色。但是,这并不容易,因为添加颜色的两种主要方法,颜色着色中间色调仅重新着色灰度,或'叠加' Alpha 合成,以图像替换灰色区域,都依赖于灰度图像的特殊形式。也就是说,完美的中间色调灰色('grey50
')被颜色或图像替换,而更白或更暗的灰色则相应地使颜色或图像变白或变暗。这些具有完美中间色调灰色的特殊灰度“叠加高光”图像,用于未修改的区域,使用“-shade
”创建起来并不那么简单。但是,以下是我发现的一些更简单的方法。使用“-shade
”的 30 度高度照明角,是一种为阴影形状的平坦区域生成完美中间色调灰色的方法。例如,这里我对图像进行阴影处理,然后提取左上角像素以检查“平坦”部分图像的结果颜色。
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|||
|
![]() |
||
|
-blur
”的圆形效果往往也会改变阴影图像的结果高光强度。也就是说,使用较大的模糊不仅会产生外观圆润的边缘,还会使高光变得非常暗淡,几乎不可见。这意味着您需要在生成的“-shade
”图像的输出中添加更多对比度,以使高光作为叠加图像有效。为了解决这个问题,我们需要一种方法来消除圆形调整带来的这种对比度效果。通常的做法是“-normalize
”图像,但是对 30 度阴影图像执行此操作会导致“平坦”区域不再是完美的灰色。例如...
|
![]() |
||
|
|
![]() |
||
|
-normalize
”操作符运行,“-blur
”用于“圆化边缘”的值将不再影响最终结果的强度。一种更好的方法。总之,“规范化”阴影图像会使中间色调偏离完美的灰色颜色。现在我们可以完全独立于其他调整来调整产生的高光的输出强度。通常,由于规范化结果是极端的,我们将需要受控的反规范化或反对比度控制,以将高光降低到所需的级别。调整结果高光的简单方法是使用完美的灰色颜色着色图像。这会将图像中的所有颜色级别都向中心的纯中间色调灰色颜色移动。例如...
magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \ \( +clone -blur 0x2 -shade 120x21.78 -normalize \) \ +swap -alpha Off -compose CopyOpacity -composite shade_tint_0.png magick shade_tint_0.png -fill grey50 -colorize 10% shade_tint_10.png magick shade_tint_0.png -fill grey50 -colorize 30% shade_tint_30.png magick shade_tint_0.png -fill grey50 -colorize 50% shade_tint_50.png magick shade_tint_0.png -fill grey50 -colorize 80% shade_tint_80.png |
-contrast-stretch
”的'0%
'而不是“-normalize
”,以及像上面那样对结果进行少量反归一化来实现。这似乎只是增加了高光叠加图像生成的复杂性,但强调高光中的亮点使额外的处理值得付出努力。例如……
magick -size 50x50 xc:black -fill white -draw 'circle 25,25 20,10' \ \( +clone -blur 0x2 -shade 120x21.78 -contrast-stretch 0% \) \ +swap -alpha Off -compose CopyOpacity -composite shade_sig_0.png magick shade_sig_0.png -sigmoidal-contrast 10x50% shade_sig-10.png magick shade_sig_0.png -sigmoidal-contrast 5x50% shade_sig-5.png magick shade_sig_0.png -sigmoidal-contrast 2x50% shade_sig-2.png magick shade_sig_0.png +sigmoidal-contrast 2x50% shade_sig+2.png magick shade_sig_0.png +sigmoidal-contrast 5x50% shade_sig+5.png magick shade_sig_0.png +sigmoidal-contrast 10x50% shade_sig+10.png |
![]() ![]() ![]() ![]() ![]() ![]() |
||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||
|
![]() |
- 总之,上面的示例有四个单独的控件……
- "
blur
":圆化形状边缘(0.001=斜角 2=平滑 10=圆角) - "
shade
":光线照射的方向(120=左上方 60=右上方) - "
sigmoidal
":表面反射控制高光点(1=平坦 5=良好 10=反射) - "
colorize
":高光的整体对比度(0%=明亮 10%=良好 50%=暗淡)
FUTURE: Color Tinting the Overlay image Overlay Alpha Composition with an Image
使用黎明阴影高亮
在上面蒙版阴影图像中,我们展示了“中午”或“正午”阴影图像(使用'90
'的仰角)如何可以用于蒙版以及"-shade
"产生的效果的位置和范围。但是,形状的水平或“黎明”阴影图像(使用'0
'的仰角)也相当有用。例如,它可以用作白色或黑色图像的蒙版,以在形状上生成单独的高光和阴影效果。这还可以用于确保形状获得大致相等数量的明暗区域(甚至不相等的数量),因为我分别生成它们,但以完全受控的方式。FUTURE: more detail here请参阅第一个高级3D徽标,了解使用此技术的示例。
使用FX,DIY图像操作符
图像列表操作符"-fx
"是一个通用的DIY操作符,它不属于任何特定类别的IM操作符,因为它可以用于创建几乎任何图像操作。在这些页面中可以看到其用法的示例,但在这里我们将专门关注其功能以及如何使用它们。该命令在其功能方面非常通用,它可以:- 创建画布、渐变、数学颜色映射。
- 在图像和通道之间移动颜色值。
- 以几乎所有可以想象的方式调整图像颜色。
- 平移、翻转、镜像、旋转、缩放、剪切并通常扭曲图像。
- 将多个图像合并或合成在一起。
- 以奇特而奇妙的方式平铺图像。
- 卷积或合并相邻像素。
- 生成图像度量或“指纹”。
- 以不寻常的方式比较图像。
-fx
"允许您生成所需操作的自己的版本。事实上,我以及其他人经常使用它来制作新操作的原型,这些操作后来被构建到IM的核心库中。例如,请参阅DIY新的有序抖动替换,我使用"-fx
"开发了-ordered-dither
"操作符的修订版本。该操作符本质上允许您对一个或多个图像执行自由形式的数学运算。有关该命令的官方摘要,请参阅FX,特殊效果图像操作符,网址为ImageMagick网站。FX 基本用法
该命令接受任意数量的输入图像的图像序列。通常是一个或两个图像,并将所有输入图像替换为第一个图像的副本,该副本已由"-fx
"函数的结果修改。也就是说,第一个图像中的任何元数据都将保留在"-fx
"操作符的结果中。为了便于数学使用,所有提供的颜色值都归一化为0.0到1.0的值范围。结果也应在此范围内。这包括透明度或alpha通道,它从0.0(表示完全透明)到1.0(表示完全不透明)。这些值表示“alpha透明度”,实际上是IM通常在内部存储透明度(作为遮罩值)的反值。然而,以这种形式在数学上更正确且更容易使用。"-channel
"设置定义了第一个(也称为“第零”或“u
”)图像中的哪个通道将被"-fx
"操作符的结果替换。默认情况下,这仅限于原始图像的颜色通道('RGB
')。除非更改"-channel
"设置以包含alpha('A
')通道,否则该图像中任何现有的透明度都不会被修改。对于每个像素执行一次表达式,以及对正在处理的像素中的每个颜色通道执行一次。此外,由于每次执行表达式时都会重新解析它,因此复杂的表达式在大型图像上可能需要一些时间才能处理。例如,这里我们定义了一个黑色图像,但随后将蓝色通道设置为一半亮度以形成“海军蓝”颜色。
|
![]() |
|
![]() |
![]() ![]() |
为了使"-channel "设置更像"-fx "操作符,它将接受字母'RGBA '的任何组合来指定操作符要限制其操作的通道。这意味着要将" -fx "的输出限制为仅蓝色和绿色通道,您现在可以说"-channel BG "而不是更长的"-channel blue,green "。 |
-fx
"的情况下生成上述示例,但能够对现有图像执行此操作使它成为一个强大的图像操作符。事实上,该函数可以读取和使用当前内存中图像序列中任何图像的任何像素或特定颜色。第一个“零”图像被赋予“u
”的特殊名称。第二个图像“v
”。内存中的其他图像可以通过索引引用。因此,“u[3]
”是当前图像序列中的第四个图像,而“u[-1]
”是序列中的最后一个图像。这与图像列表操作符使用的相同索引方案相同,因此您应该得心应手。如果没有给出其他限定符,则使用的颜色值与指定图像中使用的颜色值相同。也就是说,除非您明确表示要使用红色,否则它将使用命令在该时间处理的颜色通道的颜色值。也就是说,在处理蓝色通道时,它将应用蓝色颜色值的表达式。除非另有说明,否则它将处理图像中每个像素的每个RGB颜色值(由默认的"-channel
"设置设置)。也就是说,3*w*h个计算,这些计算通过给定的表达式修改图像中的所有值。例如,这里我们采用IM内置的“rose:
”图像并将所有像素值乘以50%。
|
![]() |
-fx
”公式来重新着色图像。由于我们还可以将当前图像序列中的任何图像作为修改第一个图像的表达式的一部分进行引用,因此我们可以以几乎任何我们想要的方式合并两个或更多图像。在这里,我们通过将黑色-蓝色渐变(旋转)中的蓝色通道复制到上面生成的以前的黑色-红色渐变中,生成一个黑色-红色-蓝色颜色图表图像。
magick -size 64x64 gradient:black-blue -rotate -90 fx_blue.gif magick fx_red.gif fx_blue.gif \ -channel B -fx 'v' fx_combine.gif |
![[IM Output]](fx_red.gif)

![[IM Output]](fx_blue.gif)

![[IM Output]](fx_combine.gif)
![]() ![]() |
当然,我们可以使用通道复制合成方法,这会快得多。但这不是重点。 虽然反之亦然。几乎所有IM图像操作都可以用FX等效函数替换。 |
-fx
"首先只创建第一个图像的副本。然后它根据公式修改该图像,使用所有其他给定的图像。最后,它放弃所有输入图像,并用第一个图像的修改副本替换它们。您还可以根据图像中每个像素的位置计算值。值'i,j
'是正在处理的像素的当前位置,而'w,h
'给出图像的大小(第一个图像,除非给出了特定图像限定符)。例如,这里我们生成一个DIY渐变图像。
|
![]() |
或者使用'i,j '位置值的其他更复杂的东西。
|
![]() |
G
”或绿色通道),就可以使 -fx 运算符的速度提高约 3 倍。然后可以将此通道分离以生成最终的灰度图像。这可以带来非常大的速度提升,尤其是在使用非常复杂的“-fx
”公式时。有关更多 FX 生成的渐变,请参见示例自定义渐变。您可以使用位置信息使用“p{x,y}
”语法从源图像中查找特定像素。例如,您可以轻松地创建自己的“镜像”类型函数(如“-flop
”图像运算符),该函数用原始源的“镜像”位置的颜色值替换每个像素。
|
![]() |
|
![]() |
0.5
”值都需要在用于输入坐标“i,j
”的像素坐标和位置查找“v.p{...}
”之间正确地进行映射,而更数学上正确的图像坐标则需要用于实际的数学计算(缩放)。上面实际上是任何形式的图像扭曲所使用的确切方法。您可以通过打开详细扭曲摘要来查看大多数扭曲的 FX 等效项。这报告了大多数图像扭曲的 FX 等效项,作为一种双重检查扭曲是否按预期执行的方式。使用FX DIY 运算符进行图像扭曲,显示了该运算符的强大功能。如果不是因为这个运算符,我怀疑许多新的操作,例如扭曲、稀疏颜色或有序抖动,是否会添加到 ImageMagick 核心库中。这里有一些更简单的东西,交换 rose 图像的红色和蓝色通道。看看你是否能弄清楚它是如何工作的。
|
![]() |
![]() ![]() |
执行相同操作更快更好的方法是使用“-separate ”和“-combine ”)。请参见组合 RGB 通道图像。或者,您还可以使用“-color-matrix ”以更快地执行相同操作。你在这里看到趋势了吗? |
-channel
”设置,它将“-fx
”运算符的输出限制为三个颜色通道。这意味着如果您想影响 alpha 或透明度通道,则必须通过更改通道设置来显式指定它。例如,让我们通过将所有 alpha 通道值设置为一半来创建一个半透明的“rose:
”图像。
|
![]() |
rose:
”实际上有一个 alpha 通道,以便“-fx
”可以处理它。我是用Alpha 通道控制运算符来实现的。“-fx
”运算符能够操作图像的 RGBA 通道,这使得它非常适合操作通道和蒙版。从 IM 6.2.10 开始,您可以向“
-fx
”表达式添加变量赋值,这使您可以减少某些表达式的复杂性,否则这些表达式基本上是不可能的。例如,这里我根据距特定点(分配给变量“xx
”和“yy
”)的距离创建渐变。如果没有使用变量,这个公式可能会变得非常难以阅读。
|
![]() |
![]() ![]() |
由于“-fx ”使用的简单标记化处理,变量名只能包含字母,并且不能包含数字。此外,由于许多单个字母用于访问图像信息的内部变量,因此建议变量名至少为两个字母长。因此,我使用“xx ”和“yy ”而不是“x ”或“y ”。 |
![]() ![]() |
“-fx ”函数 'rr=hypot(xx,yy) ' 已添加到 IM v6.3.6 中,以加快非常常用的表达式 'rr=sqrt(xx*xx+yy*yy) ' 的速度。当然,如果您需要距离的平方,则应避免使用 ' hypot() ' 函数及其隐含的 sqrt() 函数。 |
-fx
”表达式的复杂性开始需要外部文件,因此标准的“@filename
”现在可以用于从文件中读取表达式。
|
![]() |
-fx
”很重要的其他设置是“-virtual-pixel
”和“-interpolate
”。虚拟像素设置允许人们设置当查找坐标超出输入图像覆盖的区域时应返回的颜色或图像结果。这允许人们为模糊等内容设置边缘效果,以及在更大区域上平铺图像。插值设置允许人们指定当查找坐标(浮点值)落在输入图像中像素的整数坐标之间时,IM 应该如何混合相邻像素的颜色。有关更多信息,请参见插值像素查找。![]() ![]() |
在不同的时间添加了一些更多功能 IM v6.3.6:hypot() IM v6.7.3-4:while()、not()、guass()、squish() |
FX 调试
'debug(expr)
' 本质上是一种打印浮点值的方法,每次计算 FX 表达式时都会打印一次。这反过来提供了一种调试表达式的办法。但是,您可以通过使用三元 if-else 表达式来限制“debug()
”的输出。例如,这将打印内置“rose:
”图像中像素 10,10 的浮点颜色值。通过使用 'NULL:
' 图像处理程序来忽略实际的图像结果。
|
![]() |
debug()
”不限于单个像素,即使对于这张小图像,输出的长度也会有多长。类似 FX 的内置操作
-fx
运算符表示一种开发以前在 ImageMagick 中不存在的新图像处理函数的方法。用户进行此类开发的结果使 ImageMagick 能够扩展,并具有新的功能和方法,例如颜色查找表(“-clut
”)。但是,通常一旦使用“-fx
”稳定了新方法,该表达式就会转换为更快的内置操作,通常作为一组类似运算符的一部分添加。这些包括以下通用图像运算符及其方法...-evaluate | 直接像素、颜色值、通道修改函数。 (见下面的Evaluate)。 |
-function | 更复杂的像素、颜色值、通道修改函数。 (见下面的Function)。 |
-evaluate-sequence | 以数学方式合并多图像序列的图像 (见下面的Evaluate-Sequence)。 |
-sparse-color | 通用图像重新着色运算符。 (见稀疏颜色渐变) |
-compose | 通用多图像组合和叠加方法。 (见Alpha 合成)。 |
-distort | 通用图像扭曲运算符,使用反向像素映射。 (见扭曲运算符) |
-morphology | 通用区域效果卷积/形态学函数。 (见形态学运算符和卷积运算符) |
-fx
”运算符对其进行原型设计。当他们完成了该“方法”的制定后,该方法将转换为 ImageMagick 核心库中的新超快速内置运算符。欢迎用户贡献他们认为对 IM 有用的自己的“-fx
”表达式(或其他已定义的函数),但这些函数尚未被其他图像运算符涵盖,如果它们可以由上述通用运算符之一处理,则应该很容易添加它。例如,我自己需要一种“如果颜色相似则屏蔽”类型的操作来比较两张图像。这已作为新的“-compose
”方法“ChangeMask
”添加。这反过来让我能够为 GIF 动画添加更复杂的透明度优化。“-fx
”的速度和复杂性开始成为问题,那么最好转向 API 脚本语言(如 PerlMagick)。使用 PerlMagick 的一个示例“pixel_fx.pl
”是该 API 发行版的一部分。FX 表达式作为格式和注释转义
从 IM 版本 6.2.10 开始,您现在可以在图像属性转义字符串(例如“-format
”和“-annotate
”参数使用)中使用FX 表达式。转义序列“%[fx:...]
”被替换为一个数字作为浮点值,在当前图像序列中的每个图像上计算一次。FX 表达式在处理期间会稍作修改。具体来说...- 当前像素坐标“
i
”、“j
”固定为值 0,因此,除非使用“p{}
”索引,否则图像变量本身仅返回像素 0,0 的值。 - 除非选择颜色通道,否则仅返回红色通道值。
- 默认图像引用“
s
”设置为当前图像,正在对其进行注释或识别。 - 索引“
t
”返回由“s
”引用的图像的索引。
![]() ![]() |
在 IM v6.6.8-6 之前,"t " 图像索引和 "n " 图像总数的 FX 表达式值都存在问题,并且对于所有图像都只分别返回 0 和 1 的值。 '%p ' 和 '%n ' 的百分比转义符也存在相同的问题。 |
-annotate
" 命令在每个图像上标注了其左上角像素的颜色。
|
![]() ![]() ![]() |
r
' 实际上等价于 's.p{0,0}.r
'。'g
' 和 'b
' 颜色通道值也是如此。当然,每个值都返回 0.0 到 1.0 范围内的归一化值。为了使特定像素颜色值的输出更容易,在 IM v6.3.0 中也添加了一个 '%[pixel:...]
' 转义符。此运算符对每个图像的每个通道调用一次给定的 FX 表达式,并将返回值格式化为 IM 可以处理的颜色参数。
magick -size 300x100 gradient:yellow-limegreen \ -gravity NorthWest -annotate 0 '%[pixel:s.p{0,0}]' \ -gravity Center -annotate 0 '%[pixel:s.p{0,50}]' \ -gravity SouthEast -annotate 0 '%[pixel:s.p{0,99}]' \ annotate_pixel.gif |
![[IM Output]](annotate_pixel.gif)
-format
" 选项与 "identify
" 命令直接输出结果。
|
![]() |
pi
' 使用。您可以生成随机数。例如,要生成一个介于 -5 到 10(包含 -5 和 10)之间的整数。这里我使用 "info:
",它等价于 "magick identify
" 命令。
|
![]() |
以上所有操作实际上都会对当前图像序列中的每个图像运行 "
-format
" 命令,以及任何包含的 FX 表达式。 "-print
" 运算符的工作方式与 "-identify
" 类似,但它只运行一次,并且可以访问当前图像序列中的所有图像。使用此运算符,您可以使用 'u[{i}]
' 访问任何图像的值,这与上面提到的不同。Fx 表达式可以应用于其他颜色空间的图像,因此我可以例如找出三种不同颜色的 '色相' 值(在 '红色' 通道中)。
|
![]() |
gold
'、'yellow
' 和 'khaki
' 的平均颜色。
|
![]() |
|
![]() |
-print
" 打印信息。这仅对整个图像序列应用一次。这意味着您可以使用此运算符计算涉及多个图像的更复杂的 '%[fx:...]
' 表达式。 访问其他图像中的数据
然而,使用 FX 转义表达式存在一个严重的问题。当您创建图像时,IM 无法直接访问当前图像序列中的其他图像。在典型的图像创建过程中,通常不需要这样做,因为新图像通常不依赖于以前内存中的图像。基本上,如果您想获取不同图像中特定像素的颜色(如上所示),或者正在创建新图像,那么 IM 核心函数与所需信息没有直接关联。例如,如果您尝试使用内置 "rose:
" 图像像素 12,26(一个蓝色的像素)的颜色创建标签,则直接方法将失败!
|
![]() |
|
![]() |
option:
' 标签告诉 "-set
" 选项,您希望将给定的设置保存为全局 工件,而不是作为图像 '属性' 或 '特性' 字符串,就像 "-define
" 一样。但是,"-set
" 形式允许您在设置 工件 时扩展 百分比转义符,而 "-define
" 则不允许。当 "label:
" 运算符扩展其百分比转义符时,首先会查找给定的 '键' 作为每个图像的 '属性' 或 '特性',但如果找不到任何内容,则会查找全局 工件 设置中的 '键'。因此,即使在创建 工件 时该图像不再存在,也会使用我们从前一个图像创建的全局 '工件'。基本上,'工件' 设置在 "magick
" 命令的生命周期内是全局的,因此可用于将信息从一个图像传递到另一个图像。对于编程 API,可以避免这种情况,因为您可以直接从图像中读取所需的数据并自己生成标签字符串,而无需 IM 以如此复杂的方式存储这些信息。评估和函数,自由形式通道修改器
因为 FX 运算符 是一个解释型表达式处理器,所以添加了 "-evaluate
" 运算符,以便您可以更快地进行简单的图像修改。后来,在 IM v6.4.8-8 中添加了一个更复杂的 "-function
" 运算符,以允许在复杂的图像调整中具有更大的灵活性。这两个运算符以及其他 图像级别调整运算符(例如 "-negate
"、"-level
")可能最适用于对灰度图像进行微调,然后再应用这些图像。尤其是在用于 背景去除、高光和阴影叠加 以及 图像映射 生成和微调的灰度图像中。Evaluate,简单的数学运算
"-evaluate
" 运算符基本上是 "-fx
" 运算符的快速但非常简单的版本(实际上比它添加到 IM 中早了几个月)。但是,它仅限于使用单个用户提供的常数值进行一项简单操作。您可以使用以下命令找出哪些函数已内置到 evaluate 中:
magick -list evaluate |
add
'、'subtract
'、'multiply
' 和 'divide
'。针对常数值。与 -fx
运算符不同,这些值不会规范化为 0 到 1 的范围,而是保持图像的真实颜色值。因此,在 Q8 IM 中减去 50 的值(请参阅 质量和深度 将导致大幅减小,但对于 Q16 版本的 IM,它只会是一个很小的、几乎不可察觉的变化。但是,如果您在参数中添加了 '%',则该参数将表示最大颜色值的百分比(称为 'QuantumRange
',等于 ('2quality-1
')。这意味着您可以通过适当使用百分比来使 "-evaluate
" 参数与 IM 质量级别无关,适用于相应的 evaluate 方法。 例如,只需简单地将图像中的所有颜色值替换为 50% 的灰色级别非常简单且快速,使用 'Set
'
|
![]() |
-evaluate
" 运算符还包括典型的数学函数 'add
'、'subtract
'、'multiply
' 和 'divide
'。 例如,要将图像的对比度减半,您可以将其 'divide
' 除以 '2
',然后 'add
' 加 '25%
' 以将其重新居中到完美的灰色。
|
![]() |
u/2+.25
' 的 "-fx
" 运算符快几个数量级。因此,如果可能,您应该优先使用此运算符而不是 "-fx
"。 "-evaluate
" 的主要问题是所有结果都被剪裁到 0 到 'QuantumRange
' 的限制内(除非您使用的是 HDRI 版本的 ImageMagick),因为每个修改后的值都会保存回图像数据中。这意味着在任何单独的 "-evaluate
" 操作之后,值可能会被 'QuantumRange
' 剪裁。 因此,如果您尝试直接应用对比度增强函数(相当于 "-fx '2*u-.25'
"),您将无法获得正确的结果,因为在进行减法之前,加倍的值将被剪裁。
|
![]() |
multiply
' 将所有较大的颜色值剪裁到最大值,然后 'subtract
' 将剪裁下限值。结果是对上限的错误剪裁,产生暗淡和颜色失真的结果。 直接解决方案是首先 'subtract
' 减去适当的常数(对下限进行最终但正确的剪裁),然后再进行乘法,有效地使用等效公式 '(u-.125)*2
'
|
![]() |
-evaluate
" 方法时,请注意颜色值剪裁。"
-evaluate
" 运算符与 "-fx
"(以及大多数其他低级 IM 运算符)一样受 "-channel
" 影响。这允许您分别控制图像的 alpha 透明度与颜色通道。是的,与 "-fx
" 一样,透明度被视为 'alpha 值',而不是 '蒙版' 值。例如,要使图像透明 50%,作为 溶解 类型操作的一部分。
|
![]() |
-evaluate
" 通常更容易。例如,这里我使用它来进行快速但不寻常的灰度化。基本上,我将每个通道乘以适当的数量,然后将这些通道分离并加在一起,以生成使用特定颜色比例进行灰度化的图像。
|
![]() |
Evaluate 数学函数
除了评估操作,ImageMagick 还包含一组特殊用途的数学函数。这些函数通常使用归一化的颜色值(0 到 1 的范围),输出结果也进行归一化,以适应图像的完整颜色范围。 S形对比度 函数也是这种数学函数拟合的一个例子。幂运算
例如,“Pow
” 函数(从 IM v6.4.1-9 版本开始添加)使用归一化的颜色值,允许用户修改图像亮度。它与 C 函数 pow() 完全等效,(使用 0 到 1 范围内的归一化颜色值)。value = pow(value, constant)因此,要创建“抛物线”渐变,可以使用参数“
2
”。或者使用值“0.5
”来创建“平方根”渐变。例如……
magick -size 20x600 gradient: -rotate 90 gradient.png magick gradient.png -evaluate Pow 2 eval_pow_parabola.png magick gradient.png -evaluate Pow 0.5 eval_pow_sq_root.png |
![[IM Output]](gradient.png)
![[IM Output]](eval_pow_parabola.png)
![[IM Output]](eval_pow_sq_root.png)
![[IM Output]](gradient_pf.gif)

![[IM Output]](eval_pow_parabola_pf.gif)
![[IM Output]](eval_pow_sq_root_pf.gif)
![]() ![]() |
下面三个图像显示了生成的渐变的曲线图和原始图像本身。这使得更容易看出一个渐变图像是如何修改成另一个的。它是使用 Gnuplot 图形绘制程序生成的,通过 IM 示例中的脚本“im_profile ”,位于 Scripts 目录。 |
-gamma 2
” 操作相当于“-evaluate pow 0.5
” 或“平方根”操作函数。类似地,“-gamma 0.5
” 等于使用“-evaluate pow 2
”进行平方。通过一些特殊的渐变操作,您可以使用此方法将线性渐变转换为复杂的圆弧。
![]() |
![]() |
sqrt(1-u^2)
'。这生成一个四分之一圆弧,然后进行 翻转 和 拼接,以生成一个半圆弧。它也比使用 FX 表达式 快得多,即使它需要更多单独的(更小的)步骤。另请参阅更高级的 多项式函数。 对数运算
“Log
” 函数(从 IM v6.4.2-1 版本开始添加)也使用归一化值(添加 1.0 以避免无穷大),其中给定的常数用作对数底数。实际公式(使用归一化值)如下……value = log(value*constant+1.0)/log(constant+1.0)例如...
![]() |
![]() |
Log
” 在接近“0
” 时会产生明显的斜率,而“Pow
” 会产生垂直斜率。该值控制斜率。对数函数也与指数函数密切相关,指数函数目前仅作为 S形对比度调整 操作符实现。它包含与上面对数曲线中相同的斜率特征。这解释了为什么“-sigmoidal-contrast
” 是一种比 伽马校正 或“幂运算”曲线更适合增强低光照条件下图像的技术。 正弦和余弦运算
从 IM v6.4.8-8 版本开始添加了“sin
” 和“cos
” 方法。这些方法获取图像中给定的值并将其归一化为角度,因此完整范围将覆盖一个完整的圆形角度。结果给出一个 50% 的偏差并缩放以再次适应正常的值范围。常数用作值的乘数(以及角度),因此“N” 表示该函数将在整个值范围内绕圆旋转“N” 次。具体来说,它定义了这些函数(使用归一化值)如下……value = 0.5 * sin( constant*value*2*PI ) + 0.5 value = 0.5 * cos( constant*value*2*PI ) + 0.5从本质上讲,这些函数的作用是将图像值(通常是灰度值)重新映射到正弦/余弦曲线。例如,这里我取一个渐变图像并使用这些评估方法对其进行修改。
magick gradient.png -evaluate sin 1 eval_sin_1.png magick gradient.png -evaluate cos 1 eval_cos_1.png |
![[IM Output]](eval_sin_1.png)
![[IM Output]](eval_cos_1.png)
![[IM Output]](gradient_pf.gif)

![[IM Output]](eval_sin_1_pf.gif)
![[IM Output]](eval_cos_1_pf.gif)
![]() |
![]() |
![]() |
![]() |
-evaluate
” 方法很少使用,因为它们已被更通用的 正弦函数(见下文)所取代,该函数提供了更多控制选项,超越了简单的频率选项。Function,多参数 Evaluate
上述波形生成器被证明非常有用,尤其是在 图像扭曲映射 中。但人们发现需要对函数进行更精细的控制,需要多个参数。因此,在 IM v6.4.8-9 版本中添加了“-function
” 操作符。基本上,“-function
” 是“-evaluate
” 的多参数形式。但是,与 评估操作符 不同,这些操作符与数学操作符一样,所有上述函数仅作用于图像的归一化通道值(0.0 到 1.0 范围),这在大多数情况下使它们更容易使用。 多项式函数
“polynomial
” 方法将接受任意数量的值,并根据给定的精确表达式修改图像中的颜色值,速度比 FX 操作符 快得多。-function Polynomial a,b,c,...
4,-4,1
” 将生成等效于“-fx
” 表达式“4*u^2 - 4*u + 1
” 的多项式表达式。如果您了解高中数学,那么您应该知道此多项式函数会生成一个抛物线曲线,在输入('u
')颜色范围 0.0 到 1.0 内从 1.0 到 0.0 再回到 1.0。也就是说,它将使黑色和白色颜色变为“白色”,并将完美的灰色变为“黑色”。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Polynomial
” 执行完整的 阈值 操作,因为需要无限个系数才能执行此操作,尽管您可以非常接近。单个值自然只是一个常数,并导致直接分配该值。换句话说,它就像“-evaluate Set
” 方法一样,在这种情况下为 33% 的灰色值。
![]() |
![]() |
Polynomial
” 与其他数学函数结合使用,您可以创建更复杂的渐变修改。例如,通过取多项式的平方根,我可以在一个线性渐变上创建一个真正的圆弧。等效的“-fx
” 表达式“sqrt( -4*u^2 + 4*u + 0 )
”……
![]() |
![]() |
正弦函数
“Sinusoid
” 函数方法是“-evaluate
” 方法“sin
” 和“cos
” 的更高级版本,实际上可以复制这些函数,但您可以更好地控制它如何修改图像中的颜色值。-function Sinusoid frequency,phase,amplitude,bias
value = ampl * sin(2*PI( freq*value + phase/360 ) ) + bias这看起来可能很复杂,但它确保了函数易于使用。只需要第一个值“频率”,其工作方式与上面完全相同,所有其他参数都是可选的。默认情况下,它将生成一个正弦曲线。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
0.75 ±0.25
或0.5 到 1.0
),从白色开始并以白色结束。
![]() |
![]() |
反正弦函数
反正弦函数“Arcsin
” 已添加到 IM v6.5.3-0 版本中。这是一种特殊的曲线,需要用于生成 圆柱体位移图。它的参数是……-function Arcsin width,center,range,bias
value = range/PI * asin(2/width*( value - center ) ) + bias默认值(如果未定义)“
1, 0.5, 1, 0.5
” 确保该函数居中,以便覆盖从0,0
到1,1
的整个颜色范围。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
偏差 ±范围/2
”,正如您所期望的那样。请注意,如果“宽度” 或“范围” 为负数,则由于该负值,函数的斜率将被翻转。
![]() |
![]() |
反正切函数
“Arctan
” 方法已添加到 IM v6.5.3-1 版本中。它的参数是……-function Arctan slope,center,range,bias
value = range/PI * atan(slope*PI*( value - center ) ) + bias如您所见,它与“Arcsin” 函数几乎完全相同,只是做了一些小的改动以使其更有用。它甚至具有相同的默认值集(如果未定义)“
1, 0.5, 1.0, 0.5
”。这意味着,如果您指定“1.0
” 的斜率值,则直方图变化的斜率将在纯灰色周围产生 1:1 的变化(无缩放),同时使白色和黑色变为更灰色的值。例如
![]() |
![]() |
![]() |
![]() |
Arctan
” 函数永远不会真正达到纯黑色和白色的输出范围限制。它将接近这些限制,但永远不会越过它们。与前面的函数(以及 S形对比度)类似,第二个参数将调整曲线相对于输入渐变值的位置。
![]() |
![]() |
![]() |
![]() |
Arctan
”渐变函数来创建一条曲线,该曲线将非常快地接近特定值,但不会超过该值。正是这些限制值由“range”和“bias”参数控制。例如,此曲线将修改图像中的渐变,以在 0.7 的输入灰度级周围产生非常锐利的阈值,但值在 0.5 和 1.0 的范围限制之间变化。
![]() |
![]() |
渐变图像上的数学运算
现在,上述函数为渐变图像提供了一些非常基本的变换。但是,如果您想对两个或多个渐变图像进行一些数学运算怎么办?也就是说,使用另一个图像的渐变修改一个渐变。为此,您需要使用特殊的数学合成方法(例如“Plus
”和“Divide
”)。但是,在我们开始之前,我想给您一个警告。如果您的渐变图像是纯灰度图像,没有 Alpha 通道,那么您可以直接使用数学合成方法。但是,如果您想将这些方法限制在特定通道,或将其应用于 Alpha(透明度)通道,则需要确保设置了适当的“-channel
”设置,并且没有特殊的“Sync
”通道标志。有关更多详细信息,请参阅使用图像合成进行图像数学运算。通常,使用数学合成方法并不是那么困难。当您具有也包含“偏差”的渐变时,就会出现复杂情况。也就是说,渐变应在“50% 灰色”处表示“零”值,并在 -1(黑色)到 +1(白色)之间覆盖一个范围。此类图像通常用于失真图像映射。因此,对“带偏差的渐变”进行数学运算才是真正的问题,我们将在本文中更具体地讨论这个问题。衰减带偏差的渐变
例如,这里我想创建一个正弦波,但它最初很小,然后幅度变大。这称为“衰减”带偏差的渐变。或者换句话说,将带偏差的渐变乘以另一个绝对渐变。这也是诸如调幅广播中的“幅度调制”的工作原理!因此,我们首先需要一个正弦波,我们可以简单地从线性渐变中生成它……
magick -size 5x300 gradient: -rotate 90 math_linear.png magick math_linear.png -evaluate sine 12 math_sine.png |
![[IM Output]](math_linear_pf.gif)

![[IM Output]](math_sine_pf.gif)
magick math_linear.png -negate -evaluate divide 2 math_bias.png magick math_sine_2.png math_bias.png \ -compose Plus -composite math_attenuated.png |
![[IM Output]](math_sine_2_pf.gif)

![[IM Output]](math_bias_pf.gif)

![[IM Output]](math_attenuated_pf.gif)
当然,您可以将整个过程都放在一个命令中,并且它也不必是简单的线性衰减。例如,这里我使用取反的余弦波而不是线性渐变来衰减高频正弦波。
magick math_linear.png -evaluate cos 1 -negate math_cosine_peak.png magick math_sine.png math_cosine_peak.png \ \( -clone 0,1 -compose multiply -composite \) \ \( -clone 1 +level 50%,0 \ -clone 2 -compose plus -composite \) \ -delete 0--2 math_cosine_atten.png |
![[IM 输出]](math_sine_pf.gif)
![[IM 输出]](math_cosine_peak_pf.gif)

![[IM 输出]](math_cosine_atten_pf.gif)
Sc*Dc-.5*Sc+.5
或参数“1,-.5,0,.5
”。
|
![]() |
|
![]() |
乘以有偏渐变
但是如果两个函数都存在偏差,因此完美的灰色表示零,黑色和白色表示 -1 到 +1 的范围呢?好吧,这有点复杂,因为您不能只是将它们相乘并期望得到正确的结果,因为乘法可能包含负值。这需要小心,以确保您最终不会裁剪值并获得结果图像中曲线的正确取反。诀窍是将乘法分解成多个步骤。也就是说A × B
也可以写成 A × abs(B) × sign(B)
。通过这样做,您避免了乘以负值,这无法存储在正常的渐变图像中。因此,我们需要做的就是取其中一个偏差渐变并将其分成两部分,以便它们可以适当地应用于另一个渐变。“sign()
”带偏差的渐变,或获取哪些部分为负的掩码,可以通过在偏差级别对渐变使用阈值来提取。您可以稍后使用合成差和该阈值图像选择性地取反另一个渐变。“abs()
”带偏差的渐变可以使用Solarize轻松提取,然后取反并加倍(使用Level)以获得从 0.0 到 1.0 的渐变的绝对值。由于我们还需要将偏差偏移作为乘法的一部分(如上所述衰减),因此您可以在将其转换为渐变的绝对值之前,直接使用取反且缩放一半的 Solarize 输出。因此,让我们将一个渐变转换为这三个组成部分。
magick math_cosine_peak.png -threshold 50% -negate math_m_sign.png magick math_cosine_peak.png -solarize 50% math_m_bias.png magick math_m_bias.png -level 50%,0 math_m_abs.png |
![]() |
渐变的符号 白色 = 负数 |
|
![]() ![]() |
![]() |
偏差偏移 |
![]() |
绝对值 | |
magick math_sine.png math_m_abs.png \ -compose Multiply -composite math_m_1.png magick math_m_1.png math_m_bias.png \ -compose Plus -composite math_m_2.png magick math_m_2.png math_m_sign.png \ -compose Difference -composite math_multiply.png |
![]() |
![]() |
![]() ![]() ![]() |
![]() |
![]() ![]() ![]() |
|
符号 |
![]() ![]() ![]() |
|
magick math_sine.png math_cosine_peak.png \ \( -clone 1 -threshold 50% -negate \) \ \( -clone 1 -solarize 50% \) \ \( -clone 3 -level 50%,0 \) \ \( -clone 0,4 -compose multiply -composite \ -clone 3 -compose plus -composite \ -clone 2 -compose difference -composite \) \ -delete 0--2 math_multiply_2.png |
![[IM Output]](math_sine_pf.gif)

![[IM Output]](math_cosine_peak_pf.gif)

![[IM Output]](math_multiply_2_pf.gif)
2*Sc*Dc-Sc-Dc+1
,因此从 IM v6.5.4-3 开始,您可以使用参数“2,-1,-1,1
”将上述复杂步骤实现为单个“Mathematics
”合成方法。
|
![]() |
Exclusion
”合成方法的否定。奇怪但真实。因此,以下内容也将生成相同的零偏差乘法。
|
![]() |
添加有偏渐变
随着“Mathematics
”合成方法的出现,添加偏差渐变也相对容易。等效的 FX 公式为“u+v-0.5
”或合成参数“0,1,1,-.5
”。例如,以下是傅里叶变换示例,我手动生成了它,需要添加 3 个带偏差的正弦波和一个常数直流值。
magick math_linear.png -function sinusoid 3.5,0,.25 wave_1.png magick math_linear.png -function sinusoid 1.5,-90,.13 wave_2.png magick math_linear.png -function sinusoid 0.6,-90,.07 wave_3.png magick wave_1.png wave_2.png wave_3.png -background gray40 \ -compose Mathematics -set option:compose:args 0,1,1,-.5 \ -flatten added_waves.png |
![[IM Output]](wave_1_pf.gif)

![[IM Output]](wave_2_pf.gif)

![[IM Output]](wave_3_pf.gif)

![[IM Output]](added_waves_pf.gif)
-flatten
”运算符和“-background
”设置来实现多图像合成。或者在这种情况下,所有给定图像加上背景常数的“带偏差的总和”。频率调制
通过将函数直接应用于另一个函数的输出,您不会产生简单结果。原因是所有这些数学函数都应用于各个像素的渐变“值”,而不是针对渐变中像素的 x 值。例如……
![]() |
![]() |
cos( 8 * sin( {value}/2 ) )


Miscellaneous Image Transformation Techniques. These have not been exampled yet, but are some basic IM developed transforms that may provide useful. If you have an interesting effect please contribute. pixelize an image resize an image down 10 then scale the image 10 to produce blocks of roughly averaged color. For example... magick input.jpg -resize 10% -sample 1000% output.jpg De-skew slightly rotated images -deskew {threshold} straighten an image. A threshold of 40% works for most images. Use -set option:deskew:auto-crop {width} to auto crop the image. The set argument is the pixel width of the image background (e.g 40). Programmically we auto crop by running a median filter across the image to eliminate salt-n-pepper noise. Next we get the image bounds of the median filter image with a fuzz factor (e.g. -fuzz 5%). Finally we crop the original image by the bounds. The code looks like this: median_image=MedianFilterImage(image,0.0,exception); geometry=GetImageBoundingBox(median_image,exception); median_image-DestoryImage(median_image); print(" Auto-crop geometry: %lux%lu%+ld%+ld", geometry.width,geometry.height, geometry.x,geometry.y); crop_image=CropImage(rotate_image,&geometry,exception); See Trimming 'Noisy' Images Segmentation look at scripts divide_vert segment_image for some simple scripts I wrote to segment well defined images into smaller parts. I hope to get simple segmentation functions like this into the core library, to allow for things like automatic sub-division of GIF animations, and seperating images and diagrams from scanned documents.