ImageMagick 示例 --
蒙版
- 索引
-
ImageMagick 示例前言和索引
-
Alpha(遮罩)通道
- 内部遮罩通道
-
Alpha 通道操作符
-
Off
(或-alpha off
),Set
(或-alpha set
),On
,
Activate
,
Discrete
,
Opaque
,Transparent
,Extract
,Copy
,
Shape
,Remove
,Background
-
- 移除图像的透明度
- 布尔 Alpha 透明度
- 轮廓或光晕透明度
-
使用蒙版与图像
- 编辑图像蒙版
- 蒙版作为彩色形状
- 数学合成
- 蒙版 Alpha 合成
- 对齐两个蒙版图像(正在建设中)
-
特殊图像蒙版
-
区域和区域子图像
-
背景移除
-
填充孔洞 (正在建设中)
Alpha 通道
图像的透明度(alpha)通道是完全可选的,通常需要与普通“颜色”通道分离的特殊处理。请参见上文的图像颜色空间。透明度通道的存在也会影响各种操作符如何处理其他颜色通道,通常是因为完全透明的颜色通常应该被操作完全忽略。如果不是这种情况,图像周围会出现“黑色光晕”,例如在 IM v6 的早期 IM 错误中出现的情况。例如,调整大小光晕错误和模糊与透明度错误。更糟糕的是,此通道有时也被称为图像的“透明度”或“不透明度”通道,甚至被称为图像的“蒙版”。然而,所有这些都指的是图像的相同特殊第四通道。![[IM 输出]](../images/moon.png)
我可以通过将图像叠加在 IM 内置的棋盘格模式上,使用Alpha 合成来演示这种透明度。
|
![]() |
内部 Alpha 通道
现在,在内部,IM v7 将透明度信息存储在一个“alpha”通道中,该通道与颜色通道一样,只是一个普通的灰度图像,其值从白色(完全透明或清晰)到黑色(完全不透明)。它有点像您观察原始图像轮廓时会得到的效果。低级操作符,例如“-level
”和“-threshold
”,将数据处理为 alpha。如果您不确定,请查看官方选项参考。这是一种非常古老的方法,用于从图像中提取“alpha”透明度值。它将透明度通道保存为“alpha”图像文件格式,并且需要两个单独的步骤和命令来定义正确的图像文件格式。
控制图像透明度有两个操作符可以让您对内存中图像的透明度通道进行低级控制。较新的操作符“-alpha ”方法现在是推荐的控制方法,尽管许多 IM 示例仍然显示和使用旧的操作符“-alpha ”。图像不仅可以具有 alpha 通道数据,而且还具有一个“开关”,该开关定义通道数据是否可见或有效。这意味着图像在 alpha 通道方面可以有三种状态。
-compose CopyOpacity -composite ”将始终在生成的图像中打开 alpha 通道,因为它是操作符的工作,将数据复制到 alpha 通道。因此,它必须存在于最终结果中。但是,它在输入数据中的存在可能会产生其他后果。有关更多详细信息,请参阅复制不透明度合成方法。类似地,使用颜色“None ”创建画布也会自动创建和启用透明度通道,以确保空白图像确实是透明的。另一方面,使用某些其他颜色名称创建画布通常不会创建任何透明度通道,因为默认情况下图像是不透明的。以下是各种“ -alpha ”方法及其对图像及其透明度的影响示例。 Alpha Off或"这只是一个简单的图像开关,它会关闭透明度对图像的任何影响。它实际上不会删除或破坏附加到图像的 alpha 通道,它只是关闭该通道对图像的任何影响。同样,在关闭后,没有操作符会影响附加的 alpha 通道。例如,让我们使用“月牙”图像(来自复制不透明度合成示例),并简单地关闭图像 alpha 通道。请注意,当透明度关闭时,月球形状完全消失了,但这实际上很少见。基本上,即使是“透明”区域也具有颜色,只是通常不可见,在这种情况下,隐藏的颜色是用于创建月球图像的的分形画布图像。这种隐藏的颜色可以是任何东西,从简单的GIF 透明度颜色(GIF 格式使用该颜色在其颜色表中表示透明度)到在图像创建过程中留下的垃圾颜色,如上所述。更典型的是,对于任何完全透明的像素,透明度颜色只是纯黑色。请注意,靠近边缘的像素可能是半透明的,因此仍然具有仅部分可见的有效颜色。上面的“ |
|
![]() |
|
![]() |
启用 Alpha
“-alpha On
”与之前看到的 禁用 Alpha 方法正好相反。通常,这对于您想要的用途来说过于简单,因此应极少使用。在几乎所有情况下,您都应该使用“-alpha Set
”。基本上,“On
”方法只是翻转开关,以便图像透明度数据再次可见。任何现有的透明度数据都不会被修改,因此,如果内存中的图像仍然保留一些旧的 alpha 通道数据,那么这些数据将突然再次可见。例如,这里我们将透明度数据设置为“Off
”,然后立即将其恢复为“On
”,重新生成原始图像。
|
![]() |
Alpha On
唯一应该使用的时间是,当您之前有目的地关闭 alpha,现在想要恢复该数据时。例如,关闭然后打开 alpha 通道可用于在应用某些非常具体的操作符(如“-shade
”)之前保留 alpha 通道数据。有关此特殊用法的示例,请参见 阴影形状图像。
激活/停用 Alpha
分别启用和禁用 alpha 通道,并具有持久性。这类似于 Imagemagick 6 中的开/关。在 Imagemagick 7 中,-alpha off 将永久删除 alpha 通道,因此 -alpha on 将不会重新启用它。
离散 Alpha
独立处理 alpha 通道(不进行混合)。Alpha 不透明
此方法不仅确保 alpha 通道处于“活动”状态,而且还确保它完全不透明,无论图像是否已激活/打开或停用/关闭透明度。例如……
|
![]() |
-alpha off
”关闭 alpha 通道,然后使用“-alpha on
”打开它,同时将其重置为不透明。
|
![]() |
-alpha off -alpha set
”,但您也可以在这种情况下使用“-alpha opaque
”。 Alpha 透明
类似地,这确保 alpha 通道处于“活动”状态,但也完全透明。
|
![]() |
|
![]() |
提取 Alpha
“Extract
”方法将简单地复制图像的“alpha”蒙版作为灰度通道蒙版。请注意,完全不透明为白色,而完全透明为纯黑色。由于图像沿边缘包含一些半透明像素(用于反锯齿,使图像形状更平滑),因此此图像不是纯黑白色,而是在边缘周围也包含一些灰色的像素。如果您的 ImageMagick 是旧版本的 IMv7,则这是一种(近似)等效的技术,使用通道提取。
magick moon.png -channel a -separate +channel -negate alpha_extract.png |
Extract
”方法还会将 alpha 设置为“Off
”,但它不会被清除,因此将 alpha 通道恢复为“On
”将重新创建原始图像的形状蒙版。
|
![]() |
|
![]() |
复制 Alpha
“Copy
”方法是“Extract
”的逆运算,本质上是对自身执行 CopyOpacity。也就是说,它将把灰度图像(无论其 alpha 通道是否已启用)转换为形状蒙版图像。图像是否存在 alpha 通道并不重要,它只根据图像灰度值创建图像透明度。创建形状蒙版后,您可以使用各种 颜色着色 或 Duff-Porter alpha 混合方法对其进行着色。有关使用形状蒙版的示例,请参见 蒙版作为彩色形状。 Alpha 形状
为了更方便地使用灰度图像,“Shape
”方法不仅创建形状蒙版(如 Alpha Extract 所示),而且还会使用当前背景颜色对其进行着色。这意味着您可以通过对图像进行整形,然后将其扁平化到不同的背景颜色上,来快速对灰度蒙版进行着色。
|
![]() |
![]() ![]() |
背景实际上不是此“形状”着色操作的正确颜色。它应该使用“填充”颜色来设置形状的前景颜色。因此,应该使用哪种颜色可能会发生变化。背景仅由于访问当前填充颜色的内部困难而使用。此更改可能会在 IMv7 中发生。 |
|
![]() |
![]() ![]() |
以上将使用线性颜色空间映射颜色,可能需要在某个时刻转换为 sRGB 以获得更视觉上正确的颜色渐变。 |
删除 Alpha
“-alpha Remove
”方法(添加到 IMv7.7.5 中)旨在使用当前“-background
”从图像中删除透明度。
|
![]() |
Alpha 背景
从 IM v6.5.2-10 开始,提供了“Background
”方法,它将完全透明像素的隐藏颜色设置为当前背景颜色。通常,这种颜色无关紧要,因为只有在 alpha 通道 关闭 时才能看到它。但是,完全透明像素的颜色保存在 PNG 图像文件格式中,对于大型图像,具有随机未知的完全透明颜色会显着影响其压缩处理。有关更多详细信息,请参见 具有更好压缩的 PNG 以及 IM 论坛讨论 消除 alpha 通道垃圾。请注意,没有应用颜色混合,只是直接将颜色分配给任何完全透明的颜色。但是,像素仍然保持完全透明,因此您不会看到图像有任何变化。例如,这里我用它将所有完全透明的像素设置为“HotPink ”。
|
![]() |
如您所见,这并没有改变图像的实际外观。为了查看更改,我们现在将 关闭 alpha 通道。
|
![]() |
这与 删除透明度 不同。
形状的边缘将使所有半透明像素不透明,从而产生一些强烈的锯齿(阶梯式)边缘效果。请注意,即使是通常仅不透明的 PNG24 格式,如果所有完全透明的颜色相同,它仍然可以保存布尔透明度。有关详细信息,请参见 PNG 子格式 中的示例。此替换颜色的过程实际上几乎等同于执行“-channel RGB -fill color -opaque None +channel
”。请参见 直接颜色替换。请注意,许多其他图像处理操作符也将将任何完全透明的像素魔术化为完全透明的黑色(颜色“None
”),因为这等效于数学零的颜色。以下是已知执行此操作的一些图像操作的摘要,但没有一个像使用此操作符那样直接或快速。
magick moon.png \( +clone -alpha off \) \ -compose SrcIn -composite moon_black.png magick moon.png -channel RGBA -blur 1x.000000001 moon_black.png magick moon.png -channel RGBA -gaussian 1x0 moon_black.png magick moon.png -fuzz 0% -transparent none moon_black.png |
None
”),还可以将所有接近完全透明的颜色(否则具有有效的但实际上不可见的颜色)设置为完全透明黑色,只需指定模糊因子即可。这将产生一些数据丢失,但可能会改善具有大量接近完全透明颜色的图像的压缩。通常,这些几乎完全透明的像素可能具有非常奇怪或错误的颜色,而此方法将允许您在它们导致其他问题之前删除这些奇怪的像素。 从图像中删除透明度
虽然 禁用 Alpha 只会翻转开关并关闭透明度通道,但如果您尝试将图像保存为不允许使用透明度的文件格式,也可以获得相同的效果。例如,保存为 JPEG……
magick -size 70x60 xc:none -font Candice -pointsize 50 \ -fill Black -annotate +10+45 'A' -channel RGBA -blur 0x5 \ -fill white -stroke black -draw "text 5,40 'A'" a.png magick a.png a.jpg |
![[IM Output]](a.png)

