ImageMagick 範例 --
色彩基礎與通道
- 索引
-
ImageMagick 範例前言與索引
-
什麼是色彩
-
Gamma校正與sRGB色彩空間
-
色彩指定
-
色彩通道
-
色彩空間
-
取代影像中的色彩
(取代特定色彩)
什麼是色彩?
要真正瞭解顏色,您需要確切知道顏色是什麼。在物理世界中,顏色實際上是一種幻覺。我們之所以能看見顏色,是因為我們的眼睛以一種非常特殊的、有限的方式感知物理世界。基本上,我們的眼睛中有特殊的感測器,分別用於感知紅色、綠色、藍色,還有一個不太重要的感測器用於周邊和低光條件。後者就是為什麼我們在晚上只能看到灰色。
RGB 色彩空間和通道
所以 RGB 色彩空間實際上是一種使用紅、綠、藍三種顏色值來表示圖像的方式,它會讓我們誤以為看到了真實世界中的事物。因此,圖像可以存儲為 3 個數值陣列,其中三個值中的每一個值形成一個單獨的像素或顏色點以進行顯示。這三個數值陣列中的每一個都被稱為一個通道,它只是一個灰階圖像,表示為我們的三個顏色感應器中的一個創建的光量。例如,以下是玫瑰圖像的紅色、綠色和藍色分量。
![]() 玫瑰 |
![]() |
![]() 紅色 |
![]() 綠色 |
![]() 藍色 |
CMY色彩空間
當你列印時,你會遇到一個不同的問題。一張紙不能產生光,只能反射光。因此,你需要從一個表面開始,該表面反射所有照射到它的光,朝向各個方向。也就是說,這就是白色的表面。希望它反射的光本身就是純白色的光,可以來自窗外的陽光,也可以來自我們人工照明的房間裡的燈光。現在,要在紙上創建圖像,你需要在紙上塗抹油墨,這實際上去除了特定波長的光。由於我們「感覺」到紅色、綠色和藍色,所以我們希望從那張白紙反射的光中選擇性地去除這些顏色。因此,我們使用青色墨水去除紅光,品紅色去除綠光,黃色去除藍光。產生特定顏色所需的青色、品紅色和黃色墨水的量產生了所謂的 CMY 色彩空間。在這裡,我生成了僅使用青色、品紅色和黃色墨水生成玫瑰圖像所需的墨水遮罩(假設墨水是「線性」的)
![]() 玫瑰 |
![]() |
![]() 青色 |
![]() 品紅色 |
![]() 黃色 |
CMYK色彩空間
選擇性移除波長的主要問題在於,僅僅通過應用青色、洋紅色和黃色三種墨水來移除所有紅色、綠色和藍色光,實際上並不能移除所有被反射的光。結果你不會得到黑色,而是一種難看的泥濘棕色。墨水(或濾光片)並不完美,就像我們自己的眼睛並不完美一樣。正如我之前提到的,我們的每個顏色感應器並不僅僅看到單一波長的光,而是將一定範圍的波長解釋為“紅色”、“綠色”或“藍色”(或這些顏色的混合)。以至於我們的“藍色”光感應器實際上可以看到一點紫外線(雖然不是很清楚)。題外話:“黑光”的濾光片故意設計得不完美,以便我們可以“剛好看到”來自這種燈的光,這樣我們就可以知道它是打開還是關閉。正是由於 CMY 墨水的這種顏色“洩漏”,以及我們自己不完美的眼睛,我們在混合中添加了純黑色墨水,使其能夠消除所有可能從紙張反射的光。為了防止與藍色混淆,黑色墨水或通道被分配了字母 K。因此,為了印刷,我們使用四種彩色墨水:青色、洋紅色、黃色和黑色(blacK);並使用這些墨水定義圖像,形成 CMYK 顏色空間。例如,以下是從此圖像中分離出來的相應 CMYK 分量。
![]() 玫瑰 |
![]() |
![]() 青色 |
![]() 品紅色 |
![]() 黃色 |
![]() 黑色(blacK) |
其他色彩空間
其他顏色空間只是表示相同顏色的其他方式,或者表示我們不完美的眼睛也可以分辨出的嚴格 RGB 以外的一些其他顏色。但是,此類顏色空間與使用顯示器顯示這些顏色或打印這些顏色幾乎沒有關係。它們基本上代表了處理和/或處理圖像顏色的其他方式,以便增強或突出顯示特定內容,例如...- 更好的暗色非線性處理(sRGB)
- 彩虹色和色調(HSB、HSL、HSI、OTHA 顏色空間 - 不保留強度)
- 標準化定義顏色(XYZ)
- 精確或感知色差(LAB 和 LUV 顏色空間,以及它們的 LCHab 和 LCHuv 循環色調等效)
- 擴展高動態範圍(用於 HDRI 圖像)(scRGB)
- 更好的顏色值壓縮(例如在 YIQ 和 YUV 中)
- 電視傳輸(YCbCr、YPbPr,其中 Y = 黑白信號)
![]() ![]() |
以上對圖像「色彩空間」的更改只是對內存中圖像顏色的粗略排列。它還在不同色彩空間之間提供非常基本(簡單)的色彩轉換。 對於精確的顏色規格和顏色轉換,應改用顏色配置文件,但僅在使用可以處理顏色配置文件的圖像文件格式時才有效。 |
伽瑪校正和 sRGB 色彩空間
人類色彩感知
在上面我們看到您可以用許多不同的方式來表示圖像。我們上面看到的所有色彩空間都被稱為「線性」色彩空間,這意味著使用的實際值表示圖像中顏色的實際「強度」值。然而,現實生活從來沒有這麼簡單。從來沒有!例如,讓我們用一個簡單的線性灰度值序列生成並保存一個圖像...
|
![]() |
- 使用「
gradient:'gray(100%)-gray(0)'
」可確保 IM 生成線性 RGB 數據的漸變,該漸變將採用線性 RGB 色彩空間。 - 「-set colorspace sRGB」告訴 IM 這個「線性」漸變實際上是「sRGB」,因此在保存到只能存儲 sRGB 色彩空間值的 GIF 圖像文件格式時不需要「校正」。
perceived_grey = value2.2
值「2.2
」是平均伽瑪函數值,是大多數人類的典型值。
Gamma校正
伽瑪校正是調整實際保存的顏色值的一種方法,以便最終圖像在其顏色分佈中看起來更加均勻。基本上,雖然人眼使用2.2
的冪因子使光線看起來更暗,但要使線性圖像「看起來」線性,我們需要使用 1/2.2
的值來反轉該冪函數。也就是說,要使圖像看起來是線性的,我們需要使用以下公式對其進行校正...gamma_corrected_value = value1/2.2
IM 通過級別運算符、伽瑪參數或更具體地使用伽瑪運算符來提供伽瑪校正。但是,您也可以使用評估 POW 函數直接修改圖像值。
因此,讓我們應用它並查看「伽瑪校正圖像」的結果..
|
![]() |
- Gamma 校正(維基百科)
- 圖片縮放中的 Gamma 誤差(包含 IM 使用情況的部分)
- Gamma 常見問題,圖片處理
-auto-gamma
”運算子,它會嘗試調整 Gamma 以產生線性 RGB 圖片,其中包含等量的淺色和深色(在線性空間中)。
|
![]() Gamma 1.6 |
![]() Gamma 1.8 |
![]() Gamma 2.0 |
![]() Gamma 2.2 |
![]() Gamma 2.4 |
sRGB色彩空間校正
使用 sRGB 色彩空間保存圖片與對圖片進行 Gamma 校正非常相似,但稍微複雜一些,以便更好地再現人眼的實際反應,尤其是在非常暗的顏色陰影下。因此,讓我們將線性漸變保存在經過 sRGB 校正的色彩空間中。
|
![]() |
![]() ![]() |
從 IM v6.7.7 開始,以上內容已簡化為僅
但是,由於請求了 sRGB 顏色的「白黑色」,因此線性資料漸變將自動轉換為 sRGB 色彩空間,從而產生非線性資料值和感知線性漸變。 |
![]() ![]() |
在 IM 6.7.5 版之前,以上內容會失敗,因為 IM 將「sRGB」和「RGB」色彩空間的含義顛倒了。 因此,在舊版本的 IM 上,需要交換兩個色彩空間名稱。 例如...
|
-set colorspace ...
”來確保色彩空間符合您的預期。這裡是所有三張圖像放在一起,以便您可以比較它們。
![]() 線性 |
![]() 伽瑪 |
![]() sRGB |
處理真實影像
大多數圖像處理運算符並不關心圖像使用什麼色彩空間,它只是將其運算應用於通道數據,而不管其色彩空間如何。儘管有些必須特別注意處理“黑色”的額外通道數據,以及您稍後將看到的“Alpha”(或“Alpha”透明度)。然而,圖像的色彩空間會極大地影響許多操作的最終結果。因此,在不同的色彩空間中進行圖像處理可以產生更好的結果。這個例子更清楚地說明了為什麼在 sRGB 中處理不是一個好主意。摘自 IM 用戶論壇上關於顏色模糊和“斷色”的討論。我們採用兩種使用不同顏色通道的顏色,並將它們模糊在一起,以便在通道內顏色模糊為零(低顏色值)。首先,讓我們使用默認的 sRGB 輸入通道來做到這一點。
|
![]() |
在這裡,我再次模糊同一張圖像,但使用線性 RGB 色彩空間。
|
![]() |
![]() ![]() |
Helmut Dersch(以「桶狀變形和鏡頭校正」聞名)建議您考慮使用線性「LAB 」色彩空間來處理影像,尤其是在調整影像大小和變形時。我僅建議您在進行繪圖、合成、調整大小或影像變形時,才將「輸入」sRGB 色彩空間轉換為其他「線性」色彩空間。 無論是線性 RGB、LAB 還是 LUV,應該沒有太大差別。 |
|
![]() RGB |
![]() LUV |
![]() LAB |
顏色規範
IM 中的顏色可以用多種方式指定。最佳指南位於 IM 官方網站上的顏色名稱。以名稱指定色彩
許多顏色都被賦予了特定的名稱,這使得它們更易於使用。例如,「RoyalBlue
」是一種非常漂亮的亮藍色。![[IM 輸出]](named_colors.png)
hsl_named_colors
」腳本生成了它,並遵循了分層圖像的程序化定位中探討的技術。![]() ![]() |
從技術上講,當我以「雙錐體」而不是「圓柱體」的三維形式繪製 HSL 顏色時,每個色點的半徑已設置為等於顏色的「色度」(「飽和度」/「亮度」),而不僅僅是其「飽和度」。請參閱維基百科:HSL 和 HSV。 更準確地說,也應該使用六角錐體而不是圓錐體,儘管這樣計算起來要困難得多,而且收效甚微。 |
顯示
」程序中加載右側的圖像,您可以使用滑鼠中鍵查看已繪製的特定顏色的 ImageMagick 顏色名稱。 特殊顏色名稱
有一些特殊顏色在 ImageMagick 中用於特殊用途。「無
」或「透明
」是一種完全透明的黑色,通常用於指定背景透明度,例如在創建純色畫布或使用圖像圖層時。「不透明
」只是「黑色
」的別名,因此很少使用。它通常僅在想要表示任何不透明顏色時使用,例如在進行 Alpha 通道處理時。色彩名稱衝突
顏色名稱可以來自三個不同的來源:SVG、X11 和 XPM,並且大多數名稱生成的顏色相同,無論定義來源如何。但是有一些顏色名稱會產生不同的顏色,具體取決於所使用的顏色規範。最大的問題是 SVG 顏色「Green
」(半亮綠色)與 X11/XPM 顏色「Green
」(純 RGB 綠色)不同。如果您想要純綠色,最好使用沒有衝突的 SVG 顏色名稱「Lime
」。維基百科有一篇關於顏色名稱衝突的出色文章,以及一張很好的實際顏色名稱表,位於 X11 顏色名稱。您可能還想查看 網頁顏色 一文,其中提供了一些顏色範圍的良好排序表。最顯著的衝突是在四種特定顏色中。以下是已知顏色名稱衝突的表格。請記住,SVG 顏色是 IM 預設使用的顏色。衝突 顏色名稱 |
SVG 結果 (IM 預設) |
X11 結果 名稱 |
X11 等效 名稱 |
替代方案 顏色名稱 |
||||
---|---|---|---|---|---|---|---|---|
綠色 | #008000 | #00FF00 | Lime | |||||
Maroon | #800000 | #B03060 | FireBrick | |||||
Purple | #FF00FF | #A020F0 | 品紅色 | |||||
Gray | #7E7E7E | #BEBEBE | Grey |
- X11 的「
Grey
」是一種視覺上的中灰色。它也非常接近(但不完全相同)X11 顏色「Gray74
」和 SVG 顏色「Silver
」(「gray(192)
」)。 - 預設(SVG)的「
Gray
」非常接近完美的數學灰色,最好使用顏色名稱「Gray50
」或「gray(128)
」(用於 8 位)來指定。 - 由於所有命名的顏色都是使用 8 位(0-255)值指定的,因此它們都不會產生完美的 16 位純灰色!
- 當需要將灰色用於數學處理時,例如 FFT 直流相位 邊緣檢測、陰影圖像、合成照明效果 和 相對位移圖,最好使用顏色公式「
gray(50%)
」,它可以在任何顏色位深度下生成完美的數學中間色調灰色。
顏色和色彩空間
雖然許多顏色都有名稱,但圖像中的大多數顏色都沒有,它們只是一組值(通常為 3 個),用於指定特定顏色。但是,三個值本身並不能完全定義顏色,您還需要指定這些值所屬的「色彩空間」或「顏色系統」。以上所有「命名」顏色都在 sRGB 色彩空間中,這是它們定義的色彩空間。但有時您想在不同的色彩空間中定義顏色。例如,在 HSL、CYMK 甚至 XYZ 顏色中。ImageMagick 可以做到這一點,您可以在 ImageMagick 顏色名稱 中查看這些規範的詳細信息。*未來:使用其他色彩空間的示例(仍在開發中)*![]() ![]() |
雖然 ImageMagick 中的 RGB 表示線性 RGB 色彩空間,但公認的做法是「rgb(value,value,value) 」的顏色名稱實際上定義的是 sRGB 顏色。要實際定義線性 RGB 顏色而不是 sRGB 顏色,請使用顏色公式「 icc-color(RGB,value,value,value) 」(見下文)。 |
icc-color(colorspace,color...)
」來定義顏色或重新定義特定顏色的色彩空間。*未來:使用示例*半透明色彩
您只能透過兩種方式直接指定半透明顏色。最常見的設定半透明顏色的方法是使用十六進位值。例如,以下是一些顯示各種顏色透明度等級的顏色規範。我已在背景圖案上顯示生成的彩色圖像,以便您可以透過圖像透明度看到該圖案。
magick -size 50x50 xc:'#00FF00FF' color_hex_1.png magick -size 50x50 xc:'#00FF00C0' color_hex_2.png magick -size 50x50 xc:'#00FF0090' color_hex_3.png magick -size 50x50 xc:'#00FF0060' color_hex_4.png magick -size 50x50 xc:'#00FF0030' color_hex_5.png magick -size 50x50 xc:'#00FF0000' color_hex_6.png |
![]() ![]() ![]() ![]() ![]() ![]() |
![]() ![]() |
在 IM v6.3.0 之前,最後一組十六進位數字以「遮罩」或「不透明度」值的格式包含顏色透明度。也就是說,最後的十六進位「00 」代表「不透明」,而「FF 」則代表透明。然而,在 IM v6.3.0 之後,此值被反轉以表示「alpha」透明度值,使 IM 與 SVG 標準和其他圖形包保持一致。換句話說,「 FF 」現在代表完全不透明,「00 」代表完全透明。 |
rgba()
」顏色函數來指定顏色。其中 RGB 值的範圍是 0 到 255,而 Alpha 色版的指定方式是介於 0.0(透明)到 1.0(不透明)之間的小數。
magick -size 50x50 xc:'rgba(255,0,0, 1.0)' color_rgba_1.png magick -size 50x50 xc:'rgba(255,0,0, 0.8)' color_rgba_2.png magick -size 50x50 xc:'rgba(255,0,0, 0.6)' color_rgba_3.png magick -size 50x50 xc:'rgba(255,0,0, 0.4)' color_rgba_4.png magick -size 50x50 xc:'rgba(255,0,0, 0.2)' color_rgba_5.png magick -size 50x50 xc:'rgba(255,0,0, 0.0)' color_rgba_6.png |
![]() ![]() ![]() ![]() ![]() ![]() |
![]() ![]() |
在 IM 6.2.7 版之前,「rgba() 」也使用遮罩值作為 Alpha 色版值。也就是說,值 0 代表完全不透明,255 代表完全透明。根據「W3C CSS3 顏色模組建議用於指定顏色」的定義,這已更改為 IM 更符合其他圖像標準,尤其是 WWW 和 SVG 使用。 |
magick -size 50x50 xc:RoyalBlue color_name_1.png magick -size 50x50 xc:RoyalBlue -alpha set \ -channel A -evaluate set 80% color_name_2.png magick -size 50x50 xc:RoyalBlue -alpha set \ -channel A -evaluate set 60% color_name_3.png magick -size 50x50 xc:RoyalBlue -alpha set \ -channel A -evaluate set 40% color_name_4.png magick -size 50x50 xc:RoyalBlue -alpha set \ -channel A -evaluate set 20% color_name_5.png magick -size 50x50 xc:RoyalBlue -alpha set \ -channel A -evaluate set 0 color_name_6.png |
![]() ![]() ![]() ![]() ![]() ![]() |
|
|
![]() ![]() |
請注意,完全透明的顏色雖然完全不可見,但仍然具有顏色。但是,大多數 IM 運算子都認為任何完全透明的顏色都與任何其他完全透明的顏色相同。因此,由於這種方式和內部數學運算方式,許多運算子通常會將完全透明的顏色替換為完全透明的黑色(也稱為特殊顏色「none 」)。 |
顏色通道
圖像的實際顏色數據以值的陣列形式儲存,稱為通道。通常,圖像至少有 3 個通道,分別代表紅色、綠色和藍色的顏色值。但正如您在上面看到的,儲存的值可以代表其他色彩空間。色彩空間和通道命名
「-colorspace
」運算子的主要目的是改變 IM 在記憶體中儲存圖像顏色的方式。通常每個圖像都有 3 個(或 4 個)圖像資料通道。圖像目前的「色彩空間」決定了每個通道的資料代表什麼。通常這些通道被命名為「紅色」、「綠色」、「藍色」,因為這通常是儲存在這些通道中的圖像資料類型。然而,情況並非總是如此。不要將「R」或「紅色」通道視為紅色,而是將其視為「通道 1」,它可以包含「紅色」、「色調」、「青色」或其他內容的資料,具體取決於圖像的色彩空間。「紅色」只是一個標籤,通常用於「紅色」或第一個通道。第二個最常用的色彩空間是「CMYK
」,它定義了應該應用於使「白色」紙張變暗的顏色「墨水」量(一種減色色彩空間)。請注意,K 是「blacK」(黑色)的縮寫,它是圖像強度的反轉值。由於這非常普遍,「RGB」通道也有一個替代名稱,即「青色」、「洋紅色」和「黃色」,或者僅僅是字母「C」、「M」和「Y」,儘管實際上它們指的是與「RGB
」圖像相同的通道集。還為「黑色」或「K」顏色通道添加了一個特殊的第四個顏色通道。這基本上意味著「綠色
」的顏色通道實際上指的是與「洋紅色
」相同的顏色通道。資料本身是「綠色」還是「洋紅色」並不取決於通道的名稱,而是取決於記憶體中圖像的「色彩空間」。其他色彩空間也會發生同樣的情況。例如,使用「LAB
」色彩空間意味著「紅色」通道包含「亮度」值,而「綠色」通道包含「A」(或紅綠)值,而「藍色」通道包含「B」(或藍黃)值。同樣,通道名稱「
Alpha
」(「A
」)、「Opacity
」(「O
」)和「Matte
」都是指圖像透明度資訊的「-channel
」設置的別名。 「alpha」通道是「matte」通道的反轉並不重要,它仍然指的是相同的通道,並產生相同的結果,即圖像的內部遮罩通道。運算子是將內部 alpha 通道資料視為「alpha」值還是「matte」值取決於運算子本身。像「-threshold
」這樣的低級通道運算子會處理記憶體中通道的原始「matte」資料。然而,大多數高級運算子,如「-fx
」和「-composite
」,會將這些資料視為表示「alpha」資料,以進行運算。還有一種方法可以控制儲存的圖像資料的色彩空間。「-set colorspace
」(IM v6.4.3-7 中添加)只會更改記憶體中的「色彩空間」設置。也就是說,它可以將 RGB 圖像變成 HSL 圖像,但不會更改或修改圖像正在使用的實際像素資料。最典型的用法是當您手動組合通道資料以設置組合圖像的最終色彩空間時。現在讓我們看看如何操作顏色通道。請記住,每個通道都只是一個值陣列。然後,所有通道將組合在一起,以表示圖像中每個像素的實際顏色。
分離通道影像
分離單個顏色通道的最簡單方法是使用「-separate
」運算子將每個通道的當前內容提取為灰度圖像。
magick rose: -channel R -separate separate_red.gif magick rose: -channel G -separate separate_green.gif magick rose: -channel B -separate separate_blue.gif |
![[IM Output]](../images/rose.gif)

