ImageMagick 範例 --
色彩基礎與通道

索引
ImageMagick 範例前言與索引
什麼是色彩
Gamma校正與sRGB色彩空間
色彩指定
色彩通道
色彩空間
取代影像中的色彩 (取代特定色彩)
點陣圖(ImageMagick 通常處理的影像類型)基本上是由單獨的點或像素組成的陣列。在本節中,我們將探討修改單獨的點以及它們的表示方式。在下一節中,我們將探討更全面地修改整個影像的色彩。

什麼是色彩?

要真正瞭解顏色,您需要確切知道顏色是什麼。在物理世界中,顏色實際上是一種幻覺。我們之所以能看見顏色,是因為我們的眼睛以一種非常特殊的、有限的方式感知物理世界。基本上,我們的眼睛中有特殊的感測器,分別用於感知紅色、綠色、藍色,還有一個不太重要的感測器用於周邊和低光條件。後者就是為什麼我們在晚上只能看到灰色。 IM 圖表 如需更多資訊,請參閱 維基百科,視錐細胞,右側的圖表顯示了典型人眼對不同波長光的反應。正因為如此,我們只能透過紅色、綠色和藍色電磁波長來感知世界,這也是為什麼圖像和圖像處理通常都與紅色、綠色和藍色(或稱 RGB)有關。然而,事情並非如此簡單。我們的每個顏色感測器實際上都會對一定範圍的波長做出反應。例如,當我們看到黃光時,我們實際上是同時使用紅色和綠色感測器來感知光線。如果我們的顏色感測器只是嚴格的純紅色和綠色探測器,我們根本就看不到任何黃色。事實上,彩虹中會出現「間隙」。這意味著電視或電腦顯示器實際上是在欺騙我們,讓我們看到黃色,因為顯示器發出的是適當比例的紅光和綠光混合,而不是真正的黃光。我們的顏色感測器看到的強度與純黃光的強度相同,因此我們看到了黃色,儘管實際上我們看到的是兩種不同的顏色頻率。我們只是無法區分純黃色和紅光與綠光的混合。同樣地,藍紅色(紫色)實際上並不存在於單一特定波長中,而只是至少兩種顏色頻率的混合,儘管嚴格來說,紫色是一種我們確實會做出反應的特定頻率,主要是由藍色感測器感知,其他兩種感測器則非常輕微。請注意,我們實際上還有第四種視覺感測器,但它不是顏色感測器,而是一種低光探測器,用於夜視,當視錐細胞無法正常工作時就會使用它。這就是為什麼夜晚看起來是單色的,而月光都是灰色的。這種感測器可能也是 sRGB 色彩空間(見下文)在非常暗的顏色中有一個奇怪的線性分量的。題外話:其他動物的感測器與我們不同。蜜蜂和大多數其他昆蟲都有感知紫外線的感測器,因此對牠們來說,我們的印刷圖像、電視和廣告牌可能毫無意義。更有可能的是,這些人造圖像在牠們眼中看起來更像是一幅相當可怕的偽彩色圖像,而不是我們人類被欺騙而看到的近乎完美的顏色。有些動物有 4 種顏色感測器,而有些動物只有一種(黑白)或兩種。此外,有些動物對運動的感知比對任何特定顏色的感知都要好得多。例如,公牛看不到紅色,只能看到藍紫色和綠色的波長,但一頂飄動的帽子在牠們眼中會顯示為一種「運動」顏色的火焰。對公牛來說,顯示器 50/60Hz 的更新頻率可能看起來像是一團「運動」的火焰,而不是任何清晰的圖像!如需更多資訊,請參閱 維基百科,色覺維基百科,顏色

RGB 色彩空間和通道

所以 RGB 色彩空間實際上是一種使用紅、綠、藍三種顏色值來表示圖像的方式,它會讓我們誤以為看到了真實世界中的事物。因此,圖像可以存儲為 3 個數值陣列,其中三個值中的每一個值形成一個單獨的像素或顏色點以進行顯示。這三個數值陣列中的每一個都被稱為一個通道,它只是一個灰階圖像,表示為我們的三個顏色感應器中的一個創建的光量。例如,以下是玫瑰圖像的紅色、綠色和藍色分量。
[IM Output]
玫瑰
==> [IM Output]
紅色
[IM Output]
綠色
[IM Output]
藍色
請注意「紅色」圖像在顯示玫瑰時比其他兩種顏色分量亮得多。但所有三張圖像的底部附近的白色區塊都很亮。RGB 是加色現在,紅色、綠色和藍色被稱為「加色」。也就是說,這些顏色加在一起形成最終的彩色圖像。這是因為這些顏色是我們眼睛看到的主要顏色,通過將它們組合在一起,我們可以有效地產生我們眼睛幾乎可以看到的每種顏色。它們是加色的,因為從黑色開始(例如空白的顯示器),然後添加紅色、綠色和藍色光以生成我們看到的圖像的適當顏色。這樣做的關鍵是你從黑色或沒有光開始,然後添加適當數量的紅色、綠色和藍色。你也可以在黑暗的房間裡用三支手電筒,在末端貼上紅色、綠色和藍色的玻璃紙,來獲得同樣的效果。當三種顏色照射在同一個地方(例如白牆上)時,我們會看到白色。正是因為我們的眼睛實際上是如何看到這些「原色」的,所以彩色圖像通常用 RGB 值來表示,RGB 值也被稱為「顏色通道」。

CMY色彩空間

當你列印時,你會遇到一個不同的問題。一張紙不能產生光,只能反射光。因此,你需要從一個表面開始,該表面反射所有照射到它的光,朝向各個方向。也就是說,這就是白色的表面。希望它反射的光本身就是純白色的光,可以來自窗外的陽光,也可以來自我們人工照明的房間裡的燈光。現在,要在紙上創建圖像,你需要在紙上塗抹油墨,這實際上去除了特定波長的光。由於我們「感覺」到紅色、綠色和藍色,所以我們希望從那張白紙反射的光中選擇性地去除這些顏色。因此,我們使用青色墨水去除紅光,品紅色去除綠光,黃色去除藍光。產生特定顏色所需的青色、品紅色和黃色墨水的量產生了所謂的 CMY 色彩空間。在這裡,我生成了僅使用青色、品紅色和黃色墨水生成玫瑰圖像所需的墨水遮罩(假設墨水是「線性」的)
[IM Output]
玫瑰
==> [IM Output]
青色
[IM Output]
品紅色
[IM Output]
黃色
也就是說,青色遮罩值越亮,需要越多的青色墨水來去除越多的紅色。換句話說,青色遮罩是我們希望紙張反射的紅光量的反面。事實上,上述所有三個通道圖像都是為 RGB 色彩空間生成的圖像的反面。所以,要將 RGB 圖像轉換為 CMK 圖像,你需要做的就是反轉圖像,然後聲明圖像為 CMY 色彩空間。由於我們選擇性地去除波長,因此青色、品紅色和黃色被稱為「減色」。