![[IM Output]](a.jpg)
|
![]() |
去除透明度的另一种方法是,以某种方式生成一个新的“背景”或“画布”图像,并将您的图像 叠加 到该背景上,以替换透明度。最好同时保留原始图像的元数据,例如可能存在的配置文件、标签、标题和注释。生成此类画布的方法示例在 创建相同大小的图像画布 中。以下是一种方法...
|
![]() |
|
![]() |
mogrify
”或多个图像的序列无效,主要是因为“-flatten
”操作员实际上是为将多个图像合并为单个图像而设计的。另一种适用于多个图像的常用方法是为图像提供一个大小为零的 边框,并使用相应的“-bordercolor
”。例如...
|
![]() |
composite
”命令将图像“放置在”原始图像下方(使用 平铺)(使用 Dst_Over)。这种构图方法可以确保原始图像的元数据和大小得到保留。
|
![]() |
![]() ![]() |
上面提到的许多方法,要么会受到虚拟画布信息的影响,要么会破坏图像可能具有的任何虚拟画布信息,作为其处理的一部分。在涉及虚拟画布时,您可能需要更仔细地查看各个操作员的详细信息。在许多情况下,虚拟画布的影响对您的整体图像处理非常有用。 |
布尔 Alpha 透明度
对于某些图像文件格式,您不需要完全删除 alpha 通道,只需允许纯开/关或布尔透明度即可。索引(调色板)图像文件格式,例如 GIF 和 PNG8,就是这种情况的典型代表。当前示例在 GIF 布尔透明度 中进行了查看,但最终应该移到这里。轮廓或光晕透明度
有时您希望在包含透明度的图像周围添加轮廓。一种方法是使用 EdgeOut 形态学 快速获取原始图像的所有相邻像素,对它们进行着色,然后 在下面(DstOver)构图 它与原始图像。
magick knight.png \( +clone \ -channel A -morphology EdgeOut Diamond +channel \ +level-colors red \ \) -compose DstOver -composite knight_outlined.png |
![[IM Output]](../images/knight.png)