![[IM Output]](separate_red.gif)
![[IM Output]](separate_green.gif)
![[IM Output]](separate_blue.gif)
![]() ![]() |
在 IM v5 及之前的版本中,「-channel 」不僅是後續圖像操作的設定,而且有時還是一個「圖像運算符」,它將指定的通道轉換為灰度圖像。非常令人困惑!
在 IM v6 中,創建了「 |
-separate
」運算符允許您根據「-channel
」設定分離多個顏色通道。「-channel
」設定中的項目數量將決定創建的圖像數量(以 RGBA 順序)。例如,由於預設的「-channel
」設定是「RGB
」,預設操作是創建三個圖像,我在下面輸出。在這裡,我們使用「-colorspace
」運算符將 IM 儲存圖像顏色數據的方式變更為CMYK 顏色表示。然後我們提取涉及的四個顏色通道。最後一張圖像(「黑色
」或「K
」通道)特別有趣,因為它看起來像是原始圖像的負片灰度圖像。實際上,它代表了 CMYK 印表機應該在紙張上沉積的「墨水」量,減少了其他顏色通道所需的顏色量。請注意,預設情況下,「-channel
」設定不包括圖像的特殊遮罩透明度通道。如果您想始終產生存在的所有通道,您可以使用「-channel ALL
」通道設定,或者使用「RGBA
」或「CMYKA
」「-channel
」設定。來自色彩空間表示的灰度通道
您可以從色彩空間中提取特定的通道值,以用於特殊目的。例如,在這裡,我們使用多種不同的表示形式從玫瑰圖像中提取圖像的灰度亮度或強度。
magick rose: -colorspace Gray channel_gray.gif magick rose: -grayscale Rec709Luma channel_luma709.gif magick rose: -grayscale Rec601Luma channel_luma601.gif magick rose: -colorspace HSI -channel B -separate channel_average.gif magick rose: -colorspace HSL -channel B -separate channel_lightness.gif magick rose: -colorspace HSB -channel B -separate channel_brilliance.gif magick rose: -colorspace CMYK -channel K -negate -separate channel_black.gif magick rose: -colorspace LAB -channel R -separate channel_lab_light.gif |
![]() Gray Gray |
![]() Rec709 亮度 |
![]() Rec601 亮度 (Y) YUV/YIQ |
![]() 平均值 (I) HSI/OHTA |
![]() 明度 HSL |
![]() 亮度 HSB |
![]() 負片黑色 CMYK |
![]() 亮度* LAB / LUV |
-colorspace
」選項的說明。請注意,從 IM v6.7.7 版本開始,灰度圖像在內存和保存時都不會進行伽瑪或 sRGB 調整。因此,它們往往比這個版本之前的版本更暗。請注意,「Gray」(也稱為「Intensity」或更準確地說是「Luminance」)和 YUV 色彩空間中的「Luma」是等效的。同樣,HSB 色彩空間中的「Brightness」和 CMYK 色彩空間中的反轉「blacK」通道也是等效的(對於灰度圖像來說,它們通常過亮)。請注意,LAB(以及 LUV)色彩空間中的「Lightness*」通道(不要與 HSL 中的「Lightness」混淆)被認為與人類視覺感知最匹配,儘管它不常被用於生成灰度圖像。請注意,如果給定一個灰度圖像,則所有色彩空間的灰度圖像都會產生與輸入灰度圖像完全相同的圖像,但 LAB/LUV 色彩空間的「Lightness*」(「R
」)通道圖像除外。其他通道分離方法
一種方法是將一個通道複製到所有其他通道,以生成灰度圖像,就像分離運算符生成的那樣。一種簡單但速度較慢的方法是使用FX DIY 運算符。
magick rose: -fx R channel_red.gif magick rose: -fx G channel_green.gif magick rose: -fx B channel_blue.gif |
![[IM Output]](../images/rose.gif)