CMYK色彩空間

選擇性移除波長的主要問題在於,僅僅通過應用青色、洋紅色和黃色三種墨水來移除所有紅色、綠色和藍色光,實際上並不能移除所有被反射的光。結果你不會得到黑色,而是一種難看的泥濘棕色。墨水(或濾光片)並不完美,就像我們自己的眼睛並不完美一樣。正如我之前提到的,我們的每個顏色感應器並不僅僅看到單一波長的光,而是將一定範圍的波長解釋為“紅色”、“綠色”或“藍色”(或這些顏色的混合)。以至於我們的“藍色”光感應器實際上可以看到一點紫外線(雖然不是很清楚)。題外話:“黑光”的濾光片故意設計得不完美,以便我們可以“剛好看到”來自這種燈的光,這樣我們就可以知道它是打開還是關閉。正是由於 CMY 墨水的這種顏色“洩漏”,以及我們自己不完美的眼睛,我們在混合中添加了純黑色墨水,使其能夠消除所有可能從紙張反射的光。為了防止與藍色混淆,黑色墨水或通道被分配了字母 K。因此,為了印刷,我們使用四種彩色墨水:青色、洋紅色、黃色和黑色(blacK);並使用這些墨水定義圖像,形成 CMYK 顏色空間。例如,以下是從此圖像中分離出來的相應 CMYK 分量。
[IM Output]
玫瑰
==> [IM Output]
青色
[IM Output]
品紅色
[IM Output]
黃色
[IM Output]
黑色(blacK)
請注意,青色、洋紅色和黃色的數量是如何減少的,並且現在比 CMY 顏色空間中更暗,因為它們的使用被適當數量的黑色所取代。也就是說,當特定像素存在所有三種墨水時,將使用黑色代替。因此,要打印例如純黑色,您只需使用純黑色墨水,而無需其他墨水。請記住,上面“blacK”中的“K”是指要應用於一張紙的黑色墨水的量,因此灰度通道圖像越亮,應使用的黑色墨水就越多。因此,它也是一個負片圖像,就像其他三個圖像一樣。當然,在彩色打印機中添加純黑色可以使黑色文本的打印變得更加簡單,因為您不再需要打印三種不同的墨水,並將它們完美地疊加在同一點上,以生成純黑色的線條、字母和形狀。這意味著使用的墨水更少,紙張變得更“乾”,並且不太可能出現洇染或污跡,這對打印機來說尤其有利。有關 RGB 和 CMYK 顏色如何工作的另一個類似討論,請參閱XaraXone 工作簿,定義顏色的介紹頁面。

其他色彩空間