![[IM Output]](knight_outlined.png)
|
![]() |
使用图像蒙版
蒙版图像
如前所示,有两种方法可以蒙版图像,以便使图像的一部分透明。您选择的方法取决于您的图像蒙版是灰度蒙版还是形状蒙版。编辑图像蒙版
图像的蒙版是一个非常有用的东西。例如,我们可以通过修改原始图像的蒙版来非常轻松地擦除图像的部分。请记住,“-draw
”操作符无法绘制任何内容,并且目前没有擦除选项。在这里,我们创建一个图像,然后通过提取和修改其蒙版,在将其恢复到原始图像之前。
magick -size 100x100 xc:none -stroke black -fill steelblue \ -strokewidth 1 -draw "circle 60,60 35,35" \ -strokewidth 2 -draw "line 10,55 85,10" drawn.png magick drawn.png -alpha extract mask.png magick mask.png -fill black -draw "circle 40,80 60,60" mask_bite.png magick drawn.png mask_bite.png \ -alpha Off -compose CopyOpacity -composite \ drawn_bite.png |
![[IM Output]](drawn.png)

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

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

![[IM Output]](drawn_bite.png)
-alpha Off
”操作,因为它对于确保灰度图像不包含不需要的透明通道至关重要。瞧,我们在原始图像中咬了一口。我们还可以重新添加我们删除的图像的一部分。例如,在这里我重新添加了从原始图像中删除的“咬”的一部分,方法是在蒙版上绘制白色区域。然后,使用 CopyOpacity 通道合成 将蒙版再次返回到原始图像。
magick mask_bite.png -fill white \ -draw "circle 50,70 60,60" \ -draw "roundRectangle 78,5 98,25 5,5" \ -alpha off mask_bite2.png magick composite -compose CopyOpacity mask_bite2.png drawn.png drawn_bite2.png |
![[IM Output]](mask_bite.png)

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

![[IM Output]](drawn_bite2.png)
SteelBlue
”颜色。如果将图像保存为其他文件格式或进一步修改,则不应依赖此行为。以下是一种从图像中擦除部分的替代方法,但它不是提取和修改灰度蒙版,而是使用形状蒙版作为一种“擦除”工具,使用 DstOut 合成方法。
magick -size 100x100 xc:none -draw "circle 40,80 60,60" mask_shape.png magick drawn.png mask_shape.png -compose DstOut -composite drawn_bite3.png |
![[IM Output]](drawn.png)

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

![[IM Output]](drawn_bite3.png)
蒙版作为彩色形状
除了仅使用蒙版来添加或重新添加图像的透明度外,还可以以各种方式直接将蒙版与图像组合。例如,假设我们只想使用蒙版作为我们想要以各种颜色叠加在图像上的符号或形状。为此,我们需要一个蒙版,我将从一个特殊的“符号”字体中提取出来。
|
![]() |
|
![]() |
![]() ![]() |
请注意,使用“PNG”图像格式作为生成的形状图像,而不是 GIF,以避免 GIF 布尔透明度 方面的问题。 |
|
![]() |
-background
”颜色定义,该颜色由 Combine 用于填充新图像的未定义通道。一种更老但更复杂的方法是使用“CopyOpacity
”合成方法将图像的透明度设置为给定蒙版,然后使用 统一颜色着色 对生成的形状进行着色。这种方法有效,并且长期以来是最佳技术,但现在不再推荐。
|
![]() |
|
![]() |
|
![]() |
数学合成
您可能并不想将蒙版叠加到某个背景上,而只对使用蒙版的白色或黑色部分本身对图像进行着色感兴趣。这相对简单,只需使用一些 数学 Alpha 合成方法 即可更改蒙版的颜色以匹配颜色、平铺或其他图像。例如,“Multiply
”合成方法将用叠加图像替换白色区域(乘以值为 1),同时保持黑色区域(乘以值为 0)为黑色。“Screen
”操作符与“Multiply
”完全相同,但图像被反转,因此它实际上用黑色区域替换图像的黑色区域。例如,让我们使用上面更大的蒙版图像来叠加使用平铺图案生成的更大的图像。
magick mask_bite.png -size 100x100 tile:tile_disks.jpg \ -compose Multiply -composite compose_multiply.png magick mask_bite.png -size 100x100 tile:tile_water.jpg \ -compose Screen -composite compose_screen.png |
![[IM Output]](mask_bite.png)