![[IM Output]](channel_red.gif)
![[IM Output]](channel_green.gif)
![[IM Output]](channel_blue.gif)
-fx
」快得多。合併RGB通道影像
將所有圖像顏色通道分離並處理完畢後,您還需要能夠將這些圖像重新組合在一起。這可以使用特殊的列表運算符「-combine
」來完成,它基本上與「-separate
」相反。
magick separate_red.gif separate_green.gif separate_blue.gif \ -combine -set colorspace sRGB rose_combined.gif |
![[IM Output]](separate_red.gif)
![[IM Output]](separate_green.gif)
![[IM Output]](separate_blue.gif)

![[IM Output]](rose_combined.gif)
-combine
」創建一個聲明為 sRGB 色彩空間的圖像。一位用戶希望能夠交換圖像的紅色和藍色通道,這很容易做到,只需分離通道、交換並重新組合即可。
|
![]() |
-channel
」設置為「RGB
」,它定義了要組合在一起的圖像通道圖像。如果並未定義要組合在一起的所有通道,則其他通道將使用當前「-background
」設置中的顏色值進行設置。但是,您應該注意,「-combine
」和「-separate
」都會忽略「-channel
」中定義的通道順序。對於「-channel
」設置中設置的每個通道集,通道將始終按照標準的「Red,Green,Blue,Matte
」通道順序進行處理和生成。因此,即使您使用「-channel BR
」設置或僅使用「blue,red
」,「-combine
」運算符仍然希望這兩個圖像首先是紅色,然後是藍色。綠色和 alpha 值(如果圖像具有透明度)將根據當前的「-background
」設置值進行設置。例如...
magick separate_red.gif separate_blue.gif -background black \ -channel blue,red -combine rose_red_blue.gif |
![[IM Output]](separate_red.gif)
![[IM Output]](separate_blue.gif)