其他顏色空間只是表示相同顏色的其他方式,或者表示我們不完美的眼睛也可以分辨出的嚴格 RGB 以外的一些其他顏色。但是,此類顏色空間與使用顯示器顯示這些顏色或打印這些顏色幾乎沒有關係。它們基本上代表了處理和/或處理圖像顏色的其他方式,以便增強或突出顯示特定內容,例如...
  • 更好的暗色非線性處理(sRGB
  • 彩虹色和色調(HSB、HSL、HSI、OTHA 顏色空間 - 不保留強度)
  • 標準化定義顏色(XYZ
  • 精確或感知色差(LABLUV 顏色空間,以及它們的 LCHab 和 LCHuv 循環色調等效)
  • 擴展高動態範圍(用於 HDRI 圖像)(scRGB
  • 更好的顏色值壓縮(例如在 YIQYUV 中)
  • 電視傳輸(YCbCr、YPbPr,其中 Y = 黑白信號)
我尚未提及的最後一個色彩空間是「灰階」,但那只是一個簡單的像素值單一陣列。您如何解讀這些值是可變的,因為它們可以代表許多不同的東西。通常,此類圖像被認為是線性灰階,類似於線性 RGB(與非線性 sRGB 相對)。實際上,IM 版本 6 沒有這樣的灰階色彩空間,只是使用線性 RGB 色彩空間偽造它,將所有 RGB 設置為相同的值。如果三個值不相同,則圖像不再是灰階。IM 版本 7 的灰階是單通道圖像(內存使用量小得多)。
以上對圖像「色彩空間」的更改只是對內存中圖像顏色的粗略排列。它還在不同色彩空間之間提供非常基本(簡單)的色彩轉換。

對於精確的顏色規格和顏色轉換,應改用顏色配置文件,但僅在使用可以處理顏色配置文件的圖像文件格式時才有效。


伽瑪校正和 sRGB 色彩空間

人類色彩感知

在上面我們看到您可以用許多不同的方式來表示圖像。我們上面看到的所有色彩空間都被稱為「線性」色彩空間,這意味著使用的實際值表示圖像中顏色的實際「強度」值。
然而,現實生活從來沒有這麼簡單。從來沒有!例如,讓我們用一個簡單的線性灰度值序列生成並保存一個圖像...

  magick -size 100x100 gradient:'gray(100%)-gray(0)' \
          -set colorspace sRGB gradient.gif
[IM Output]
注意事項...
  • 使用「gradient:'gray(100%)-gray(0)'」可確保 IM 生成線性 RGB 數據的漸變,該漸變將採用線性 RGB 色彩空間。
  • 「-set colorspace sRGB」告訴 IM 這個「線性」漸變實際上是「sRGB」,因此在保存到只能存儲 sRGB 色彩空間值的 GIF 圖像文件格式時不需要「校正」。
現在,此圖像中使用的實際顏色值是一個線性漸變,應該從頂部的白色平滑地變化到底部的黑色,中間是數學上精確的 50% 灰色。但是,如果您查看圖像,您會發現圖像實際上似乎包含比淺色(接近白色)更多的深色(接近黑色)。為什麼?好吧,當給定的人眼可見光強度僅為其最大範圍(「白色」)的一半時,人眼看到的不是顏色值指示的純中間色調灰色,而是更深的顏色。因此,上述線性漸變看起來不像從白色到黑色的均勻線性顏色分佈,而是比應有的深色更多。實際圖像值與感知值的關係大致是以下形式的「冪函數」...
perceived_grey = value2.2

值「2.2」是平均伽瑪函數值,是大多數人類的典型值。

Gamma校正

伽瑪校正是調整實際保存的顏色值的一種方法,以便最終圖像在其顏色分佈中看起來更加均勻。基本上,雖然人眼使用 2.2 的冪因子使光線看起來更暗,但要使線性圖像「看起來」線性,我們需要使用 1/2.2 的值來反轉該冪函數。也就是說,要使圖像看起來是線性的,我們需要使用以下公式對其進行校正...
gamma_corrected_value = value1/2.2

IM 通過級別運算符、伽瑪參數或更具體地使用伽瑪運算符來提供伽瑪校正。但是,您也可以使用評估 POW 函數直接修改圖像值。

因此,讓我們應用它並查看「伽瑪校正圖像」的結果..

  magick -size 100x100 gradient:'gray(100%)-gray(0)' -gamma 2.2 \
          -set colorspace sRGB gradient_gamma.gif
[IM Output]
請注意圖片現在如何擁有更等量的淺色和深色。 然而,圖片中的實際值不再是「線性的」,這會在之後處理此圖片時造成問題。 Gamma 校正只是一種粗略的「快速」方法,用於調整顏色以使圖片「看起來」正確。 它不是校正人類反應圖片的常用方法,甚至不是最佳方法。 有關對圖片處理執行 Gamma 校正的更具體範例,請參閱 使用 Gamma 校正調整大小 有關 Gamma 校正的更多資訊,請參閱您可能還想查看“-auto-gamma”運算子,它會嘗試調整 Gamma 以產生線性 RGB 圖片,其中包含等量的淺色和深色(在線性空間中)。

螢幕的Gamma值

從顯示器后退幾公尺(碼),然後查看左側的圖片。 如果您的顯示器(和網頁瀏覽器)正確顯示 sRGB 圖片,則中央「雜湊」圖案的亮度與周圍 sRGB 漸變大致相同的點應該位於正中間。 大多數電腦顯示器都無法通過此測試!但是 HDMI 電視應該可以完美通過。 該圖片是使用以下方法建立的...

  magick -size 45x256 gradient: -size 10x256 pattern:gray50 \
          -duplicate 1,0 +append -set colorspace sRGB -colorspace RGB \
          monitor_sRGB.png
[IM Output]
以下是一些具有不同「Gamma」級別的類似圖片,因此您可以查看顯示器的 Gamma 級別與人類感知的正確「2.2」Gamma 顯示器的接近程度。

  for gamma in 1.6 1.8 2.0 2.2 2.4
  do
    magick -size 45x256 gradient: -size 10x256 pattern:gray50 \
            -duplicate 1,0 +append -gamma $gamma monitor_g$gamma.png
  done
[IM Output]
Gamma 1.6
[IM Output]
Gamma 1.8
[IM Output]
Gamma 2.0
[IM Output]
Gamma 2.2
[IM Output]
Gamma 2.4
(當您后退時)亮度相等的點位於 50% 標記附近的圖片,可以告訴您顯示器的大致 Gamma 級別。 如果調整正確,則顯示器的 Gamma 級別應為 2.2,這與 sRGB 色彩空間非常匹配。 當我寫這篇文章時,我的舊螢幕(由公司提供)非常糟糕。 它的 Gamma 設定值約為 1.8,實際上顯示器頂部的 Gamma(較暗)與顯示器底部的 Gamma(較亮)不同。 當比較螢幕上不同位置的圖片時,這會給我帶來問題,因為當將同一張圖片放置在不同的垂直位置時,它看起來會有所不同! 另一方面,我的個人筆記型電腦(當時)具有非常均勻的顯示效果,根據上述內容,其 Gamma 設定值為 2.0。

sRGB色彩空間校正

使用 sRGB 色彩空間保存圖片與對圖片進行 Gamma 校正非常相似,但稍微複雜一些,以便更好地再現人眼的實際反應,尤其是在非常暗的顏色陰影下。
因此,讓我們將線性漸變保存在經過 sRGB 校正的色彩空間中。

  magick -size 100x100 gradient:'gray(100%)-gray(0)' \
          -set colorspace RGB -colorspace sRGB    gradient_sRGB.gif
[IM Output]
從 IM v6.7.7 開始,以上內容已簡化為僅

  magick -size 100x100 gradient:white-black gradient_sRGB.gif
這是因為線性漸變將始終在線性 (RGB) 色彩空間中產生(這是運算子工作的唯一合理方式)。

但是,由於請求了 sRGB 顏色的「白黑色」,因此線性資料漸變將自動轉換為 sRGB 色彩空間,從而產生非線性資料值和感知線性漸變。

在 IM 6.7.5 版之前,以上內容會失敗,因為 IM 將「sRGB」和「RGB」色彩空間的含義顛倒了。 因此,在舊版本的 IM 上,需要交換兩個色彩空間名稱。 例如...

  magick -size 100x100 gradient: -set colorspace sRGB \
          -colorspace RGB gradient_sRGB.gif
這種色彩空間處理怪異現象被認為是一個長期存在的 IMv7 錯誤,儘管原本打算僅在 IMv7 中修復,但已回溯到 IMv7。

請注意,以上(或任何其他漸層)都不是完美的,因為完美根本不可能,每個人看待事物的方式都略有不同。簡而言之:你所看到的,永遠不會和別人看到的一模一樣(這實際上非常禪意)。根據大量調查和許多印刷/繪畫/色彩專家的說法,sRGB 只是對大多數人來說非常好的近似值。有關確切 sRGB 公式的詳細信息,請參閱維基百科,sRGB 色彩空間。一個更完整、更精確的“人類亮度響應”已經開發出來,可以在論文人類視覺,恰可察覺的差異中在線查看。這包括在主要照明變化情況下的適應性響應。萬維網已將使用 sRGB 作為推薦的(並且仍然相當簡單的)默認色彩空間標準化,因此應該用於所有不包含任何色彩空間配置文件信息的圖像。也就是說,用於 GIF、PNG、JPEG 和 TIFF 等圖像。所有這些格式(GIF 除外)都允許使用顏色配置文件來明確指定圖像的色彩空間。但是,諸如 PbmPlus 之類的圖像文件格式通常不被視為採用 sRGB 色彩空間。因此,在處理此類文件格式時,通常最好使用“-set colorspace ...”來確保色彩空間符合您的預期。這裡是所有三張圖像放在一起,以便您可以比較它們。
[IM Output]
線性
[IM Output]
伽瑪
[IM Output]
sRGB
如您所見,伽瑪和 sRGB 校正後的圖像幾乎相同,並且繪製時差異實際上非常小。因此,雖然使用 sRGB 是更正確的方法,但使用 伽瑪校正 可能更容易應用。sRGB 和伽瑪圖像之間的最大差異在於極暗的圖片。對於 8 位灰度值 1,sRGB 比同等的伽瑪亮 60 倍。值 8 亮 5 倍。在大多數情況下,這不會造成任何明顯差異,但處理非常暗的圖片時可能會出現差異。

處理真實影像

大多數圖像處理運算符並不關心圖像使用什麼色彩空間,它只是將其運算應用於通道數據,而不管其色彩空間如何。儘管有些必須特別注意處理“黑色”的額外通道數據,以及您稍後將看到的“Alpha”(或“Alpha”透明度)。然而,圖像的色彩空間會極大地影響許多操作的最終結果。因此,在不同的色彩空間中進行圖像處理可以產生更好的結果。這個例子更清楚地說明了為什麼在 sRGB 中處理不是一個好主意。摘自 IM 用戶論壇上關於顏色模糊和“斷色”的討論。
我們採用兩種使用不同顏色通道的顏色,並將它們模糊在一起,以便在通道內顏色模糊為零(低顏色值)。首先,讓我們使用默認的 sRGB 輸入通道來做到這一點。

  magick -size 40x80 xc:red xc:lime +append \
          -blur 0x20 blur_sRGB.png
[IM Output]
如果你看一下結果,它看起來像顏色從紅色通過黑色然後變成綠色模糊。那是因為在 sRGB 色彩空間中,這些值在我們眼中的顏色比它們應該的要暗。
在這裡,我再次模糊同一張圖像,但使用線性 RGB 色彩空間。

  magick -size 40x80 xc:red xc:lime +append \
          -colorspace RGB -blur 0x20 -colorspace sRGB blur_RGB.png
[IM Output]
如您所見,這次我們得到了一個更合理的結果,紅色和綠色通過橙色模糊。您也可以通過使用其他線性色彩空間(例如 LAB 或 LUV)獲得類似的結果,我們將在下面更詳細地介紹這些色彩空間。基本上,在處理涉及混合顏色的圖像時,例如在顏色量化(顏色減少)等操作中,以及在圖像調整大小和更一般的圖像扭曲,您應該在線性色彩空間中處理圖像以獲得更準確的結果,儘管實際上很少有人這樣做。
Helmut Dersch(以「桶狀變形和鏡頭校正」聞名)建議您考慮使用線性「LAB」色彩空間來處理影像,尤其是在調整影像大小和變形時。

我僅建議您在進行繪圖、合成、調整大小或影像變形時,才將「輸入」sRGB 色彩空間轉換為其他「線性」色彩空間。 無論是線性 RGB、LAB 還是 LUV,應該沒有太大差別。

例如,這裡是 3 個主要線性色彩空間中的紅藍模糊。我選擇這些顏色是因為它們在產生的中間色中似乎顯示出最大的差異。

  for colorspace in RGB LUV LAB
  do
    magick -size 80x40 xc:red xc:blue -append \
            -colorspace $colorspace -blur 0x30 -colorspace sRGB \
            colorspace_$colorspace.png
  done
[IM Output]
RGB
[IM Output]
LUV
[IM Output]
LAB
如需更多有關色彩空間處理影像的範例,請參閱使用色彩空間校正調整大小。另請參閱使用 Gamma 和色彩空間校正繪製中關於色彩名稱和線性色彩空間繪製的警告

顏色規範

IM 中的顏色可以用多種方式指定。最佳指南位於 IM 官方網站上的顏色名稱

以名稱指定色彩

許多顏色都被賦予了特定的名稱,這使得它們更易於使用。例如,「RoyalBlue」是一種非常漂亮的亮藍色。[IM 輸出]右邊是一張包含 ImageMagick 中所有命名顏色的圖像,包括帶有數字的顏色。這些顏色首先被分為三組:灰白色、中間色調和深色,然後繪製在三個獨立的 HSL 色輪中,每個色輪具有不同的垂直偏移量。純白色和黑色作為獨立的點出現在圖表的頂部和底部,形成垂直範圍的極端。「hsl_named_colors」腳本生成了它,並遵循了分層圖像的程序化定位中探討的技術。
從技術上講,當我以「雙錐體」而不是「圓柱體」的三維形式繪製 HSL 顏色時,每個色點的半徑已設置為等於顏色的「色度」(「飽和度」/「亮度」),而不僅僅是其「飽和度」。請參閱維基百科:HSL 和 HSV

更準確地說,也應該使用六角錐體而不是圓錐體,儘管這樣計算起來要困難得多,而且收效甚微。

如您所見,紅色到黃色有很多顏色名稱,而青色到綠色的色調則有一組較小的名稱。在灰白色、黃色和青色中也有類似的集群。但是,幾乎沒有命名的灰綠色。本質上,HSL 色彩空間中的一些區域只有很少的命名顏色。可能很難找到要使用的特定命名顏色。但是,通過在 IM「顯示」程序中加載右側的圖像,您可以使用滑鼠中鍵查看已繪製的特定顏色的 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)」(見下文)。
從 IM v6.7.8-3 開始,您可以使用函數「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 Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
在 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 Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
在 IM 6.2.7 版之前,「rgba()」也使用遮罩值作為 Alpha 色版值。也就是說,值 0 代表完全不透明,255 代表完全透明。根據「W3C CSS3 顏色模組建議用於指定顏色」的定義,這已更改為 IM 更符合其他圖像標準,尤其是 WWW 和 SVG 使用。
目前無法直接使用名稱指定半透明顏色,並額外設定 Alpha 值。但是,您可以透過生成該命名的顏色,然後修改圖像的透明度來進行調整。您還有一個額外的複雜因素,即您必須設定 Alpha 色版,才能真正設定顏色的透明度。

  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 Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
是的,這很麻煩,如果可以將透明度設定為顏色名稱規範的一部分,那就太好了。如果您希望看到這一點,請在IM 開發人員論壇上提出請求。也可以使用MVG 繪圖設定繪製命名的填充顏色,但您需要一個透明的起始畫布才能使其正常工作。例如...

  magick -size 50x50 xc:none \
          -draw "fill Tomato fill-opacity 0.5 rectangle 0,0 49,49" \
          color_name_draw.png
[IM Output]
請注意,完全透明的顏色雖然完全不可見,但仍然具有顏色。但是,大多數 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] ==> [IM Output] [IM Output] [IM Output]
請注意紅玫瑰在紅色通道圖像中是如何突出的,而在藍色和綠色通道中它是相當暗的。另一方面,綠葉在綠色通道中很突出,但在其他通道中則不然。圖像底部附近的白色在所有通道中都很亮。
在 IM v5 及之前的版本中,「-channel」不僅是後續圖像操作的設定,而且有時還是一個「圖像運算符」,它將指定的通道轉換為灰度圖像。非常令人困惑!

在 IM v6 中,創建了「-separate」來「分離」這兩個截然不同的任務。「-channel」選項只是一個由後續圖像操作使用的設定,而「-separate」將把指定的通道提取到單獨的灰度和完全不透明的圖像中。

從 IM v6.2.9-3 開始,「-separate」運算符允許您根據「-channel」設定分離多個顏色通道。「-channel」設定中的項目數量將決定創建的圖像數量(以 RGBA 順序)。例如,由於預設的「-channel」設定是「RGB」,預設操作是創建三個圖像,我在下面輸出。

  magick rose: -separate separate_RGB_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
在這裡,我們使用「-colorspace」運算符將 IM 儲存圖像顏色數據的方式變更為CMYK 顏色表示。然後我們提取涉及的四個顏色通道。

  magick rose: -colorspace CMYK -separate separate_CMYK_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
最後一張圖像(「黑色」或「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
[IM Output]
Gray
Gray
[IM Output]
Rec709 亮度
[IM Output]
Rec601 亮度 (Y)
YUV/YIQ
[IM Output]
平均值 (I)
HSI/OHTA
[IM Output]
明度
HSL
[IM Output]
亮度
HSB
[IM Output]
負片黑色
CMYK
[IM Output]
亮度*
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] ==> [IM Output] [IM Output] [IM Output]
這通常被認為是最「簡單易懂」的解決方案,並且已在其他 IM 教程中使用。其他方法涉及使用多種技術將不需要的通道「歸零」。這些方法在下面的將顏色通道歸零中列出,並且通常比使用「-fx」快得多。

合併RGB通道影像

將所有圖像顏色通道分離並處理完畢後,您還需要能夠將這些圖像重新組合在一起。這可以使用特殊的列表運算符「-combine」來完成,它基本上與「-separate」相反。

  magick separate_red.gif separate_green.gif separate_blue.gif \
           -combine -set colorspace sRGB rose_combined.gif
[IM Output] [IM Output] [IM Output] ==> [IM Output]
然後使用「-combine」創建一個聲明為 sRGB 色彩空間的圖像。一位用戶希望能夠交換圖像的紅色和藍色通道,這很容易做到,只需分離通道、交換並重新組合即可。

  magick rose: -separate -swap 0,2 -combine rose_rb_swap.gif
[IM Output]
請記住,默認的「-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] [IM Output] ==> [IM Output]