![[IM Output]](compose_multiply.png)
![[IM Output]](compose_screen.png)
Multiply
” Alpha 合成方法对于替换文本图像的背景(例如:白色背景上的黑色文本)特别有用,例如从 Postscript 文档 生成的图像。 蒙版 Alpha 合成
使用三种图像形式的 蒙版 Alpha 合成 允许您使用相同的蒙版将两张图像直接合并在一起。
|
![]() |
composite
”命令而不是“convert
”,则“覆盖”图像(白色部分)首先给出,其次是“背景”图像(黑色部分)。换句话说,对于该命令,前两个图像需要交换。 对齐两个蒙版图像


On aligning two masked images... If your masks are pure boolean, you should have no problems however you apply them. However masks containing 'anti-aliased', 'gray', or 'semi-transparent' edging to make them 'smooth looking' can be serious headache if you do not handle them properly and with care. The rest of this discussion is on 'anti-aliased' masks. Anti-Aliased Masks which join together come in two styles... * Ones which fit together like jigsaw puzzle pieces OR like a shaped peg into a shaped hole (shared boundary) * Masks that are ment to overlay a solid area (layered) The latter is easy to handle and is the normal effect you get when you overlay some colored shape over a fully-opaque image. Essentially you would use 'over' composition to compose the shape. The former 'jigsaw' masks however is harder. Such masks are not meant to either overlap, or underlap each other. And yet if you try to join them using the obvious and normal 'over' composition you will end up with a semi-transparent join where 'anti-aliased edges' are merged. Example of a bad 'jigsaw mask' join (over) The correct way to join masks and shaped 'jigsaw' images is to use Plus composition to 'add' the images together, with either a black or fully-transparent background. Example of a correct 'jigsaw mask' join (plus) For another example of DIY image joining, using 'Dst-In', 'Dst-Out', and 'Plus' composition, see examples in... https://imagemagick.org.cn/Usage/compose/#dstin I also go though this joining detail in the bug report of 3 image alpha composition Composite Mask Bug - Fixed. For more on the difference between 'over' and 'plus' see 'Blend' (plus) vs 'Dissolve' (over) Examples of correctly joining edge aligned pieces is shown in 3d Cubes - Affine and again in 3d Boxes - Perspective and in Isometric Cube using Shears https://imagemagick.org.cn/Usage/warping/#sheared_cube The Major problems in these examples is that the individual parts were NOT generated using the same mask, but distorted to their final positions. As such they do not quite fit together properly and joined together. These examples need to be updated to use a 'Plus' composition method. To generate improved results, but even then they will still probably not be quite 'right' as the masks do not exactly 'fit' together.
生成正确边缘对齐的蒙版
The best idea is to use the same mask (negated) for BOTH pieces, rather than attempting to draw the two masks separately. Otherwise you have the two masks overlap, OR leave a gap, exactly as you have seen. Correct methods of mask joining.. * use mask to set transparency on one piece use negated mask to set transparency of other piece 'Plus' the two pieces together. * Use mask to Add transparency to just one piece, then 'Over' compose that piece over a complete image. * use a three image masked composition see https://imagemagick.org.cn/Usage/compose/#mask and https://imagemagick.org.cn/Usage/masking/#masked_compose Which uses the mask to select results from two different images. Remember, 'Over' only needs the 'source' or 'overlay' image masked, the background image should not have aligned semi-transparent edges. But a 'plus' composition needs both images masked with and exact negative mask of each other align the joined edge. WARNING: Draw does NOT currently allow you to generate two shapes that will fit together properly without overlap!!!! See Draw Fill Bounds for details. I have not checked SVG to see if it has the same problem.
特殊图像蒙版
写入蒙版 - 保护像素不受更改
“写入”或“剪裁蒙版”是一个特殊的灰度图像,它被添加到大小相同的现有图像中。它定义了图像中要被归类为“不可变”或“不可写”的区域,这些区域受大多数图像处理操作符的影响。操作符“-mask
”将一个外部图像链接到内存中的图像。操作符“+mask
”的“加号”形式从图像中删除蒙版。例如,这里我使用“写入蒙版”来保护背景像素不被写入,同时旋转色调,将前景的红色玫瑰重新着色为蓝色玫瑰。蒙版有点粗糙,但效果很好。请记住,“写入蒙版”用于指定要保护或保留的部分。请记住,在 IMv7 中...
操作符“
有关更高级的示例,请参阅 色度键蒙版,它更多地关于生成蒙版,而不是将其用作写入蒙版。写入或剪裁蒙版旨在在直接修改图像中的像素时工作。例如:否定、级别、颜色着色、调制、绘制、合成、形态学、卷积。对于生成新图像的操作符(调整大小、扭曲、扩展等),它将无法保留原始像素,因为蒙版将无法与新图像大小相对应。此类操作还将具有从图像中移除或取消设置“写入蒙版”的副作用。以下是一个示例...-mask
”定义一个“写入保护”蒙版
magick -size 70x70 xc:red red_image.png magick -size 70x70 xc: -draw 'circle 35,35 30,5' write_mask.png magick red_image.png -mask write_mask.png \ -fill blue -opaque red +mask masked_color_replace.png |
![[IM Output]](red_image.png)
![[IM Output]](write_mask.png)

