ImageMagick 範例 --
遮罩
- 索引
-
ImageMagick 範例前言與索引
-
Alpha (遮罩) 色版
-
對影像使用遮罩
-
特殊影像遮罩
-
區域和區域子影像
-
背景移除
-
孔洞填補 (建構中)
Alpha 色版
影像的透明度(alpha)色版完全是可選的,並且通常需要與一般「顏色」色版分開處理。請參閱上方的影像色彩空間。透明度色版的存在也會影響各種運算子處理其他顏色色版的方式,這通常是因為完全透明的顏色通常應該被運算完全忽略。如果不是這種情況,您會在影像周圍看到「黑色光暈」,例如在 IM v6 早期的主要 IM 錯誤中所見。例如調整大小光暈錯誤和透明度模糊錯誤。更糟糕的是,這個色版有時也被稱為影像的「透明度」或「不透明度」色版,甚至是影像的「遮罩」。然而,所有這些都指的是影像的同一個特殊的第四個色版。![[IM 輸出]](../images/moon.png)
我可以透過使用Alpha 合成將影像覆蓋在 IM 內建的棋盤格圖案上來演示這種透明度。
|
![]() |
內部 Alpha 色版
現在 IM v7 在內部將透明度資訊儲存在「alpha」通道中,就像色彩通道一樣,它只是一個純粹的灰階影像,其值範圍從完全透明(或清晰)的白色到完全不透明的黑色。這有點像你只看原始影像的輪廓時會得到的結果。低階運算子,例如「-level
」和「-threshold
」,將資料視為 alpha 處理。如果不確定,請查看官方選項參考。以下是一種從影像中提取「alpha」透明度值的非常古老的方法。它將透明度通道儲存為「alpha」影像檔案格式,並且需要兩個獨立的步驟和命令來定義正確的影像檔案格式。
控制影像透明度有兩個運算子可以讓你對記憶體中影像的透明度通道進行低階控制。更新的運算子「-alpha 」方法現在是推薦的控制方法,儘管許多 IM 範例仍然顯示和使用舊的「-alpha 」運算子。影像不僅可以具有 alpha 通道資料,而且還具有定義通道資料是否可見或有效的「開關」。這表示影像在 alpha 通道方面可以有三種狀態。
-compose CopyOpacity -composite 」將始終開啟結果影像中的 alpha 通道,因為它是運算子的工作,將資料複製到 alpha 通道中。因此,它必須存在於最終結果中。但是,它在輸入資料中的存在可能會產生其他後果。有關詳細資訊,請參閱Copy_Opacity 合成方法。同樣,使用顏色「None 」建立畫布也會自動建立並啟用透明度通道,以確保空白影像確實是透明的。另一方面,使用其他顏色名稱建立畫布通常不會建立任何透明度通道,因為預設情況下影像是完全不透明的。以下是各種「 -alpha 」方法以及它們如何影響影像及其透明度的範例。 Alpha 關閉或「這只是一個簡單的圖片開關,它會關閉透明度對圖片的任何影響。它實際上並沒有刪除或銷毀附加到圖片的 Alpha 色版,它只是關閉了該色版對圖片的任何影響。同樣地,當 Alpha 色版被關閉時,任何運算子都不會影響它。例如,讓我們使用「新月」圖片(來自複製不透明度合成範例),並簡單地關閉圖片的 Alpha 色版。請注意,當透明度關閉時,月亮形狀完全消失了,儘管實際上很少出現這種情況。基本上,即使是「透明」區域也有顏色,只是通常不可見,在這種情況下,隱藏的顏色是用於創建月亮圖片的分形畫布圖片。這種隱藏的顏色可以是任何東西,從 GIF 格式用於在其顏色表中表示透明度的簡單GIF 透明色,到如上所述在圖片創建過程中留下的垃圾顏色。更典型的是,對於任何完全透明的像素,透明色僅僅是純黑色。請注意,靠近邊緣的像素可能是半透明的,因此仍然具有僅部分可見的有效顏色。上面「 |
|
![]() |
|
![]() |
開啟 Alpha
「-alpha On
」與先前查看的 關閉 Alpha 方法完全相反。 通常,這對於您的目的而言過於簡單,因此應該很少使用。 在幾乎所有情況下,您都應該使用「-alpha Set
」。 基本上,「On
」方法只是撥動開關,以便再次顯示影像透明度資料。 任何現有的透明度資料都不會被修改,因此如果記憶體中的影像仍然有一些舊的 Alpha 色板資料,這些資料將會突然再次顯示出來。 例如,在這裡我們「Off
」(關閉)透明度資料,然後立即將其重新「On
」(開啟),以重現原始影像。
|
![]() |
-shade
」)之前,可以關閉然後開啟 Alpha 色板來保留 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
」(提取)方法也會將「Off
」(關閉)alpha,但它不會被清除,因此將 alpha 通道重新「On
」(開啟)將重新建立原始影像的形狀遮罩。
|
![]() |
|
![]() |
Alpha Copy(複製 Alpha)
「Copy
」(複製)方法與「Extract
」(提取)相反,並且基本上是對自身執行 CopyOpacity(複製不透明度)。也就是說,它會將灰階影像(無論其 alpha 通道是否啟用)轉換為形狀遮罩影像。影像是否具有現有的 alpha 通道並不重要,它所做的只是根據影像灰階值建立影像透明度。一旦您有了形狀遮罩,就可以使用各種 顏色著色 或 Duff-Porter alpha 合成方法為其著色。有關使用形狀遮罩的範例,請參閱 遮罩作為彩色形狀。 Alpha Shape(Alpha 形狀)
為了更容易使用灰階影像,「Shape
」(形狀)方法不僅會建立形狀遮罩(根據 Alpha Extract(提取 Alpha)),還會使用當前的背景顏色為其著色。這表示您可以通過塑造影像,然後將其拼合到不同的背景顏色上,從而非常快速地為灰階遮罩著色
|
![]() |
![]() ![]() |
背景實際上不是用於此「形狀」著色操作的正確顏色。它應該使用「填充」顏色來設置形狀的前景色。因此,應該使用哪種顏色可能會有所不同。由於訪問當前填充顏色的內部困難,因此僅使用背景。這種變化可能會在 IMv7 中發生。 |
|
![]() |
![]() ![]() |
以上將使用線性色彩空間映射顏色,並且可能需要在某些時候轉換為 sRGB 以獲得視覺上更準確的顏色漸變。 |
Alpha Remove(移除 Alpha)
「-alpha Remove
」(移除)方法(添加到 IMv7.7.5 中)旨在使用當前的「-background
」(背景)從影像中移除透明度。
|
![]() |
Alpha 背景
從 IM v6.5.2-10 開始,提供了一個「背景
」方法,可以將完全透明像素的隱藏顏色設定為目前的背景顏色。通常這種顏色並不重要,因為只有在 關閉 Alpha 色板時才能看到它。但是,完全透明像素的顏色會儲存在 PNG 影像檔案格式中,對於大型影像來說,具有隨機未知的完全透明顏色可能會顯著影響其壓縮處理。如需更多詳細資訊,請參閱 具有更好壓縮率的 PNG 和 IM 論壇討論 消除 Alpha 色板垃圾。請注意,不會套用任何顏色混合,只會將顏色直接指定給任何完全透明的顏色。但是,像素仍將保持完全透明,因此您將看不到影像發生變化。例如,我在這裡使用它將所有完全透明的像素設定為「HotPink 」。
|
![]() |
如您所見,這對影像的實際外觀沒有任何改變。為了查看變化,我們現在將 關閉 Alpha 色板。
|
![]() |
這與 移除透明度 不同
形狀的邊緣會使所有半透明像素變得不透明,因此會產生一些強烈的鋸齒 (階梯狀) 邊緣效果。請注意,即使是通常不透明的 PNG24 格式,如果所有完全透明的顏色都相同,仍然可以儲存布林透明度。如需詳細資訊,請參閱 PNG 子格式 中的範例。這個替換顏色的過程實際上幾乎與執行「-channel RGB -fill 顏色 -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 布林透明度 中可以看到一些範例,但最終應該會移到這裡。輪廓或光暈透明度
有時,您會希望在包含透明度的影像周圍添加輪廓線。一種方法是使用 邊緣外擴形態學 快速取得原始影像的所有相鄰像素,為它們著色,然後使用 下方 (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
」操作,因為確保灰階影像不包含不需要的透明通道至關重要。瞧,我們從原始影像中咬了一口。我們還可以重新添加我們移除的影像的一部分。例如,在這裡,我透過在遮罩上繪製白色區域,重新添加了從原始影像中移除的「咬痕」的一部分。然後使用 複製不透明度通道合成 將遮罩返回到原始影像。
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
」顏色定義,組合 用於填充新圖像中未定義的通道。一種較舊但更複雜的方法是使用「複製不透明度
」合成方法將圖像的透明度設置為給定的遮罩,然後使用 均勻色彩著色 為生成的形狀著色。這很有效,並且長期以來一直是最好的技術,但現在不再推薦。
|
![]() |
|
![]() |
|
![]() |
數學合成
除了將遮罩覆蓋在某個背景上之外,您可能只對用遮罩本身的白色或黑色部分為圖像著色感興趣。這相對簡單,只需使用一些 數學 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.dev.org.tw/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.dev.org.tw/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.dev.org.tw/Usage/compose/#mask and https://imagemagick.dev.org.tw/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 圖像檔案格式 的一部分中有詳細討論,該格式只允許布林透明度。遮罩簡單背景(floodfill)
當圖像背景是簡單的單一純色時,您通常可以透過 替換圖像中的顏色 來生成簡單的遮罩(和背景移除)。例如,以下是一個具有純色背景的圖像的直接 floodfill 遮罩。
|
![]() |
|
![]() |
|
![]() |
|
![]() |
裁剪帶邊框的物件
對於這些去背方法來說,具有單一顏色邊框的圖像具有明顯的優勢,因為邊框在圖像的「內部」和「外部」之間提供了一個明確的界限,這反過來又允許使用更好的方法來指定背景圖像的邊界。也就是說,我們可以指定哪些顏色標記了被遮罩對象的邊框,而不是指定哪些顏色應該被視為背景。此外,由於邊框顏色是已知的,因此圖像邊緣周圍只會混合兩種特定的顏色。也就是說,兩種顏色都是已知的,因此邊緣應該透明的程度也是非常清楚的。

移除已知背景
雖然將簡單背景移除到「布林」遮罩相對簡單,但當背景不那麼簡單時,事情就會變得更加複雜。但是,如果背景本身是已知的,則可以使用它來幫助從其他圖像中移除它。從 IM v6.3.4 開始,添加了一種特殊的 Alpha 合成 方法,稱為「ChangeMask
」,它允許直接從圖像中移除已知的背景。例如,這裡我們有一個未更改的背景圖像,以及一個已覆蓋具有簡單布林(直接開/關)透明度的 GIF 圖像的圖像。通過使用「ChangeMask
」,我們可以恢復原始覆蓋的圖像(如果它與背景非常不同)。基本上,這樣做的目的是確定像素從一個圖像到另一個圖像的「差異」程度,如果差異小於當前的 模糊因子,則使該像素透明。只有完全透明的像素才會被添加到圖像中,否則原始圖像會保持原樣,包括透明度。我們可以使用較舊的「Difference
」合成方法來模擬運算符,以生成 比較差異圖像...如您所見,差異圖像對於所有未更改的部分都是黑色的,對於已更改的部分則是混合顏色。通過分離並將各個顏色通道加在一起並進行閾值處理,我們可以獲得兩個圖像之間任何通道中任何差異的遮罩。
|
![]() |
使用此遮罩,我們可以將任何未更改的內容設置為透明。
|
![]() |
ChangeMask
」合成方法使此過程變得更加容易。但是,這只呈現了一種「開/關」樣式的背景遮罩。它不允許模糊或抗鋸齒邊緣,或結果的透明羽化。 差異影像遮罩和羽化
以上內容可以進一步應用於具有鋸齒邊緣以及非簡單背景的圖像。例如,這裡我們有一個在白色背景上的「獨眼巨人」,我們想提取它。然後,我們生成此圖像與背景顏色(由左上角像素定義)之間差異的灰度圖像。
|
![]() ![]() |
|
![]() ![]() |
-threshold
」,您可以為布林值(僅限開/關)遮罩添加「模糊因子」,以便使遮罩更接近適當的圖像。
|
![]() ![]() |
-blur 0x0.707
」或 2 的平方根),以便平滑遮罩的邊緣。當然,結果不會是布林值,因此不要嘗試將其保存到 GIF 格式的圖像文件中。這也是模糊羽化的示例。但請注意,它與真正的使用距離羽化形狀並不完全相同。但是,在處理我們上面創建的「點陣圖」或「閾值遮罩」時,少量模糊羽化,然後是更大程度的距離羽化,可能會產生最佳的整體結果。恢復半透明邊緣
我們上面使用的差異遮罩技術可以與之前的泛洪填充遮罩技術一起使用,以解決我們在更簡單的遮罩技術中看到的大多數問題。在這裡,我們看一種多層遮罩技術,但這種技術應該能夠近乎理想地去除圖像背景,同時保留沿邊緣的抗鋸齒陰影像素。但是,這僅限於已知背景上的圖像,並且前景像素具有良好的對比「邊緣」。對於這個例子,我決定使用一些很難分離的東西,但它在邊緣周圍顯示出比抗鋸齒目的通常要多得多的陰影像素。具有陰影效果的形狀。
|
![]() |
|
![]() |
|
![]() -模糊度 1% |
![]() -模糊度 3% |
![]() -模糊度 6% |
![]() |
![]() -模糊度 28% |
![]() -模糊度 32% |
![]() -模糊度 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}
或左上角像素)。這個公式並不簡單,非常感謝HugoRune在 IM 論壇討論撤銷複合溶解中確定了所需的數學方法。討論還繼續說明了所有步驟是如何工作的、是如何得出的,甚至是如何從任何兩個已知但不同的背景模式中提取覆蓋層。以下是所有步驟都在一個命令中的完整序列。
|
![]() |
![]() ![]() |
在 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)