合併非RGB通道影像

從 IM v6.4.3-7 版本開始,您也可以使用「-combine」來組合代表其他色彩空間的通道影像,但您需要告訴 IM 結果影像應該使用哪種色彩空間。這可以使用特殊的「-set colorspace」運算子來完成。這基本上會改變記憶體中影像的色彩空間,但不會映射影像的像素數據,使其保持原樣。一旦影像在正確的色彩空間中組合完成,您就可以使用一般的「-colorspace」運算子將像素數據映射回普通的 RGB 數據。

  magick separate_HSB_?.gif  -set colorspace HSB  -combine  \
          -colorspace sRGB  rose_HSB_combined.gif
[IM Output]
此方法也適用於 CMYK 影像,由於需要第四個色彩通道,因此通常難以處理。

  magick separate_CMYK_?.gif  -set colorspace CMYK  -combine  \
          -colorspace sRGB  rose_CMYK_combined.gif
[IM Output]
另一個解決方法(適用於較早版本的 IM)是載入一個影像(紅色通道),並將其更改為正確的色彩空間。之後,可以載入每個單獨的通道影像,並將其通道複製到預先準備好的影像中。

  magick separate_HSB_0.gif -colorspace HSB \
          separate_HSB_0.gif -compose CopyRed   -composite \
          separate_HSB_1.gif -compose CopyGreen -composite \
          separate_HSB_2.gif -compose CopyBlue  -composite \
          -colorspace sRGB   rose_HSB_combined_alt.gif