![[IM Output]](masked_color_replace.png)
这种蒙版的使用实际上正是 合成蒙版 的工作原理!但这仅在应用合成操作符的持续时间内有效。
magick -size 70x70 xc:green green_image.png magick red_image.png green_image.png write_mask.png \ -composite masked_composite.png |
![[IM Output]](red_image.png)
![[IM Output]](green_image.png)
![[IM Output]](write_mask.png)

![[IM Output]](masked_composite.png)
|
![]() |
三张图像“
-composite
”操作使用“写入”蒙版
在形态学中,写入蒙版通常用于生成操作的 条件或约束形态学 形式。IM 讨论论坛中讨论过一个这样的示例,清理文本周围的噪声,以限制膨胀的影响。注意:-crop 应该能够通过裁剪蒙版并将蒙版分配给新图像来保留单个图像的图像蒙版。但是,目前还没有做到。
剪裁蒙版和剪裁路径
此操作符的“-clip-mask
”形式几乎与上述形式完全相同,但只提供布尔(全有或全无)类型的蒙版。因此,您无法获得“混合”或平滑的结果。例如...
|
![]() |
-clip-mask
”不像“-mask
”那样产生混合结果。它的唯一优点是速度稍快(虽然快不了多少)。它最初是为了允许处理 TIFF 图像文件中的剪裁路径 而提供的,是一个非常旧的操作符(IMv5)。应该使用较新的“-mask
”操作符。![]() ![]() |
在 IMv7 中,并排实现了“写入蒙版”和“剪裁蒙版”,尽管从技术上讲,它们执行的功能完全相同。因此,您可以同时应用这两个蒙版。 但是,不建议同时使用这两个蒙版,结果也不确定。此外,这种“布尔蒙版”形式已从 IMv7 中删除。 |
TIFF 图像的剪裁路径
“剪裁路径”是 TIFF 图像文件格式的一部分,它定义了一个矢量路径,用于定义 TIFF 图像内的“形状区域”。在 IM 中,操作符“-clip
”和“-clip-path
”读取此“剪裁路径”并将其转换为 剪裁蒙版(如上)。因此,它定义了一个“写入蒙版”,它将保护形状免遭修改。存储在 TIFF 图像中的剪裁路径被定义为 SVG 路径绘制,您可以使用以下命令从 TIFF 图像文件格式中提取剪裁路径...
magick identify -format '%[8BIM:1999,2998:#1]' image_clip.tiff |
人们经常遇到的最大问题是,将所有未剪裁的部分设置为透明。这需要您写入蒙版写入保护的区域!这是一个解决方案,它将整个图像转换为透明,然后打开“剪裁路径”,然后使现在可写的部分不透明(可见)。
magick input.tiff -alpha transparent -clip -alpha opaque -strip out.tiff |
+clip
”还会关闭并移除剪裁蒙版(就像“+clip_mask
”一样)。但是,对于任何图像文件格式,都没有文件格式将当前剪裁蒙版保存在图像中。(至少在 IMv7 中是如此)读取蒙版 - 忽略像素输入
请注意,写入蒙版将限制写入图像的像素。但是,它不会限制在执行操作以创建要写入的新像素数据时,被“读取”的像素。这基本上意味着,如果您使用的是“区域效果”或“邻域”类型的操作符,例如 模糊、形态学 或 卷积,那么靠近边缘的“可写像素”可能会包含来自蒙版或不可写区域的颜色值。例如,这里我们保护前景玫瑰免遭写入,然后模糊图像。也就是说,我们只想强烈地模糊图像的背景部分。
magick rose: -mask rose_fg_mask.png \ -blur 0x8 +mask rose_bg_blur_fail.png |
![[IM Output]](../images/rose.png)
![[IM Output]](../images/rose_fg_mask.png)

![[IM Output]](rose_bg_blur_fail.png)
结果是使用 **写入保护蒙版**,并非预期结果。
IMv7 的读取蒙版解决方案
在 IMv7 中,使像素颜色像素不可读的唯一方法是使像素透明。透明像素默认没有颜色,因此“隐藏的颜色”不是模糊操作所做的计算的一部分。这给了我们一个“技巧”。使前景像素透明,应用模糊(或其他)操作,然后关闭透明度(在这种情况下,它实际上并不想要)。然后我们可以恢复图像的前景部分。如果听起来很复杂,那就是。以下是如何执行这些步骤,同时显示中间图像以试图使该技术清晰...
magick rose: rose_bg_mask.png -alpha off \ -compose CopyOpacity -composite +compose rose_bg_only.png magick rose_bg_only.png -channel RGBA -blur 0x8 rose_bg_blurred.png magick rose_bg_blurred.png -alpha off rose_bg_blur_opaque.png magick rose_bg_blur_opaque.png \ rose: rose_fg_mask.png -composite rose_bg_blur_good.png |
![[IM Output]](../images/rose.png)

![[IM Output]](../images/rose_bg_mask.png)

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

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

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

![[IM Output]](../images/rose.png)
![[IM Output]](../images/rose_fg_mask.png)