![[IM Output]](rose_red_blue.gif)
合併非RGB通道影像
從 IM v6.4.3-7 版本開始,您也可以使用「-combine
」來組合代表其他色彩空間的通道影像,但您需要告訴 IM 結果影像應該使用哪種色彩空間。這可以使用特殊的「-set colorspace
」運算子來完成。這基本上會改變記憶體中影像的色彩空間,但不會映射影像的像素數據,使其保持原樣。一旦影像在正確的色彩空間中組合完成,您就可以使用一般的「-colorspace
」運算子將像素數據映射回普通的 RGB 數據。
|
![]() |
|
![]() |
|
![]() |
-set colorspace
」運算,第一個通道的數據將已經就位,因為這不會改變實際的像素數據,只會改變數據的解釋方式。![]() ![]() |
最後一個範例不適用於「CMYK 」影像,因為「黑色 」通道影像實際上並不包含黑色通道!因此,「-compose CopyBlack 」將找不到要複製的有效數據。我認為這是一個錯誤,但目前不太可能修復。 |
使用其他色彩空間可能很有用。例如,這裡我使用內建的玫瑰影像,並希望在「
Lab
」色彩空間中反轉影像的亮度通道。完成後,我再次組合以建立 sRGB 影像。
|
![]() |
![]() ![]() |
以前這個範例使用的是「HSL 」色彩空間,但這是一個線性色彩空間,而我們希望在「Lab 」提供的「感知色彩空間」中進行反轉。 |
-negate
」替換為您自己的一組運算,以調整影像的亮度級別。但是,由於「-negate
」本身就是一個通道控制運算子,因此我們不需要「-separate
」亮度通道來反轉它。
|
![]() |
將色彩通道歸零
有時您會遇到一個影像(RGB 或其他色彩空間),您只想清除或「歸零」其中一兩個色彩通道,但保留所有其他通道的原樣。例如,要製作灰階影像而不使用 RGB 灰階技術,您可以將 HSL 色彩空間中的飽和度通道(「G
」)「歸零」,以製作灰階影像。當飽和度為零時,「色相」值沒有意義,因此您將得到一個灰階影像。最直接的技術通常是使用評估運算子將不需要的通道中的所有值歸零...
|
![]() |
# Evaluate (fast and direct) -channel G -evaluate set 0 +channel # FX zeroing (direct simple, but slow) -channel G -fx 0 +channel # Separate the channels you want to keep, # then combine using a background color to set the other channels -channel RB -separate -background black -combine +channel # Gamma which is a miss-use of the operator, but works VERY well! # ( 1 = leave alone; 0 = zero channel; -1 = maximize channel ) # This is short, simple , needs no channel setting, but very obtuse! -gamma 1,0,1 # Threshold channels to zero -channel G -threshold 101% +channel # Threshold to maximum value then negate to zero -channel G -threshold -1 -negate +channel # Multiply with an appropriate primary/secondary color # The color specifies the channels to preserve! 'magenta' = 'red'+'blue' \( +clone +level-colors magenta \) -compose multiply -composite # Colorize specific channels to black # (0 = leave alone; 100% set from fill (black) ) -fill black -colorize 0,100%,0 |
色彩空間
到目前為止,我們一直專注於「sRGB
」、「RGB
」和「CMYK
」色彩空間。這是因為這些色彩空間通常用於圖像在檔案中的顯示、列印和傳統儲存。但是,雖然這些色彩空間很實用,但它們並不能代表我們人類實際上如何看待世界。我們的眼睛可能以紅色、綠色和藍色波長觀看,但我們的大腦將其解釋為:色調(什麼顏色)、灰度(色彩鮮豔度)和強度(亮度/暗度)。因此,已經開發出許多色彩空間和色彩系統,這些系統通常來自完全獨立的需求。例如,畫家開發了一種顏色系統(基於青金石等顏色來源)、色度和著色。後來使用 RGB 的電腦系統需要更好的方法讓用戶選擇或修改顏色,而且計算量不會太大。 基於色調的色彩空間
循環色調系統可能是最廣為人知的替代方案之一,它是作為 RGB 顏色的顏色選擇介面而開發的。基本上,RGB 顏色立方體在 3 個維度中旋轉,使得立方體的黑色-灰色-白色對角線軸成為色彩空間的一個軸。這就指定了顏色的深淺。這種變化的一個主要特點是可以簡單地從 RGB 值轉換,這些值將原色均勻地分佈在這個軸周圍,從而形成一個從紅色到綠色、再到藍色、最後回到紅色的循環色調。顏色與該軸的距離(徑向)稱為飽和度或色度。例如,讓我們在將內建的「
rose:
」圖像轉換為「HSB
」(色調、飽和度、亮度,也稱為 HSV,其中 V 代表值)色彩空間後,分離 其通道。或者類似但不太一樣的「HSL
」(色調、飽和度、亮度)。請注意,兩個色彩空間中的「色調」通道圖像如何都是幾乎純粹的黑白顏色斑點。這是因為色調實際上是循環的。也就是說,上述通道圖像中的黑色和白色實際上都是「紅色」色調的表示,而輕微的變化會導致色調從紅色的一側(產生白色)翻轉到另一側(產生黑色)。如果這是一個問題,您可以使用調製運算子旋轉色調設定,以便紅色由其他一些色調值表示。「HSL
」和「HSB
」之間的真正區別在於原色的亮度是如何定義的。但為了瞭解這一點,我們最好使用色輪來查看更實用的色彩空間表示。如果您查看上述分離中最後的「亮度」圖像,您會發現「HSB
」將強烈的(接近原色)「紅色」視為幾乎是白色,而「HSL
」將其視為更像是中間色調的灰色強度。 生成 HSL 色輪
以上從圖像中分離出的原始顏色仍然難以理解。為了更好地理解色彩空間,我們需要嘗試並查看它。色彩空間通常表示為圓形極坐標漸變,顯示色彩空間的某些部分。您可以生成單獨的通道值圖像,並組合這些圖像以生成特定類型的圖像,而這些圖像是難以用其他方式生成的。例如,這裡我們生成了一個完美的「HSL
」色輪。
magick -size 100x300 gradient: -rotate 90 \ -distort Arc '360 -90.1 50' +repage \ -gravity center -crop 100x100+0+0 +repage angular.png magick -size 100x100 xc:white solid.png magick -size 100x100 radial-gradient: -negate radial.png magick angular.png solid.png radial.png \ -combine -set colorspace HSL \ -colorspace sRGB colorwheel_HSL.png |
![]() 色調 |
![]() 飽和度 |
![]() 亮度 |
![]() |
![]() HSL 色輪 |
![]() ![]() |
灰階圖像是使用 sRGB 值作為線性漸變生成的。因此,漸變看起來往往比實際要暗一些。然而,重要的是這裡輸入圖像中的值,而不是查看色彩空間。 另一方面,產生的圖像雖然是在線性 RGB 色彩空間中生成,但會以 sRGB 色彩空間儲存,以確保瀏覽器和其他圖像顯示程序能以視覺上良好的方式顯示漸層。 |
有許多色彩空間也使用這種相同的「六角錐」為基礎的色相系統。HSB、HCL 和 HCLp(感知 HCL)。以下是所有這四種「六角錐」色彩空間的色輪。
magick angular.png solid.png radial.png \ -combine -set colorspace HSL \ -colorspace sRGB colorwheel_HSL.png magick angular.png solid.png radial.png \ -combine -set colorspace HSB \ -colorspace sRGB colorwheel_HSB.png magick angular.png solid.png radial.png \ -combine -set colorspace HCL \ -colorspace sRGB colorwheel_HCL.png magick angular.png solid.png radial.png \ -combine -set colorspace HCLp \ -colorspace sRGB colorwheel_HCLp.png |
![]() HSL |
![]() HSB |
![]() HCL |
![]() HCLp |
HSB
」色彩空間會產生最大亮度的原色(HSL 在半強度下產生這些顏色)。因此,只有在飽和度為零時才能產生白色。因此,您會在邊緣周圍獲得完全飽和的顏色,而不是白色區域。「HCL
」色彩空間使用相同的「六角錐」色相計算,但它會調整「亮度」通道,以便使用顏色強度,而不是直接的線性 RGB 值。因此,當使用「HCL
」時,原色位於不同的強度級別,藍色更靠近中心黑色,而紅色更亮且更遠。「HCL
」色彩空間的 50% 強度區域不會產生強烈的顏色,而是會產生更自然的柔和色彩。例如,以下是 HSL 和 HCL 色彩空間在 50% 強度下的飽和色相比較。
magick -size 100x100 xc:black \ -fill white -draw 'circle 49.5,49.5 40,4' \ -fill black -draw 'circle 49.5,49.5 40,30' \ -alpha copy -channel A -morphology dilate diamond anulus.png magick hue_angular.png -size 100x100 xc:white xc:gray50 \ -combine -set colorspace HSL -colorspace RGB \ anulus.png -alpha off -compose Multiply -composite \ anulus.png -alpha on -compose DstIn -composite \ -colorspace sRGB hues_HSL.png magick hue_angular.png -size 100x100 xc:white xc:gray50 \ -combine -set colorspace HCL -colorspace RGB \ anulus.png -alpha off -compose Multiply -composite \ anulus.png -alpha on -compose DstIn -composite \ -colorspace sRGB hues_HCL.png |
![]() HSL/HSB |
![]() HCL |
HCL
」不包含純色,只是它們不像在「HSL
」色彩空間中那樣被「強制」到一個共同的平面上。特別要注意的是,HCL 中的所有色調都具有相同的 50% 強度(如所要求),這與 HSL 色彩空間色相的結果不同。綠色可能是所有主要顏色中最接近 50% 強度的顏色,因此在 50% 色相中具有良好的響應。建議您使用此色彩空間進行色相旋轉,以便保留圖像中所有顏色的一般亮度。請參閱 在 HCL 色彩空間中調整 中的範例。 HWB 色彩空間??? 感知色彩空間
色彩空間「Lab
」和「Luv
」的設計旨在將灰度強度與圖像的顏色分量完全分開。這與「RGB
」和「sRGB
」色彩空間不同。這使得色彩空間在您掌握之後更容易處理和修改。更具體地說,「Luv
」的設計是「感知線性的」。也就是說,色彩空間中一個部分的微小顏色變化看起來與色彩空間中另一個部分的類似變化大致相同。這使得 Luv 色彩空間更適合圖像差異比較。這兩種色彩空間非常相似,並且在處理圖像時通常會產生相似的結果。在這裡,我們將色彩空間「Lab
」和「Luv
」的通道分開,以顯示這兩種色彩空間實際上有多麼相似。
magick rose: \( -clone 0 -colorspace LAB -separate +append \) \ \( -clone 0 -colorspace LUV -separate +append \) \ -delete 0 -append -set colorspace sRGB separate_lab_luv.png |
![]() |
![]() |
![]() |
Lab Luv |
Lab
」和「Luv
」色彩空間更好的示例,請參見下方「LCH 色輪」中使用其圓柱形變體「LCHab
」和「LCHvu
」。有關使用這些色彩空間的實際示例,請參見在 Lab 色彩空間中調整大小。基於 Lab 和 Luv 的色彩空間
「HCL
」色彩空間基於「LCHuv
」色彩空間,它是「Luv
」色彩空間的圓柱形表示,但亮度通道的公式更簡單,以便在最大亮度下生成純白色。為求完整性,這裡給出了「Lab
」和「Luv
」色彩空間的圓柱形表示,分別稱為「LCHab
」和「LCHuv
」。但是請注意,通道的順序與上面顯示的等效「HCL
」色彩空間相反。
magick radial.png solid.png angular.png \ -combine -set colorspace LCHab \ -colorspace sRGB colorwheel_LCHab.png magick radial.png solid.png angular.png \ -combine -set colorspace LCHuv \ -colorspace sRGB colorwheel_LCHuv.png |
![]() 亮度* |
![]() 色度 |
![]() 色調 |
![]() |
![]() LCHab |
![]() LCHuv |
LCH
」色彩空間是「LCHab
」的別名。在上面,您可以看到「LCHuv
」在使用色輪程序設置不切實際的顏色時存在不連續性。正常的圖像轉換不會產生這些顏色。scRGB 高動態範圍色彩空間
Wikiepedia: http://en.wikipedia.org/wiki/ScRGB This is essentially a method of storing a High dynamic range color (with negatives and up to 10 times linear RGB range) in a 16 bit integer, with only 1/2 the color resolution of a normal 16-bit sRGB image. As it is using 16bit integers it can be stored in image files formats that can save such images (PNG, PPM, MIFF), though a color profile, or some other method should be used to mark those images as holding scRGB colorspace data. You would have to be very careful, with many image processing operators in this colorspace as it has an 'offset' to allow it to handle negative numbers. And while some operators like resize and distort can be used directly on this colorspace, it is probably a better idea to use a HDRI version of ImageMagick, and magick to linear RGB (with negatives), for more general image processing. Examples and more information on using this colorspace would be good
替換圖像中的顏色
ImageMagick 自然提供了一些選項,可以用另一種顏色替換特定和近似的顏色。這在處理包含很少顏色的圖標和“點陣圖”類型的圖像時非常有用,但在處理包含顏色陰影或抗鋸齒邊緣像素的圖像時往往會失敗。基本上,您需要記住,顏色是由單一色調替換的。因此,如果您替換一組或鄰近的顏色,則所有這些顏色都將被一種特定的單一顏色替換,而不是被匹配的顏色範圍替換。這並不是說不可能進行陰影顏色替換,只是目前做起來並不簡單,需要大量的工作。即便如此,GIF 圖像不允許使用半透明,因此以這種方式替換顏色是控制 GIF 背景透明度的好方法(有關示例,請參見背景圖案上的 GIF)。另一個方面是,雖然您可以使用預定義的顏色映射將所有“接近的顏色”映射到給定的顏色映射,但沒有一個運算符可以直接一對一地將一組顏色映射到另一組完全不同的顏色。這是一個缺點,在 IM 的未來版本中可能會有所改變。需要注意的是,讓我們來看看 IM 提供的用另一種顏色直接替換一種特定顏色的方法。取代特定色彩
「-opaque
」和「-transparent
」運算符專為用另一種顏色替換圖像中的一種顏色而設計。例如,要將“藍色
”替換為“白色
”,您可以使用如下命令...
|
![]() ![]() ![]() |
-fill
」顏色。但是,從 IM v6.2.7 開始,此運算符受「-channel
」設置的限制。因此,要將顏色(例如藍色)變成透明,您需要指定一個「-channel
」來包含 Alpha 通道,以使顏色透明。您還需要確保圖像已啟用“遮罩”或Alpha 通道,以保存透明度信息。
|
![]() ![]() ![]() |
-transparent
」。
|
![]() ![]() ![]() |
|
![]() ![]() ![]() |
![]() ![]() |
在 IM v6.3.7-10 之前,反向操作需要使用圖像遮罩的一些技巧。基本上,您要用透明度替換要保留的顏色,然後使用「-colorize 」將所有其他顏色「著色」為所需顏色以建立覆蓋遮罩。然後將其覆蓋在原始圖像上以「遮罩」不匹配的顏色!
|
![]() ![]() |
請注意,由於所有匹配的顏色(尤其是「模糊匹配的顏色」,請參見下文)都替換為單一均勻的顏色,因此您將不會獲得顏色區域邊緣的任何反鋸齒效果。而且您將失去任何可能存在的陰影或其他陰影效果。這可能會對任何非簡單、非卡通類圖像的外觀產生嚴重的負面影響。 這種顏色替換的設計並非針對實際的真實世界圖像,而是更多地用於圖像遮罩效果。建議謹慎使用。 |
-opaque
」顏色替換無法用平鋪圖案替換顏色。它只會用另一種特定的單一顏色替換顏色。但是「-draw
」和「-floodfill
」顏色替換方法都可以(請參見下文)。使用圖像中的顏色替換
您也可以使用繪製顏色替換根據圖像本身中存在的顏色(而不是特定顏色)對圖像重新著色。
|
![]() ![]() ![]() |
|
![]() ![]() ![]() |
-opaque
」和「-transparent
」不同,繪製顏色替換不允許您反轉要替換的「匹配顏色」。繪製還具有一种特殊的遮罩替換,其中僅替換填充顏色的透明度。也就是說,您可以使所有匹配的顏色變得透明或半透明,而無需實際更改像素本身的顏色。當然,使用適當的檔案格式。
|
![]() ![]() ![]() |
-draw
」的最大優勢在於,您還可以將顏色替換為平鋪圖案。舉例來說..
|
![]() ![]() ![]() |
泛洪填色繪製
「繪製色彩」方法也提供一種簡單的「floodfill」色彩替換方法。也就是說,您不必替換影像中「所有」相符的色彩,只需選取與影像中指定點「相連」或「相鄰」的色彩即可。指定的點不僅會指定起始點(種子點),還會指定您要替換的色彩。
|
![]() ![]() ![]() |
|
![]() ![]() ![]() |
泛洪填色運算子
新增「-floodfill
」運算子的目的是為了讓 Floodfill 更容易操作,特別是當您想要精確指定要替換的色彩時。這在使用「模糊因素」色彩比對時尤其重要。但請注意,如果該種子點不在您要尋找的色彩的「模糊因素」比對範圍內,則「-floodfill
」將不會執行任何操作。這可以被視為該運算子的特性,同時也是它的缺點。
建議 Floodfill 使用較小的「模糊因素」。
或者,確保種子點與要尋找的色彩完全相符。
例如,在邊緣添加已知顏色的邊框,以便從邊緣進行 Floodfill...或者,確保種子點與要尋找的色彩完全相符。
|
![]() ![]() ![]() |
|
![]() ![]() ![]() |
|
![]() |
綠色
」和「藍色
」Floodfill 操作「命中圓盤」(並填充了它),而「紅色
」Floodfill 沒有命中圓盤,因此沒有填充任何圓盤,也沒有意外填充影像的背景。這也表示如果您已經填充了特定區域,則後續的填充操作將不會「重新填充」相同的區域(如果兩個點都命中該區域)。這可以節省大量的時間。您也可以參考「條件擴張」,它表示從影像中的多個「種子」點進行較低層級的 Floodfill 操作。 模糊因素 - 比對相似/多種色彩
如先前範例所示,僅選擇單一色彩進行替換的整體效果通常不太理想。由於反鋸齒的關係,純色區域的邊緣或區域通常會混合多種色彩(如需詳細資訊,請參閱「反鋸齒」)。因此,您應該盡可能避免直接替換色彩。例如,在這裡我拍攝了一張看起來很簡單的黑白「乳牛」影像,並試圖將其變成紅色的乳牛。如您所見,只有「黑色」區域的中心部分實際變成了紅色。這是因為,雖然圖像看起來是黑白的,但它實際上是一個灰度圖像,幾乎所有邊緣都是各種深淺的灰色。也就是說,它們的顏色並非完全純黑色。模糊系數(「-fuzz
」)表示使用圖像正在使用的任何顏色空間,在顏色之間的多維球面距離中的「相似性」匹配。好的,讓我們試着用簡單的英語解釋一下。您有一種特定的顏色。如果另一種顏色與正在尋找的顏色之間的差異小於模糊系數設置,則該顏色將被視為與正在尋找的顏色「相同」。「模糊系數」越大,越「接近」的顏色將匹配並被替換。所以讓我們在我們的牛圖像上嘗試一下,以便不僅將純黑色,而且將接近黑色的顏色都變成紅色。如您所見,我們現在已將圖像的所有「深色」像素替換為紅色。但結果仍然很糟糕,邊緣帶有灰色調,並且有很強的鋸齒效應。直接顏色替換對於此圖像來說不是一個好的解決方案,即使您可以使用較大的「模糊系數」使其工作。有關此圖像的理想解決方案,請參閱按顏色調整色階中的示例。對於您嘗試用透明度替換背景顏色的圖像,此問題甚至更糟。您基本上最終會在該背景顏色上的對象周圍形成一個「光暈」。這很難解決,背景移除中將詳細介紹此類問題。哪些操作使用模糊系數「-fuzz
」運算符幾乎影響任何比較圖像中特定顏色的運算符。這包括:「-opaque
」、「-transparent
」、「-floodfill
」、「-trim
」、「-deconstruct
」、「-draw 'color'
」、「-draw 'matte'
」以及其他可能的操作。它還會影響 GIF「-layers OptimizeTransparency
」和「-compose ChangeMask
」處理。它還會影響「magick compare
」的結果,特別是「-metric AE
」或絕對誤差像素數。模糊因子距離
「-fuzz
」設置實際上是一種顏色「距離」設置。任何在正在尋找的顏色的給定距離內的顏色都將匹配該顏色,即使它不是精確匹配。值「200
」表示在正在使用的 IM 的當前顏色深度中 200 個顏色單位的距離。對於 IM Q16(16 位顏色存儲質量),這非常小,對於 IM Q8,這非常大,並且會導致很多顏色相互匹配。例如,在這裡,我將所有在「blue 」的 30,000 個顏色單位(對於 IM Q16)內的顏色更改為白色。對於我的 Q16 ImageMagick 程序,這大約表示從「blue 」到「navy 」(半深藍色)的距離,
|
![]() |
為了更容易理解,我在這裡反轉匹配的顏色,將不匹配的顏色變為白色。
|
![]() |
如果您的 IM 版本早於 6.3.7-10(添加了「加號」形式的「-opaque 」運算符),則可以使用此遮罩方法來反轉顏色匹配的結果...
|
![]() |
或者可以使用這種方法,將所有修改限制在「Alpha 色版」上,這樣一來,所有原始顏色都將保持不變。也就是說,您需要從顏色選區中建立一個反轉遮罩,以便使所有未選取的顏色完全透明。它們仍然存在,只是變成透明的了!
|
![]() |
這些替代方法的優點在於,您可以擴展它們以產生「非多種顏色」的技巧。您只需要在反轉遮罩之前,將更多顏色添加到要變透明的清單中,並可能移除反轉的透明度。
|
![]() |
![]() ![]() |
順帶一提,在使用 Q8 編譯設定的 IM 中,「-fuzz 」參數設為 256 (28) 將會使「黑色 」和「藍色 」視為相同顏色。對於使用 Q16 設定的 IM,這個數字為 65536 (216)。若要使「 藍色 」和「紅色 」視為相同顏色,則必須將此數字乘以 2 的平方根,對於 IM Q8 為 362,對於 IM Q16 則為 92682。若要使所有顏色都視為相同顏色(例如「 黑色 」和「白色 」),則需要乘以 3 的平方根。換句話說,對於 IM Q8,模糊參數應設為 444,對於 IM Q16 則為 113512。 |
![]() ![]() |
使用「感知」色彩空間(例如「LAB 」或「LUV 」)可能會定義出更好且更真實的顏色距離。在執行模糊顏色比對之前,只需將影像轉換為該色彩空間即可。與在「sRGB 」或線性「RGB 」色彩空間中相比,這將使純藍色和黑色等顏色更接近,而黃色和白色也更接近。 |
-fuzz
」參數設定為百分比,可以簡化其使用。在這種情況下,「100%
」表示足夠大的模糊參數來涵蓋所有顏色。也就是說,它表示 RGB 色彩立方體中從「黑色
」到「白色
」的三維對角線距離。在這裡,我們將所有與白色到黑色距離 90% 以內的顏色都替換為白色。這應該只會留下靠近「黑色 」的最後 10% 顏色在影像上,因為黑色位於 RGB 色彩立方體的對面。
|
![]() |
請注意,這 90% 代表 RGB 色彩立方體中圍繞「白色」的球體顏色。然而,這與替換不在黑色 10% 球體範圍內的顏色不同。
|
![]() |
![]() ![]() |
「-fuzz 」參數設為 100% 相當於 RGB 色彩立方體中從「黑色 」到「白色 」的距離。由此我們可以計算出,大約 57.7% 的百分比是「黑色 」和「藍色 」之間的距離,而 81.6% 是「藍色 」到「紅色 」或從這兩種顏色到「白色 」的距離。總之,任何大於約 25% 的值(略低於「 藍色 」到「深藍色 」的 RGB 距離)都代表非常大的顏色變化。 |
magick colorwheel.png -fuzz 10% -fill white -opaque blue opaque_b10.jpg magick colorwheel.png -fuzz 25% -fill white -opaque blue opaque_b25.jpg magick colorwheel.png -fuzz 57% -fill white -opaque blue opaque_b57.jpg magick colorwheel.png -fuzz 81% -fill white -opaque blue opaque_b81.jpg magick colorwheel.png -fuzz 95% -fill white -opaque blue opaque_b95.jpg |
![[IM Output]](opaque_b10.jpg)
![[IM Output]](opaque_b25.jpg)
![[IM Output]](opaque_b57.jpg)
![[IM Output]](opaque_b81.jpg)
![[IM Output]](opaque_b95.jpg)
blue
」色相距最遠的顏色不是「black
」或「white
」,而實際上是在 RGB 色彩空間中最遠的「yellow
」色。另請注意,81% 的顏色差異將會略過與純「red
」色的匹配,然而,雖然純紅色不匹配其他紅色,但(橙紅色除外)確實匹配。也就是說,再次由於顏色匹配的「球形」性質。寓意是,您最好使用多個小的「-fuzz
」因數匹配或較小的「反向匹配」,而不是單個較大的值。在這裡,我們將圖像中的顏色與另一種顏色(「近乎完美的灰色」)進行比較,隨著「模糊因素」的增加,將相似的顏色更改為相同的灰色。
magick colorwheel.png -fuzz 25% -fill gray50 -opaque gray50 opaque_g25.jpg magick colorwheel.png -fuzz 30% -fill gray50 -opaque gray50 opaque_g30.jpg magick colorwheel.png -fuzz 35% -fill gray50 -opaque gray50 opaque_g35.jpg magick colorwheel.png -fuzz 45% -fill gray50 -opaque gray50 opaque_g45.jpg magick colorwheel.png -fuzz 51% -fill gray50 -opaque gray50 opaque_g51.jpg |
![[IM Output]](opaque_g25.jpg)
![[IM Output]](opaque_g30.jpg)
![[IM Output]](opaque_g35.jpg)
![[IM Output]](opaque_g45.jpg)
![[IM Output]](opaque_g51.jpg)
模糊因素和透明顏色
當匹配涉及透明和半透明顏色時,使用「-fuzz
」因素會變得更加複雜。例如,在這裡,我在圖像中創建了黑色和白色之間的漸變,然後垂直添加透明漸變。然後,我對完美的灰色(即 50% 灰色)進行模糊顏色匹配。在後面的圖像中,我使匹配的顏色更加透明,直到完全透明,但是模糊因素保持恆定的 20%。
magick -size 100x100 gradient: \( +clone -rotate 90 \) +swap \ -compose CopyOpacity -composite trans_gradient.png magick trans_gradient.png -channel RGBA \ -fuzz 20% -fill Gray50 -opaque 'GrayA(50%,1.0)' fuzz_trans_100.png magick trans_gradient.png -channel RGBA \ -fuzz 20% -fill Gray50 -opaque 'GrayA(50%,.75)' fuzz_trans_75.png magick trans_gradient.png -channel RGBA \ -fuzz 20% -fill Gray50 -opaque 'GrayA(50%,.40)' fuzz_trans_40.png magick trans_gradient.png -channel RGBA \ -fuzz 20% -fill Gray50 -opaque 'GrayA(50%,0.0)' fuzz_trans_00.png |
![]() ![]() ![]() ![]() ![]() ![]() |
-channel RGBA
」不是為了顏色匹配,而是為了指定要「填充」的顏色通道。也就是說,如果沒有它,上面將仍然匹配相同的顏色,但灰色的「填充」將保持半透明,並且不會設置為不透明的灰色。如果您想匹配所有顏色而不考慮其透明度,那麼您將需要至少暫時關閉圖像的透明通道。之後您可以再次將其打開,但您的填充顏色將再次具有與原始顏色相同的透明度。在第一張圖像中,與完全不透明的灰色(alpha='1.0
')匹配時,您會得到所有接近不透明灰色的非常球形的匹配。然而,隨著匹配的顏色變得更加半透明,匹配的半透明顏色的數量似乎會變得更大,直到完全透明的灰色匹配任何接近透明的顏色。發生的事情是,隨著透明度的增加,半透明顏色之間的距離減小。與不透明的顏色相比,兩種顏色越透明,它們就越接近。當兩種顏色都完全透明時,這兩種顏色將被視為完美的或「0」距離的匹配。需要注意的另一件事是(從 IM v6.6.6-4 開始),與完全透明顏色(灰色或其他顏色)的距離純粹是顏色透明度(alpha 值)的函數。上圖中的最後一張圖像匹配了所有透明度在 20% 以內的所有像素,而不管實際顏色如何。這也表示,一個大的 模糊係數 與完全透明的顏色(例如「none」)一起使用時,可以用來匹配所有或幾乎所有半透明的顏色。例如...
|
![]() |
-alpha off
" 會移除影像中最後一點的半透明度。因此,"-channel RGBA
" 設定實際上並非必要,但為了完整性,建議使用。這個範例基本上等同於在 alpha 色板套用門檻值,然後在下方加上灰色(使透明顏色變為灰色)。![]() ![]() |
在 IM v6.6.6-4 之前的版本中,模糊顏色匹配無法將完全透明與不透明的顏色同等地匹配。事實上,黑色比白色更接近匹配。因此,最後一個範例將會失敗。如需更多詳細資訊,請參閱 模糊距離與透明顏色錯誤。 |
![]() ![]() |
更糟糕的是,在 IM v6.2.6-2 之前的版本中,模糊顏色匹配並未將所有完全透明的顏色視為相同的顏色。也就是說,完全透明的黑色(也稱為「None」)與完全透明的白色(或顏色 '#FFF0')並不相同,即使它們都是完全透明的。 |


Color maths (get the average of two or more colors).... Example Averaging two colors... Say '#000000' and '#DDDDDD' Generally the colors are added to images, and the result output as a single pixel 'txt:-' image, which which the color can be extracted. * use -resize to merge the colors magick -size 2x1 xc:'#000000' -fill '#DDDDDD' \ -draw 'point 0,0' -resize 1x1 txt:- * Use -evaluate-sequence mean on them! magick -size 1x1 xc:'#000000' xc:'#DDDDDD' \ -evaluate-sequence mean txt:- Or for a lot of colors you can use the 'Box' resize filter magick rose: -filter Box -resize 1x1\! txt: # ImageMagick pixel enumeration: 1,1,255,RGB 0,0: (145, 89, 80) #915950 * Use -fx to apply whatever formula you want magick -size 1x1 xc:'#000000' xc:'#DDDDDD' \ -fx '(u+v)/2' txt:- With an ImageMagick API the results can be more directly retrieved from the image.