[IM Output]
當然,如果您使用了「-set colorspace」運算,第一個通道的數據將已經就位,因為這不會改變實際的像素數據,只會改變數據的解釋方式。
最後一個範例不適用於「CMYK」影像,因為「黑色」通道影像實際上並不包含黑色通道!因此,「-compose CopyBlack」將找不到要複製的有效數據。我認為這是一個錯誤,但目前不太可能修復。

使用其他色彩空間可能很有用。例如,這裡我使用內建的玫瑰影像,並希望在「Lab」色彩空間中反轉影像的亮度通道。完成後,我再次組合以建立 sRGB 影像。

  magick rose: -colorspace Lab -separate \
          \( -clone 0 -negate \) -swap 0 +delete \
          -combine -set colorspace Lab \
          -colorspace sRGB   rose_light_neg.gif
[IM Output]
以前這個範例使用的是「HSL」色彩空間,但這是一個線性色彩空間,而我們希望在「Lab」提供的「感知色彩空間」中進行反轉。

請注意,影像仍然具有相同的顏色,但顏色的亮度(明度)已被反轉,產生了奇怪的效果。您可以將「-negate」替換為您自己的一組運算,以調整影像的亮度級別。但是,由於「-negate」本身就是一個通道控制運算子,因此我們不需要「-separate」亮度通道來反轉它。

  magick rose: -colorspace Lab \
          -channel R   -negate   +channel \
          -colorspace sRGB rose_light_neg2.gif