![[IM Output]](rose_bg_blur_good.png)
![]() 写入 |
![]() 读取 |
蒙版方法差异 |
区域和区域子图像
区域是另一种方法,可以将操作的影响限制在图像的较小区域。例如,这里我将整个矩形区域着色为红色...
|
![]() |
|
![]() |
![]() ![]() |
在 IM v6.6.9-5 之前,透明度保留是损坏的,区域中的透明度结果始终是“透明到原始”。因此,上面的结果将不包括任何透明像素,即使图像允许使用透明度也是如此。 |
扭曲局部区域
由于“图像区域”实际上会提取原始图像的“小子图像”进行处理,因此您可以利用特殊的“局部化”圆形扭曲来扭曲原始图像的小区域。例如,这里有一行条纹。
magick -size 600x70 xc:darkred \ -fill white -draw 'roundrectangle 5,5 595,65 5,5' \ -fill black -draw 'rectangle 5,25 595,31' \ -fill red -draw 'rectangle 5,39 595,45' \ lines.gif |
![[IM Output]](lines.gif)
magick lines.gif \ -region 90x70+10+0 -swirl 400 \ -region 90x70+100+0 -swirl 400 \ -region 90x70+190+0 -swirl -400 \ -region 120x70+280+0 -implode 1.5 \ -region 100x70+380+0 -implode -7 \ -region 101x70+480+0 -wave 10x50 -crop 0x70+0+10\! \ +region lines_regions.gif |
![[IM Output]](lines_regions.gif)
-implode
”和“-swirl
”非常适合使用区域,因为它们具有扭曲图像的外边缘与定义区域之外的图像其余部分匹配的特性。也就是说,它们实际上是设计用于执行“局部图像扭曲”。请注意,当我使用波浪扭曲时,我必须裁剪生成的“波浪”图像的大小,使其再次适合于提取它的原始区域。请记住,区域仅在与简单图像处理运算符一起使用时才起作用。任何其他运算符,包括另一个“-region
”运算符,都会在应用该运算符之前取消区域处理。区域的工作原理及其问题
实际上,区域的工作方式是...- 根据“
-region
”运算符,从图像中提取较小的图像,使用简单的裁剪和区域参数。 - 将任何后续的简单图像处理运算符应用于较小的图像。
- 当看到非简单图像运算符时,或者找到另一个“
-region
”运算符时,或者使用“+region
”关闭区域时,提取的区域将覆盖原始图像的提取位置。
... -region WxH+X+Y ...simple-operators... +region ... |
... \( +clone -crop WxH+X+Y ...simple-operators... \ \) -geometry +X+Y -composite ... |
... \( -clone 0--1 -crop WxH+X+Y ...simple-operators... \ null: +insert \) -geometry +X+Y -layer composite ... |
|
![]() |
|
![]() |
放大或缩小的区域图像可能无法“放回”原处。例如,这里我调整(并着色)区域图像,使其变小...
|
![]() |
|
![]() |
![]() ![]() |
与“mogrify ”一样,您无法合并多个子图像,因为这需要使用非简单图像操作。但是,您可以使用“-draw ”作为替代合成方法。有关示例,请参见Mogrify 中的 Alpha 合成. |
![]() ![]() |
在撰写本文时,“区域图像”仍然包含从原始图像中提取的裁剪虚拟画布偏移。这可能是,也可能不是一个错误,取决于您是否认为此信息有用。当前在恢复区域图像时未使用偏移量。 如果不需要偏移量(因为它会干扰扭曲等运算符),请在“ -region ”选项后跟一个“+repage ”运算符以从区域图像中删除偏移量。删除或修改它不会影响其恢复到原始图像。 |
背景去除
图像处理中最常见的问题之一是从现有的完全不透明的图像中生成蒙版。此类图像通常从万维网上下载,或由程序生成,或以不提供任何透明度形式的图像格式生成。您也可能有一张某个物体的照片,并想去除背景。请记住,照片没有任何对透明度的理解,因此您需要自己去除不需要的部分。不幸的是,这个问题没有通用的解决方案,尤其是在您还想保留图像的半透明边缘时。因此,有数百种执行此任务的方法和变体,所有这些都取决于具体情况。与图像蒙版密切相关的是调整透明度以匹配要叠加的背景图像。这是作为保存到GIF 图像文件格式的一部分进行详细说明的,该格式仅允许布尔透明度。屏蔽简单背景(填充)
当图像的背景是简单的单色固体颜色时,您通常可以通过执行替换图像中的颜色来生成简单的蒙版(和背景去除)。例如,这里是对具有纯色背景的图像进行直接填充蒙版。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
剪切带边框的物体
具有现有单色边框的图像对于这些背景去除方法具有明显的优势,因为边框提供了“内部”和“外部”图像之间的明确边界,这反过来允许使用更好的方法来指定背景图像的边界。也就是说,我们不是指定哪些颜色应该被视为背景,而是指定哪些颜色标记被掩盖的物体的边界。此外,由于边界颜色已知,因此只有两种特定颜色会在图像边缘混合在一起。也就是说,两种颜色都是已知的,因此边缘的透明度如何也非常好地已知。