[IM Output]
如您所見,這簡化了操作,但對於您想要達成的效果,它可能並不總是實用的。

將色彩通道歸零

有時您會遇到一個影像(RGB 或其他色彩空間),您只想清除或「歸零」其中一兩個色彩通道,但保留所有其他通道的原樣。例如,要製作灰階影像而不使用 RGB 灰階技術,您可以將 HSL 色彩空間中的飽和度通道(「G」)「歸零」,以製作灰階影像。當飽和度為零時,「色相」值沒有意義,因此您將得到一個灰階影像。最直接的技術通常是使用評估運算子將不需要的通道中的所有值歸零...

  magick rose: -colorspace HSL \
          -channel G  -evaluate set 0  +channel \
          -colorspace sRGB rose_grey.gif
[IM Output]
但是,還有許多不太明顯的方法可以做到這一點...


  # 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 代表值)色彩空間後,分離 其通道。

  magick rose: -colorspace HSB -separate separate_HSB_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
或者類似但不太一樣的「HSL」(色調、飽和度、亮度)。

  magick rose: -colorspace HSL -separate separate_HSL_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
請注意,兩個色彩空間中的「色調」通道圖像如何都是幾乎純粹的黑白顏色斑點。這是因為色調實際上是循環的。也就是說,上述通道圖像中的黑色和白色實際上都是「紅色」色調的表示,而輕微的變化會導致色調從紅色的一側(產生白色)翻轉到另一側(產生黑色)。如果這是一個問題,您可以使用調製運算子旋轉色調設定,以便紅色由其他一些色調值表示。「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
[IM Output]
色調
[IM Output]
飽和度
[IM Output]
亮度
==> [IM Output]
HSL 色輪
灰階圖像是使用 sRGB 值作為線性漸變生成的。因此,漸變看起來往往比實際要暗一些。然而,重要的是這裡輸入圖像中的值,而不是查看色彩空間。

另一方面,產生的圖像雖然是在線性 RGB 色彩空間中生成,但會以 sRGB 色彩空間儲存,以確保瀏覽器和其他圖像顯示程序能以視覺上良好的方式顯示漸層。
另請注意,色相是一個「模數」值,它會在紅色(色相值 = 0)處環繞。這在進行圖像處理時可能會很麻煩,因為您會有兩種在視覺上相同的紅色,但在數值上卻是最大的色相距離。這在處理顏色差異時不是一個好的色彩空間。實際上,HSB 和 HSL 色彩空間的亮度/明度通道不是很有用,因為各種色相的處理方式並不相同。基本上,它會「均衡」原色的強度。例如,將「黃色」色相旋轉為「藍色」色相會使非常亮的顏色變得非常暗,反之亦然。如需更多詳細資訊,請參閱 HSL 的缺點。建議謹慎使用。
有許多色彩空間也使用這種相同的「六角錐」為基礎的色相系統。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
[IM Output]
HSL
[IM Output]
HSB
[IM Output]
HCL
[IM Output]
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
[IM Output]
HSL/HSB
[IM Output]
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
[IM Output] ==> [IM Output] 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
[IM Output]
亮度*
[IM Output]
色度
[IM Output]
色調
==> [IM Output]
LCHab
[IM Output]
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」運算符專為用另一種顏色替換圖像中的一種顏色而設計。例如,要將“藍色”替換為“白色”,您可以使用如下命令...

  magick balloon.gif  -fill white -opaque blue   balloon_white.gif
[IM Output] ==> [IM Output]
基本上,任何“藍色”的顏色都已被替換為當前的「-fill」顏色。但是,從 IM v6.2.7 開始,此運算符受「-channel」設置的限制。因此,要將顏色(例如藍色)變成透明,您需要指定一個「-channel」來包含 Alpha 通道,以使顏色透明。您還需要確保圖像已啟用“遮罩”或Alpha 通道,以保存透明度信息。

  magick balloon.gif   -alpha set  -channel RGBA \
                        -fill none -opaque blue   balloon_none.gif
[IM Output] ==> [IM Output]
因為用透明度替換顏色是一種非常常見的操作,所以上面有自己專用的替換為透明運算符「-transparent」。

  magick balloon.gif  -transparent blue   balloon_trans.gif
[IM Output] ==> [IM Output]
從 IM 6.3.7-10 版本開始,這些運算子的「加號」版本會反轉顏色選擇。也就是說,將會替換與給定顏色「不符」的顏色。例如,這裡我將任何「不是」純黑色的顏色替換為白色,只留下圖像的純黑色邊框。

  magick balloon.gif  -fill white +opaque black   balloon_borders.gif
[IM Output] ==> [IM Output]
這看起來可能沒什麼,但當您將其與模糊因素(請參見下文)結合使用時,這將成為一個非常強大的工具。
在 IM v6.3.7-10 之前,反向操作需要使用圖像遮罩的一些技巧。基本上,您要用透明度替換要保留的顏色,然後使用「-colorize」將所有其他顏色「著色」為所需顏色以建立覆蓋遮罩。然後將其覆蓋在原始圖像上以「遮罩」不匹配的顏色!

  magick balloon.gif \
          \( +clone -alpha set -transparent black \
             -fill white  -colorize 100% \) \
          -composite    balloon_mask_non-black.gif

[IM Output] ==> [IM Output]
如您所見,運算子的「加號」形式極大地簡化了「非此顏色」替換操作。
如需更進階的替換技巧,建議您查看背景移除
請注意,由於所有匹配的顏色(尤其是「模糊匹配的顏色」,請參見下文)都替換為單一均勻的顏色,因此您將不會獲得顏色區域邊緣的任何反鋸齒效果。而且您將失去任何可能存在的陰影或其他陰影效果。這可能會對任何非簡單、非卡通類圖像的外觀產生嚴重的負面影響。

這種顏色替換的設計並非針對實際的真實世界圖像,而是更多地用於圖像遮罩效果。建議謹慎使用。
-opaque」顏色替換無法用平鋪圖案替換顏色。它只會用另一種特定的單一顏色替換顏色。但是「-draw」和「-floodfill」顏色替換方法都可以(請參見下文)。