移除已知背景
虽然将简单的背景去除到“布尔”蒙版相对简单,但当背景不那么简单时,事情就变得更复杂了。但是,如果背景本身是已知的。您可以使用它来帮助从其他图像中去除它。从 IM v6.3.4 开始,添加了一种特殊的Alpha 合成方法,称为“ChangeMask
”,它允许直接从图像中去除已知的背景。例如,这里有一个未经修改的背景图像,以及一个被具有简单布尔(直接开启/关闭)透明度的 GIF 图像叠加的图像。通过使用“ChangeMask
”,我们可以恢复那个原始叠加图像(如果它与背景非常不同)。基本上,它所做的是确定像素与一个图像到另一个图像的“差异”有多大,如果差异小于当前的模糊因子,则使该像素透明。只有完全透明的像素被添加到图像中,否则原始图像保持原样,透明度和所有内容。我们可以通过使用旧的“Difference
”合成方法来生成比较差异图像来模拟该运算符...如您所见,差异图像是所有未改变部分的黑色,而改变部分的混合颜色。通过分离和添加各个颜色通道,并进行阈值处理,我们可以得到两个图像之间任何通道的差异掩码。
|
![]() |
使用此掩码,我们可以将任何未改变的区域设置为透明。
|
![]() |
ChangeMask
' 合成方法使此过程变得更加容易。但是,这仅提供了一种“开/关”类型的背景遮罩。它不允许模糊或抗锯齿边缘,也不允许结果透明羽化。 差值图像蒙版和羽化
上述方法可以扩展到具有锯齿边缘的图像以及非简单背景的图像。例如,这里我们有一个白色背景上的“独眼巨人”,我们想要提取它。然后,我们生成此图像与背景颜色(由左上角像素定义)之间的差异的灰度图像。
|
![]() ![]() |
|
![]() ![]() |
-threshold
”,您可以在布尔值(仅开/关)掩码中添加一个“模糊因子”,从而使掩码更接近图像本身。
|
![]() ![]() |
-blur 0x0.707
”或 2 的平方根),只是为了平滑掩码的边缘。当然,结果将不是布尔值,所以不要尝试将其保存到 GIF 格式的图像文件中。这也是 模糊羽化 的一个例子。但请注意,它与真正的 使用距离羽化形状 不完全相同。但是,在处理“位图”或“阈值掩码”(如我们在上面创建的掩码)时,少量模糊羽化,然后进行大量距离羽化,可能会产生最好的总体结果。 恢复半透明边缘
我们在上面使用的 差异遮罩 技术可以与之前的 洪泛填充遮罩 技术一起使用,以解决我们在更简单的遮罩技术中看到的大多数问题。在这里,我们研究了一种多层遮罩技术,但这种技术应该能够产生近乎理想的图像背景去除效果,同时保留边缘处的抗锯齿阴影像素。但是,这仅限于已知背景的图像,并且前景像素具有良好的对比度“边缘”。在本例中,我决定使用一些很难分离的东西,但它在边缘周围显示了比抗锯齿目的通常更多的阴影像素。一个具有阴影效果的形状。
|
![]() |
|
![]() |
|
![]() -fuzz 1% |
![]() -fuzz 3% |
![]() -fuzz 6% |
![]() |
![]() -fuzz 28% |
![]() -fuzz 32% |
![]() -fuzz 34% |
1%
' 的 模糊因子,它仍然包含图像周围的大片区域。在更典型的非阴影情况下,此区域甚至可以更小,低至非百分比值,例如 5 或 10。第二个掩码应该具有足够大的“模糊”,以便吞噬所有存在的半透明像素。也就是说,一直到图像的边界,最好是实际上进入图像边界,而不会完全去除边界,或“泄漏”到图像本身(参见上面的最后一张图像)。此掩码的反面实际上将代表最终图像中所有完全不透明(因此代表内部)的像素。此选择可能很困难,可能需要很多尝试才能找出要使用的最佳值。对于此图像,可以毫无问题地选择一个非常高的模糊 '32%
'。基本上,您希望尝试将其提升到足以使最终图像不包含任何原始“背景”像素,但同时又不让掩码吞噬(或泄漏到)图像内部。如果您在周围的“边缘”颜色中存在间隙,可能还需要进行一些手动编辑才能使掩码完全正确。我们现在可以使用此掩码来提取图像的“核心”或内部。也就是说,我们确信不包含任何半透明区域到我们正在去除的原始背景模式的部分。
|
![]() |
|
![]() |
|
![]() |
![]() ![]() |
您需要以某种方式弄清楚半透明像素应该是什么颜色,以便您可以为抗锯齿像素设置正确的颜色。 这可能是
|
|
![]() |
|
![]() |
|
![]() |
bg_removal
”的 shell 脚本中,该脚本使用单个命令,没有临时文件,并且具有许多关于掩码执行方式的额外选项。 使用两个背景移除背景
先前技术的主要问题在于,你实际上没有足够的信息来完全恢复关于前景物体的所有信息。你需要恢复两部分信息,前景物体中每个像素的透明度,以及它的原始颜色。而你无法仅从一张图像中完美地恢复这两部分信息。即使你确切地知道背景图像是什么样的,你也不能简单地将其从前景物体中减去,除非两者差异很大且颜色已知。问题在于你无法确定可见的颜色是真实的颜色(不透明),还是其他颜色与背景的混合(半透明)。你无法将原始颜色从所需的 alpha 值中分离出来,除非你有一些额外的信息来源。唯一可以完全恢复前景物体所有细节的情况是,你拥有两张包含两种截然不同但完全已知背景颜色的图像。在这种情况下,你拥有足够的信息来恢复前景物体的颜色及其透明度,从而实现完美的背景去除。选择两张图像的重要因素是,背景颜色在整张图像中尽可能不同。也就是说,颜色不仅是互补色,而且在所有通道中强度都是相反的。例如...虽然使用了不同的背景颜色,但两张图像都包含完全相同的物体。所示物体并不简单,而是包含许多半透明的颜色。你可以在图像火焰中看到深蓝色背景的可见部分,尽管这种透明度在较浅的黄色背景中几乎不可见。通过使用两种颜色,覆盖物体的半透明像素将与两种截然不同的颜色混合,因此在两张图像中颜色会略有不同。通过测量每个像素的不同之处,你可以准确地确定哪些像素是半透明的,以及透明度有多高。实际上,有足够的信息让你完美地恢复覆盖物体的透明度。恢复透明度或“蒙版”当然是第一步,实际上是一个非常简单的步骤。生成一张差值图像,然后合并并最大化在每个通道中找到的差异。
|
![]() |
-evaluate-sequence max -auto-level
”)。也就是说,除以 0.0 到 1.0 之间的值,差异越大越好。如果两种背景颜色是纯黑色和纯白色,则无需规范化,只需两张图像的差值即可。然后对差值进行 反转,以便最大差异产生零 alpha 或完全透明,而无差异产生最大 alpha 或完全不透明。下一个任务更难,因为每个半透明像素的颜色都会受到背景的影响,你不能仅使用 alpha 蒙版从其中一张源图像中提取物体。例如...
|
![]() |
|
![]() |
u.p{0,0}
”)作为背景颜色,从半透明像素中去除。如果需要,可以调整此颜色或直接替换要去除的颜色。颜色恢复的关键在于上面复杂的 FX 混合减法操作。这将根据 alpha 蒙版(“v
”)增强源图像的原始颜色(“u
”),然后从最终结果中减去背景颜色(u.p{0,0}
或左上角像素)。公式并不简单,要特别感谢 IM 论坛讨论 Undo a Composite -dissolve 中的 HugoRune,他确定了所需的数学运算。讨论还详细介绍了所有步骤是如何工作的,是如何推导出来的,甚至是如何从任何两个已知但不同的背景图案中提取覆盖物。以下是一条包含所有步骤的完整命令。
|
![]() |
![]() ![]() |
在 IM v6.6.8-3 中,如果 FX 使用“p{}”引用透明像素,则会获取零值,而不是实际的完全透明颜色值!这是一个错误,已在 IM v6.6.8-5 中报告并修复。尚不清楚此错误是在何时引入的。 这仅仅是一个问题,如果你决定先将 alpha 图像合并到源图像中,然后尝试使用已知的背景颜色来修复半透明或“溢出”颜色。 |
-clone
”操作中的“0
”选择,但可以使用任何源图像。只需注意一点。上述操作假设左上角像素是未受污染的背景颜色。如果不是,你可能需要修改命令以指定特定的像素颜色,或者使用包含正确背景颜色信息的第三张图像。如果背景颜色在图像中不一致,则后一种方法至关重要,但即使这种复杂情况也可以解决。以下是用于覆盖在纯黑色和纯白色背景上的图像的更简单的序列。在这种情况下,颜色始终从黑色背景图像中恢复,因为它只是一个简单的除法运算,因此可以使用更快的 除法合成,而不是缓慢的 FX DIY 运算符。
magick match_black.gif match_white.gif -alpha off \ \( -clone 0,1 -compose difference -composite -negate \) \ \( -clone 0,2 +swap -compose divide -composite \) \ -delete 0,1 +swap -compose Copy_Opacity -composite \ match_recovered_3.png |
![[IM Input]](../images/match_black.gif)
![[IM Input]](../images/match_white.gif)