使用圖像中的顏色替換

您也可以使用繪製顏色替換根據圖像本身中存在的顏色(而不是特定顏色)對圖像重新著色。

  magick present.gif -fill red -draw 'color 0,0 replace' present_blue.gif
[IM Output] ==> [IM Output]
請注意,我從未指定要替換的顏色,只指定了要替換的顏色的位置。無論該顏色是什麼,都是使用該位置的顏色來「匹配」要填充的區域。您可以在上面的範例中看到顏色替換的問題,特定顏色可能會出現在您想要的其他地方,從而在上面的「當前」圖像中產生一行紅色像素。透明度也沒有問題,儘管圖像的某些內部部分也變得透明,就像它們在上面變成紅色一樣......

  magick present.gif -alpha set -fill none \
                      -draw 'color 0,0 replace' present_none.gif
[IM Output] ==> [IM Output]
但是請注意,與「-opaque」和「-transparent」不同,繪製顏色替換不允許您反轉要替換的「匹配顏色」。繪製還具有一种特殊的遮罩替換,其中僅替換填充顏色的透明度。也就是說,您可以使所有匹配的顏色變得透明或半透明,而無需實際更改像素本身的顏色。當然,使用適當的檔案格式。

  magick present.gif -alpha set -fill '#00000080' \
            -draw 'matte 0,0 replace' present_semi.png
[IM Output] ==> [IM Output]
當還指定了模糊因素時,這將變得更加有用。使用「-draw」的最大優勢在於,您還可以將顏色替換為平鋪圖案。舉例來說..

  magick present.gif -tile pattern:right30 \
                -draw 'color 0,0 replace' present_tile.gif
[IM Output] ==> [IM Output]
如需更進階的替換技巧,建議您查看背景移除

泛洪填色繪製

繪製色彩」方法也提供一種簡單的「floodfill」色彩替換方法。也就是說,您不必替換影像中「所有」相符的色彩,只需選取與影像中指定點「相連」或「相鄰」的色彩即可。指定的點不僅會指定起始點(種子點),還會指定您要替換的色彩。

  magick present.gif -fill red -draw 'color 0,0 floodfill' present_fill.gif
[IM Output] ==> [IM Output]
請注意,未與像素 0,0「相鄰」的紅色區域並未被替換。對於背景替換來說,這可能是一個問題,但解決方案也很簡單。稍微擴展影像,以便 Floodfill 可以從各個方向「滲入」影像,然後在完成後移除額外的空間。

  magick present.gif -bordercolor white -border 1x1 \
          -fill red     -draw 'color 0,0 floodfill' \
          -shave 1x1               present_bgnd.gif
[IM Output] ==> [IM Output]
當然,您可以使用下方「模糊因素」控制設定來調整「相符」的色彩範圍,這對於 JPEG 影像尤其重要。

泛洪填色運算子

新增「-floodfill」運算子的目的是為了讓 Floodfill 更容易操作,特別是當您想要精確指定要替換的色彩時。這在使用「模糊因素」色彩比對時尤其重要。但請注意,如果該種子點不在您要尋找的色彩的「模糊因素」比對範圍內,則「-floodfill」將不會執行任何操作。這可以被視為該運算子的特性,同時也是它的缺點。
建議 Floodfill 使用較小的「模糊因素」。
或者,確保種子點與要尋找的色彩完全相符。
例如,在邊緣添加已知顏色的邊框,以便從邊緣進行 Floodfill...

  magick present.gif -bordercolor white -border 1x1 \
          -fill red    -floodfill +0+0 white \
          -shave 1x1              present_floodfill.gif
[IM Output] ==> [IM Output]
這會將從 +0+0 開始,直接圍繞種子像素區域中的所有「白色」替換為「紅色」,而由於添加了邊框,因此保證該區域為「白色」。您也可以使用平鋪圖案進行 Floodfill。

  magick present.gif -bordercolor white -border 1x1 \
                -tile pattern:left30   -floodfill +0+0 white \
                -shave 1x1           present_pattern.gif
[IM Output] ==> [IM Output]
色彩」參數有時可能會很麻煩,因為它必須與種子點的色彩相符,否則將不會執行任何操作。但這也很有用,因為它可以確保 Floodfill 完全按照您的預期執行,而不會出現意外。例如,在這裡我嘗試用各種顏色填充白色圓盤...

  magick disks.gif \
          -fill Red   -floodfill +30+50 white \
          -fill Green -floodfill +60+60 white \
          -fill Blue  -floodfill +10+40 white \
          floodfill_hit_miss.gif
[IM Output]
在這種情況下,只有「綠色」和「藍色」Floodfill 操作「命中圓盤」(並填充了它),而「紅色」Floodfill 沒有命中圓盤,因此沒有填充任何圓盤,也沒有意外填充影像的背景。這也表示如果您已經填充了特定區域,則後續的填充操作將不會「重新填充」相同的區域(如果兩個點都命中該區域)。這可以節省大量的時間。您也可以參考「條件擴張」,它表示從影像中的多個「種子」點進行較低層級的 Floodfill 操作。

模糊因素 - 比對相似/多種色彩

如先前範例所示,僅選擇單一色彩進行替換的整體效果通常不太理想。由於反鋸齒的關係,純色區域的邊緣或區域通常會混合多種色彩(如需詳細資訊,請參閱「反鋸齒」)。因此,您應該盡可能避免直接替換色彩。例如,在這裡我拍攝了一張看起來很簡單的黑白「乳牛」影像,並試圖將其變成紅色的乳牛。

  magick cow.gif -fill red -opaque black  cow_replace_red.gif
[IM Output] ==> [IM Output]
如您所見,只有「黑色」區域的中心部分實際變成了紅色。這是因為,雖然圖像看起來是黑白的,但它實際上是一個灰度圖像,幾乎所有邊緣都是各種深淺的灰色。也就是說,它們的顏色並非完全純黑色。模糊系數(「-fuzz」)表示使用圖像正在使用的任何顏色空間,在顏色之間的多維球面距離中的「相似性」匹配。好的,讓我們試着用簡單的英語解釋一下。您有一種特定的顏色。如果另一種顏色與正在尋找的顏色之間的差異小於模糊系數設置,則該顏色將被視為與正在尋找的顏色「相同」。「模糊系數」越大,越「接近」的顏色將匹配並被替換。所以讓我們在我們的牛圖像上嘗試一下,以便不僅將純黑色,而且將接近黑色的顏色都變成紅色。

  magick cow.gif -fuzz 40%  -fill red -opaque black  cow_replace_fuzz.gif
[IM Output] ==> [IM Output]
如您所見,我們現在已將圖像的所有「深色」像素替換為紅色。但結果仍然很糟糕,邊緣帶有灰色調,並且有很強的鋸齒效應。直接顏色替換對於此圖像來說不是一個好的解決方案,即使您可以使用較大的「模糊系數」使其工作。有關此圖像的理想解決方案,請參閱按顏色調整色階中的示例。對於您嘗試用透明度替換背景顏色的圖像,此問題甚至更糟。您基本上最終會在該背景顏色上的對象周圍形成一個「光暈」。這很難解決,背景移除中將詳細介紹此類問題。哪些操作使用模糊系數-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」(半深藍色)的距離,

  magick colorwheel.png \
          -fuzz 30000 -fill white -opaque blue \
          opaque_blue.jpg
[IM Output]
為了更容易理解,我在這裡反轉匹配的顏色,將不匹配的顏色變為白色。

  magick colorwheel.png \
          -fuzz 30000 -fill white +opaque blue \
          opaque_blue_not.png
[IM Output]
如果您的 IM 版本早於 6.3.7-10(添加了「加號」形式的「-opaque」運算符),則可以使用此遮罩方法來反轉顏色匹配的結果...

  magick colorwheel.png \
          \( +clone  -fuzz 30000 -transparent blue \
             -channel RGB +level-colors white +channel \) \
          -composite   opaque_blue_inv.png
[IM Output]
或者可以使用這種方法,將所有修改限制在「Alpha 色版」上,這樣一來,所有原始顏色都將保持不變。也就是說,您需要從顏色選區中建立一個反轉遮罩,以便使所有未選取的顏色完全透明。它們仍然存在,只是變成透明的了!

  magick colorwheel.png -fuzz 30000 -transparent blue \
          -channel A -negate +channel   opaque_blue_inv_alpha.png
[IM Output]
這些替代方法的優點在於,您可以擴展它們以產生「非多種顏色」的技巧。您只需要在反轉遮罩之前,將更多顏色添加到要變透明的清單中,並可能移除反轉的透明度。

  magick colorwheel.png \
          -fuzz 25000 -transparent blue -transparent red -transparent lime \
          -channel A -negate +channel \
          -background white -alpha remove   opaque_multi_inv.png
[IM Output]

順帶一提,在使用 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 色彩立方體的對面。

  magick colorwheel.png -fuzz 90% -fill white -opaque white  opaque_w90.jpg
[IM Output]
請注意,這 90% 代表 RGB 色彩立方體中圍繞「白色」的球體顏色。然而,這與替換不在黑色 10% 球體範圍內的顏色不同。

  magick colorwheel.png -fuzz 10% -fill white +opaque black  opaque_k10.jpg
如您所見,靠近黑色的 10% 顏色球體比圍繞白色的 90% 顏色球體更加均勻。想像一個以立方體白色角為中心的大球體如何填滿該立方體。然後想像一個以黑色角為中心的小球體,您就能理解這兩張影像之間的差異。
[IM Output]
-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] [IM Output] [IM Output] [IM Output] [IM Output]
由此您可以清楚地看到,與「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] [IM Output] [IM Output] [IM Output] [IM Output]
如您所見,色輪圖像中的顏色僅在模糊因素略低於 30% 時才開始匹配,並緩慢增加,直到 45% 時,除了最極端的顏色外,所有顏色都已消失。到 51% 時,圖像中的所有顏色都已匹配近乎完美的灰色。您所看到的是 RGB 顏色在三維空間中排列成立方體的方式的結果。然而,「色輪」圖像僅包含「完全飽和的顏色」,這基本上意味著位於 RGB 顏色立方體外表面上的所有極端顏色。然而,完美的灰色位於立方體的中心,距離所有「飽和顏色」都相當遠。因此,直到您達到 28% 的大模糊因素時,立方體面中心的顏色才會開始匹配。隨著模糊因素越來越大,將會有越來越多的顏色匹配,直到只剩下顏色立方體角落處的顏色。在大約 50% 時,角點顏色也將開始匹配,因此在 51% 時,每種不透明的 RGB 顏色都將匹配。

模糊因素和透明顏色

當匹配涉及透明和半透明顏色時,使用「-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

[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
請注意,上面使用「-channel RGBA」不是為了顏色匹配,而是為了指定要「填充」的顏色通道。也就是說,如果沒有它,上面將仍然匹配相同的顏色,但灰色的「填充」將保持半透明,並且不會設置為不透明的灰色。如果您想匹配所有顏色而不考慮其透明度,那麼您將需要至少暫時關閉圖像的透明通道。之後您可以再次將其打開,但您的填充顏色將再次具有與原始顏色相同的透明度。在第一張圖像中,與完全不透明的灰色(alpha='1.0')匹配時,您會得到所有接近不透明灰色的非常球形的匹配。然而,隨著匹配的顏色變得更加半透明,匹配的半透明顏色的數量似乎會變得更大,直到完全透明的灰色匹配任何接近透明的顏色。發生的事情是,隨著透明度的增加,半透明顏色之間的距離減小。與不透明的顏色相比,兩種顏色越透明,它們就越接近。當兩種顏色都完全透明時,這兩種顏色將被視為完美的或「0」距離的匹配。需要注意的另一件事是(從 IM v6.6.6-4 開始),與完全透明顏色(灰色或其他顏色)的距離純粹是顏色透明度(alpha 值)的函數。上圖中的最後一張圖像匹配了所有透明度在 20% 以內的所有像素,而不管實際顏色如何。
這也表示,一個大的 模糊係數 與完全透明的顏色(例如「none」)一起使用時,可以用來匹配所有或幾乎所有半透明的顏色。例如...

  magick trans_gradient.png -channel RGBA \
          -fuzz 95% -fill Gray50 -opaque None \
          -alpha off  fuzz_trans.jpg
[IM Output]
請注意,以上僅有最上方 5% 的近乎不透明的顏色沒有匹配,而所有其他的半透明顏色都被轉換為灰色。最後的 "-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.