![[IM Output]](match_recovered_3.png)
用于背景恢复的影棚照片理想的背景是哑光(非反射)黑色,以及简单的纯色(非反射)白色。背景也应该尽可能平滑且无变化。在专门用于背景去除的照片拍摄中,使用两种互补颜色可能效果更好。例如,使用绿色和品红色背景拍摄照片。基本上,你需要在拍摄第二张照片之前以某种方式替换背景颜色屏幕。请注意,两张照片的顺序在背景去除中并不重要,但它们应该尽可能干净且统一,并且主体和相机必须保持完美静止和固定。一个更好的方法可能是简单地在物体后面放置一块距离较远的白色屏幕,并使用两种不同颜色的灯均匀地照亮屏幕,以免物体产生阴影。使用此技术,你可以在不需要对影棚进行任何物理改变的情况下,切换到另一种背景颜色,从而拍摄具有两种不同背景的两张照片。这两种颜色背景技术适用于透明物体,但物体拍摄时产生的反射或背景扭曲或“镜头”效果将不会被此技术记录,只有它的透明度会被记录。另一方面,物体上恒定光源的反射将被保留!如果你尝试过,请告诉我们,并提供源照片和结果的示例,以便包含在此处。你将在你的网站的链接处被提及,以便人们可以查看。
视频背景恢复如果你有一系列包含许多不同但复杂的背景的图像(例如视频),你可以尝试获取所有图像的最小值和最大值,以生成接近纯黑色和白色背景图像以供使用。图像越多,效果越好。使用这两张图像,可以提取任何恒定的徽标及其半透明度,然后可以使用相同的技术将其从所有帧中去除。但是,它仅适用于恒定的半透明覆盖物,可能不适用于使用颜色或色调失真,甚至使用纯色徽标的徽标。但它至少可以让你确定徽标的精确形状。对于完全不透明或更难的徽标,可以使用孔洞填充(参见下一节)来填充周围颜色缺失的细节。有关更多信息,请参见 IM 论坛讨论。
孔洞填充
虽然蒙版、添加透明度和去除背景提供了一种处理不需要的元素的方法,但通常“孔洞”不是你想要的最终结果。当然,你可以简单地将带有孔洞的图像覆盖到其他图像上以填充它们,但这可能无法产生无缝的结果。要从图像中擦除元素,你不仅想要将其剪切出来,还要用周围孔洞的顏色、阴影和纹理替换它们。以下是确定如何使用什么来填充孔洞的几种技术。创建要填充的孔洞
假设我们有一张带有难看文本的图像...
|
![]() |
但是,对于这种情况,我将使用一条覆盖“难看文本”的绘制线来创建蒙版,就好像用户快速使用了一个图像编辑器一样。
|
![]() |
现在,让我们使用蒙版从图像中剪切出一个孔洞,这也将检查它是否覆盖了所有不需要的部分。
|
![]() |
模糊填充
因此,我们有一个孔洞,需要用某种颜色填充它。一种不会让人觉得我们从图像中实际去除了一些东西的方法。最简单的方法之一是简单地模糊图像,让孔洞周围的颜色“扩散”到孔洞中,然后去除透明度。
|
![]() |
magick zelda_text_hole.png zelda_text_fill.png \ -compose Dst_Over -composite zelda_text_removed.png |
![[IM Output]](zelda_text.jpg)

![[IM Output]](zelda_text_hole.png)
![[IM Output]](zelda_text_fill.png)

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

