ImageMagick の例 --
色の基礎とチャンネル

索引
ImageMagick の例 序文と索引
色とは何か
ガンマ補正と sRGB 色空間
色の指定
カラーチャンネル
色空間
画像内の色の置換 (特定の色を置換)
ラスターイメージ(ImageMagick が一般的に扱うもの)は、基本的に個々の色の点またはピクセルの配列で構成されています。個々の点とその表現方法を変更することが、このセクションで見ていく内容です。次のセクションでは、画像全体の色のより一般的なグローバルな変更を見ていきます。

色とは何か?

色を本当に理解するには、色が正確に何であるかを知る必要があります。物理的な世界では、色は実際には錯覚です。私たちは、目が非常に特殊で限られた方法で物理的な世界を感知するため、色を見ます。基本的に、私たちの目には、赤、緑、青の特殊なセンサーと、周辺視と低照度条件のためのマイナーなセンサーがあります。後者は、夜に灰色しか見えない理由です。IM Diagram 詳細については、Wikipedia、錐体細胞を参照してください。右側のグラフは、典型的な人間の目がさまざまな波長の光にどのように反応するかを示しています。このため、私たちは赤、緑、青の電磁波長の観点からしか世界を感知しません。そのため、画像処理は一般的に赤、緑、青、つまり RGB に関するものです。しかし、それほど単純ではありません。私たちの色のセンサーはそれぞれ、さまざまな波長に反応します。たとえば、黄色の光を見ると、実際には赤と緑の両方のセンサーを使用して光を感知します。私たちの色のセンサーが厳密に純粋な赤と緑の検出器であった場合、黄色の色はまったく見えません。虹には実際、「隙間」が表示されます。つまり、テレビやコンピューターのディスプレイは、実際には黄色の光ではなく、赤と緑の光の適切な混合物をモニターが発光することによって、私たちをだまして黄色を見させています。私たちの色のセンサーは、純粋な黄色の光と同じ強度を見ており、その結果、実際には2つの異なる色の周波数を見ているにもかかわらず、黄色に見えます。純粋な黄色と赤と緑の光の混合物の違いを区別することはできません。同様に、青赤(紫)の色は、実際には単一の特定の波長として存在せず、少なくとも2つの色の周波数の混合としてのみ存在します。厳密に言えば、紫は私たちが反応する特定の周波数ですが、ほとんどは青によって、そして非常にわずかに他の2つのセンサーによって反応します。私たちは実際には4番目の視覚センサーを持っていますが、それは色ではなく、低照度検出器であり、錐体センサーがうまく機能しなくなった夜の視覚に使用されます。これが、夜間が単色に見え、月の光がすべて灰色に見える理由です。このセンサーはおそらく、sRGB 色空間(下記参照)が非常に暗い色に奇妙な線形成分を持つ理由でもあります。補足:他の動物は私たちとは異なるセンサーを持っています。ミツバチやその他のほとんどの昆虫は紫外線用のセンサーを持っています。そのため、彼らにとって、私たちの印刷された画像、テレビ、看板はほとんど意味がありません。これらの人工的な画像は、私たち人間がだまされて見ているほぼ完璧な色ではなく、むしろひどい偽色の画像のように見える可能性が高いでしょう。一部の動物は4つの色のセンサーを持ち、他の動物は1つ(白黒)または2つしか持っていません。また、一部の動物は特定の色よりも動きをはるかに良く見ます。たとえば、雄牛は赤を見ることができませんが、青紫と緑の波長を見ることができますが、はためく帽子は「動き」の色として輝いて見えます。雄牛にとって、モニターの 50/60Hz の更新サイクルはおそらく、何らかの意味のある画像ではなく、「動き」の輝きのように見えるでしょう!詳細については、Wikipedia、色の視覚およびWikipedia、色を参照してください。

RGB 色空間とチャンネル

したがって、RGB 色空間は、実際には赤、緑、青の3つの値を使用して画像を表す方法であり、私たちをだまして現実の世界で何かを見ていると思わせます。したがって、画像は3つの値の配列として保存でき、3つの値のそれぞれが1つのピクセル、つまり表示される色の点を形成します。3つの値の配列のそれぞれはチャンネルと呼ばれ、これは単に私たちの色のセンサーの1つだけのために作成する光の量を表すグレースケール画像です。たとえば、バラの画像の赤、緑、青のコンポーネントを次に示します。
[IM Output]
バラ
==> [IM Output]
[IM Output]
[IM Output]
バラを表示するには、「赤」の画像の方が他の2つの色コンポーネントよりもはるかに明るく表示されます。しかし、下部近くの白いパッチでは、3つの画像すべてが明るいです。RGB は加法混色ですさて、赤、緑、青の色は「加法混色」と呼ばれます。つまり、色は組み合わせて最終的な色画像を形成します。これは、それらが私たちの目が見ている主要な色であり、それらを組み合わせることで、私たちの目が見ているほとんどすべての色を効果的に生成できるためです。それらは、空白のモニターなどの黒から始めて、画像に表示される色に適切な赤、緑、青の光を追加すると、加法混色です。暗い部屋で、赤、緑、青のセロハンを端にくっつけた3つの懐中電灯を当てても同じ効果を得ることができます。3つの色が白い壁など同じ場所に当たると、白に見えます。色の画像は一般的に RGB 値(カラーチャンネルとも呼ばれる)で表現されるのは、私たちの目がこれらの「主要な」色を実際にどのように見ているかによるものです。

CMY 色空間

印刷する場合、異なる問題が発生します。紙は光を生成できず、反射するだけです。そのため、すべての光をあらゆる方向に反射する面から始める必要があります。つまり、白い表面です。それが反射している光は、窓から差し込む太陽光か、人工的に照らされた部屋の照明によって生成された純粋な白の光であることが望ましいです。その紙に画像を作成するには、特定の波長の光を実際に除去するインクをその表面に塗布する必要があります。赤、緑、青の色を「感知」するため、それらは紙から反射する光を選択的に除去したい色です。その結果、シアンインクを使用して赤色光を除去し、マゼンタを使用して緑色光を除去し、イエローを使用して青色光を除去します。特定の色を生成するために必要なシアン、マゼンタ、イエローインクの量は、CMY 色空間と呼ばれるものを生成します。ここでは、シアン、マゼンタ、イエローインクのみを使用してバラの画像を生成するために必要なインクマスクを生成します(インクが「線形」であると仮定します)。
[IM Output]
バラ
==> [IM Output]
シアン
[IM Output]
マゼンタ
[IM Output]
イエロー
つまり、シアンマスクの値が明るくなるほど、より多くの赤を除去するために必要なシアンインクが多くなります。言い換えれば、シアンマスクは、紙に反射させたい赤光の量の正確なネガです。実際、上記のチャンネル画像の3つはすべて、RGB 色空間で生成されたものの正確なネガです。したがって、RGB 画像を CMK 画像に魔法のように変換するには、画像を反転するだけで、画像を CMY 色空間として宣言するだけです。波長を選択的に除去しているので、シアン、マゼンタ、イエローは「減法混色」と呼ばれます。

CMYK 色空間

波長を選択的に除去することの大きな問題は、シアン、マゼンタ、イエローの3色のインクをすべて適用して赤、緑、青の光をすべて除去しても、実際には反射されている光をすべて除去できないことです。その結果、黒色ではなく、ひどい泥のような茶色になります。インク(または光フィルター)は完璧ではなく、私たち自身の目も完璧ではありません。先に述べたように、私たちの色のセンサーはそれぞれ、光の波長を1つだけ見ているのではなく、'赤'、'緑'、または'青'(またはそれらの色の混合)として解釈する波長の範囲を見ています。そのため、私たちの'青'の光センサーは、実際には(あまりうまくはありませんが)、わずかな紫外線を見ることができます。
補足:'ブラックライト'のフィルターは意図的に不完全なので、そのようなランプからの光を'ちょうど見ることができる'ため、それがオンになっているかどうかを知ることができます。CMYインクからの色のこの'漏れ'と、私たち自身の不完全な目があるために、紙から反射される可能性のあるすべての光を消去するために、純粋な黒インクを混合物に追加します。青と混同しないように、黒インクまたはチャンネルには文字Kが割り当てられています。そのため、印刷にはシアン、マゼンタ、イエロー、ブラックの4色のインクを使用し、これらのインクを使用して画像を定義してCMYKカラー空間を形成します。たとえば、この画像から分離された適切なCMYKコンポーネントを次に示します。
[IM Output]
バラ
==> [IM Output]
シアン
[IM Output]
マゼンタ
[IM Output]
イエロー
[IM Output]
ブラック
シアン、マゼンタ、イエローの量が減少し、CMYKカラー空間よりも暗くなっていることに注目してください。これは、それらの使用が適切な量のブラックに置き換えられたためです。つまり、特定のピクセルに3つのインクがすべて存在する場合、代わりにブラックが使用されます。したがって、純粋な黒を印刷するには、純粋な黒インクのみを使用し、他のインクは使用しません。上記の'ブラック'は紙に適用するブラックインクの量であるため、グレースケールチャンネル画像が明るいほど、使用するブラックインクの量が多くなります。そのため、他の3つの画像と同様に、ネガティブに見える画像でもあります。もちろん、カラープリンターに純粋な黒を追加すると、黒のテキストの印刷がはるかに簡単になります。純粋な黒の線、文字、図形を生成するために、3つの異なるインクを同じ場所に完全に重ねて印刷する必要がなくなるためです。これは、インクの使用量が大幅に減少し、紙が濡れにくくなり、にじみや汚れが発生しにくくなることを意味し、特にプリンターにとって有益です。

その他の色空間

他のカラー空間は、同じ色、または私たちの不完全な目でも認識できる厳密なRGBを超えた他の色を表す他の方法にすぎません。ただし、そのようなカラー空間は、モニターを使用した色の表示や印刷にはほとんど関係ありません。それらは基本的に、画像の色を処理および/または処理して、次のような特定のものを強化または強調表示する他の方法を表しています。
  • 暗い色のより優れた非線形処理(sRGB
  • カラーレインボーと色相(HSB、HSL、HSI、OTHAカラー空間 - 強度は保持されない)
  • 標準化された定義色(XYZ
  • 正確なまたは知覚的な色の違い(LABLUVカラー空間、およびそれらのLCHabとLCHuvの循環色相等価)
  • 拡張されたハイダイナミックレンジ(HDRI画像で使用)(scRGB
  • 色の値のより良い圧縮(YIQYUVなど)
  • テレビへの送信(YCbCr、YPbPr、Y = BW信号)
最後に、まだ触れていないカラー空間は'グレースケール'ですが、これは単なるピクセル値の単純な単一配列です。これらの値の解釈方法は可変です。なぜなら、それらは多くの異なるものを表す可能性があるからです。通常、そのような画像は線形グレースケールと線形RGBに似ていると見なされます(非線形sRGBとは対照的に)。IMバージョン6には実際にはそのようなグレースケールカラー空間がなく、線形RGBカラー空間で偽装するだけで、すべてのRGB設定を同じ値に設定しています。3つの値が同じでない場合、画像はグレースケールではなくなります。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"は、この'線形'グラデーションが実際には"sRGB"であり、sRGBカラー空間値のみを保存できるGIF画像ファイル形式に保存する際に'補正'を必要としないことをIMに伝えます。
さて、この画像で使用される実際の色の値は、上部で白から下部で黒へと滑らかに変化する線形グラデーションであり、中央に完璧に数学的に正確な50%のグレーがあります。しかし、画像を見ると、実際には明るい(ほぼ白)の色よりも暗い(ほぼ黒)の色が多く含まれているように見えます。なぜでしょうか?人間の視覚は、最大範囲の半分('白')の光強度が与えられると、色の値が示す純粋な中間調のグレーではなく、はるかに暗い色を見ます。その結果、上記の線形グラデーションは、白から黒への均一な線形の色拡散のように見えませんが、本来よりもはるかに暗い色が含まれています。実際の画像値から知覚される値への関係はおおよそ次のような'べき関数'です。
知覚されたグレー = 2.2

'2.2'という値は、ほとんどの人間に典型的な平均ガンマ関数値です。

ガンマ補正

ガンマ補正は、実際に保存される色の値を調整して、最終的な画像の色拡散がはるかに均一に見えるようにする方法です。基本的に、人間の視覚はべき乗数2.2を使用して光を暗く見せるため、線形画像を'線形に見せる'には、1/2.2の値を使用してそのべき乗関数を反転する必要があります。つまり、画像を線形に見せるには、次の式を使用して補正する必要があります。
ガンマ補正値 = 1/2.2

IMは、レベルオペレーター、ガンマ引数、またはより具体的にはガンマオペレーターを使用してガンマ補正を提供します。ただし、評価POW関数を使用して画像値を直接変更することもできます。

では、適用して'ガンマ補正された画像'の結果を見てみましょう。

  magick -size 100x100 gradient:'gray(100%)-gray(0)' -gamma 2.2 \
          -set colorspace sRGB gradient_gamma.gif
[IM Output]
画像に明るく暗い色の量がはるかに均等に含まれるようになったことに注目してください。ただし、画像内の実際の値はもはや'線形'ではなく、後でこの画像を処理するときに問題が発生する可能性があります。ガンマ補正は、画像を'正しく'見えるように調整する大まかな'迅速な'方法にすぎません。これは、画像を人間の反応に合わせて補正する通常の方法、または最適な方法ではありません。画像処理のガンマ補正を行うことのより具体的な例については、ガンマ補正によるサイズ変更を参照してください。ガンマ補正の詳細については、明るく暗い部分が均等な量になる線形RGB画像を生成しようと試みる "-auto-gamma" オペレーターも見てみることをお勧めします(線形空間で)。

モニターのガンマ

モニターから数メートル(ヤード)後退して、左側の画像を見てください。モニター(およびWebブラウザー)が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]
異なる'ガンマ'レベルでいくつかの同様の画像を次に示します。これにより、モニターが人間の知覚のための正しい'2.2'ガンマ表示にどの程度近いかを確認できます。

  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]
ガンマ1.6
[IM Output]
ガンマ1.8
[IM Output]
ガンマ2.0
[IM Output]
ガンマ2.2
[IM Output]
ガンマ2.4
(後退したときに)等しい明るさの点が約50%のマークにある画像は、モニターのおおよそのガンマレベルを示しています。適切に調整されている場合、モニターのガンマレベルは2.2になり、sRGBカラー空間に非常に近い値になります。これを書いたとき、私の古い画面(職場から提供されたもの)は非常に貧弱でした。ガンマ設定は約1.8で、実際にはディスプレイの上部(暗い)と下部(明るい)で異なるガンマを持っています。画面上の異なる位置で画像を比較する際に問題を引き起こしたことであり、同じ画像が垂直方向に異なる位置に配置されると、見た目も異なります!一方、私の個人的なラップトップ(当時)は、上記によると、非常に均一なディスプレイで、妥当な2.0のガンマ設定を持っていました。

sRGB 色空間補正

sRGBカラー空間を使用して画像を保存することは、ガンマ補正された画像を保存することに非常に似ていますが、特に非常に暗い色の濃度で、人間の目の実際の反応をより正確に再現するように、やや複雑です。
では、線形グラデーションを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では、2つのカラー空間名を交換する必要がありました。例えば…

  magick -size 100x100 gradient: -set colorspace sRGB \
          -colorspace RGB gradient_sRGB.gif
このカラー空間の扱いの奇妙さは、長年のIMv7のバグと考えられていましたが、IMv7でのみ修正される予定でしたが、IMv7にバックポートされました。

上記(またはその他のグラデーション)は完璧ではないことに注意してください。完璧は不可能であり、誰もがわずかな違いで自分の方法で物事を見ています。簡単に言えば、 *あなたが見ているものは、他の人が見ているものと全く同じではありません* (実際には非常に禅的です)。すべてのsRGBは、多数の調査と多くの印刷/塗装/色の専門家によると、大多数の人々にとって非常に良い近似値です。正確なsRGB式の詳細については、Wikipedia、sRGBカラースペースを参照してください。より完全で正確な「人間の輝度応答」が開発され、論文Human Vision, Just Noticeable Differenceでオンラインで見ることができます。これには、主要な照明変化の状況における適応応答が含まれます。ワールドワイドウェブは、推奨される(そしてまだ比較的単純な)デフォルトのカラースペースとしてsRGBの使用を標準化しており、したがって、カラースペースプロファイル情報を含まないすべての画像に使用すべきです。つまり、GIF、PNG、JPEG、TIFFなどの画像です。これらのフォーマット(GIFを除く)はすべて、カラープロファイルを使用して画像のカラースペースを最終的に指定することを許可しています。ただし、PbmPlusなどの画像ファイル形式は、通常、sRGBカラースペースにあるとは見なされません。そのため、このようなファイル形式を扱う場合は、通常、「-set colorspace ...」を使用して、カラースペースが期待どおりであることを確認することをお勧めします。そして、これら3つの画像をまとめて比較できるようにします。
[IM Output]
線形
[IM Output]
ガンマ
[IM Output]
sRGB
ご覧のとおり、ガンマ補正されたsRGB補正された画像はほぼ同一であり、グラフ化するとその差は非常に小さくなります。sRGBを使用することがより正確な方法ですが、ガンマ補正を使用する方がおそらく適用しやすいでしょう。sRGBとガンマ画像の最大の違いは、極端に暗い画像にあります。8ビットグレースケール値が1の場合、sRGBは同等のガンマよりも60倍明るくなります。値が8の場合は5倍明るくなります。これはほとんどの場合、目に見える違いを生み出しませんが、非常に暗い画像を扱う場合に発生する可能性があります。

実画像の処理

ほとんどの画像処理演算子は、画像が使用しているカラースペースを気にしません。単にカラースペースに関係なく、チャネルデータに演算を適用します。「黒」の追加チャネルデータ、そして後でわかるように「アルファ」(または「アルファ」透過)の処理には特別な努力をする必要があります。しかし、画像のカラースペースは、多くの演算の最終結果に大きく影響を与える可能性があります。そのため、異なるカラースペースで画像処理を行うと、より良い結果が得られる場合があります。この例は、sRGBで処理することがなぜ良い考えではないかをより明確に示しています。IMユーザーフォーラムのカラーブラーと「破損した色」に関する議論からです。
異なるカラーチャネルを使用して2つの色を取り、それらを一緒にぼかして、チャネル内で色がゼロ(低い色値)にぼやけるようにします。最初に、デフォルトの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などの他の線形カラースペースを使用しても同様の結果が得られます。これについては後で詳しく説明します。基本的に、色の混合を含む画像処理、例えばカラー量子化(色の削減)などの演算、また画像のサイズ変更、そしてより一般的には画像の歪みでは、より正確な結果を得るために線形カラースペースで画像を処理する必要がありますが、実際にはほとんどの人がそうしていません。
ヘルメット・デルシュ(バレル歪みとレンズ補正で有名)は、特に画像のサイズ変更や画像の歪みを行う場合は、線形「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
カラースペースに関する画像処理のその他の例については、カラースペース補正によるサイズ変更を参照してください。また、線形カラースペースでの色の名前と描画に関する警告については、ガンマとカラースペース補正による描画を参照してください。

色の指定

IMの色は、さまざまな方法で指定できます。これに関する最良のガイドは、公式IMウェブサイトの色の名前にあります。

名前による色

多くの色には特定の名前が付けられており、使用が容易になっています。例えば、「RoyalBlue」は非常に鮮やかな明るい青です。[IM出力] 右側には、ImageMagickで使用可能な番号付きの色を含む、すべての名前付きの色を含む画像があります。色は最初にオフホワイト、中間色、ダークカラーの3つのグループに分類され、次に垂直オフセットが異なる3つの独立したHSLカラーホイールにプロットされました。純粋な白と黒の色は、垂直範囲の極端を形成するために、チャートの一番上と一番下に独自の独立したスポットとして表示されます。それを生成したスクリプトは「hsl_named_colors」であり、レイヤー画像のプログラムによる配置で説明されている手法に従っています。
技術的には、HSLの色を円柱ではなく「バイコーン」の3次元形式で描画するため、各色のスポットの半径は「彩度」(「彩度」/「輝度」)ではなく色の「彩度」に等しく設定されています。Wikipeadia:HSLとHSVを参照してください。

さらに正確にするには、円錐の代わりに六角錐も使用する必要がありますが、それは計算がはるかに難しく、メリットはほとんどありません。

ご覧のとおり、赤から黄色に関連付けられた色の名前が多く、シアンから緑の色合いには小さなグループがあります。オフホワイトの黄色とシアンにも同様のクラスターがあります。しかし、オフグリーンの色名はほとんどありません。基本的に、HSLカラースペースには、名前付きの色がほとんどない領域があります。特定の名前付きの色を見つけるのは難しい場合があります。しかし、右側の画像をIMの「display」プログラムにロードすることで、中央のマウスボタンを使用して、プロットされた特定の色に関するImageMagickの色名を確認できます。

特殊な色の名前

ImageMagick内で特別な目的で使用される特殊な色がいくつかあります。「None」または「Transparent」は完全に透明な黒で、一般的には背景の透明性を指定するために使用されます。単色のキャンバスを作成する場合や、画像レイヤーを使用する場合などです。「Opaque」は「Black」のエイリアスにすぎず、そのためめったに使用されません。通常、アルファチャネル処理を行う場合など、不透明な色を意味する場合にのみ使用されます。

色の名前の競合

色の名前は、SVG、X11、XPMの3つの異なるソースから取得でき、ほとんどの名前は定義元のソースに関係なく同じ色を生成します。しかし、使用されている色の仕様に応じて異なる色を生成する色名もいくつかあります。最大の問題は、SVGの色「Green」(半分明るい緑)が、X11/XPMの色「Green」(純粋なRGB緑)とは異なることです。純粋な緑が必要な場合は、競合のないSVGの色名「Lime」を使用する方が良いでしょう。Wikipediaには、色の名前の競合に関する優れた記事と、実際の色の名前の優れた表がX11 color namesにあります。Web Colorsの記事も参照できます。これは、いくつかの色の範囲をきれいに並べた表を提供しています。最も注目すべき競合は、4つの特定の色にあります。既知の色名の競合の表を次に示します。デフォルトではIMがSVGの色を使用することを忘れないでください。
競合
色の名前
SVGの結果
(IMデフォルト)
X11の結果
名前用
X11相当
名前
代替案
色の名前
#008000 #00FF00 ライム
マルーン #800000 #B03060 ファイヤーブリック
パープル #FF00FF #A020F0 マゼンタ
グレイ #7E7E7E #BEBEBE グレー
上記に関する注意事項…
  • X11の「Grey」は、視覚的な中間グレースケールです。X11の色「Gray74」とSVGの色「Silver」(「gray(192)」)にも非常に近い(ただし全く同じではありません)。
  • デフォルト(SVG)の「Gray」は、完璧な数学的なグレーに非常に近く、色名「Gray50」または「gray(128)」(8ビット使用の場合)を使用してより適切に指定できます。
  • 名前付きのすべてのカラーは8ビット(0〜255)の値を使用して指定されているため、それらのいずれも完璧な16ビットの純粋なグレースケールカラーを生成しません。
  • FFT DC位相エッジ検出シェード画像合成照明効果相対変位マップなどの数学的処理に必要なグレーの場合、「gray(50%)」というカラー式を使用する方がはるかに優れています。これは、任意の色ビット深度で完璧な数学的なミッドトーングレーを生成します。
**特定の目的に色を選択する際には注意が必要です。**

色とカラースペース

多くの色には名前がありますが、画像にある色のほとんどには名前がありません。それらは通常3つの値のセットであり、特定の色を指定します。しかし、3つの値だけでは色は完全に定義されません。「カラースペース」または「カラーシステム」も指定する必要があります。上記のすべての「名前付き」の色はsRGBカラースペースにあり、それらが定義されたカラースペースです。しかし、場合によっては、異なるカラースペースで色を定義したい場合があります。たとえば、HSL、CYMK、またはXYZカラーなどです。ImageMagickはこれを実行でき、これらの仕様の詳細についてはImageMagick Color Namesを参照できます。 *将来:他のカラースペースの使用例(開発中)*
ImageMagickのRGBは線形RGBカラースペースを表していますが、「rgb(value,value,value)」の色名は実際には**sRGBカラー**を定義しているという慣習が受け入れられています。

sRGBカラーではなく線形RGBカラーを実際に定義するには、カラー式「icc-color(RGB,value,value,value)」を使用します(次を参照)。
IM v6.7.8-3以降、関数「icc-color(colorspace,color...)」を使用して、特定の色を定義したり、特定の色を再定義したりできます。 *将来:使用例*

半透明の色

半透明の色は、2つの異なる方法でのみ直接指定できます。半透明の色を設定する最も一般的な方法は、16進値を使用することです。たとえば、いくつかの色の仕様にさまざまなレベルの色の透明度を示します。生成された色の画像を背景パターンに表示しているので、画像の透明度を通してそのパターンを確認できます。

  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 より前では、16進数の最後の桁は「マット」または「不透明度」値として色の透明度を表していました。つまり、最後の16進数「00」は不透明、「FF」は透明を表していました。

しかし、IM v6.3.0 以降、この値は反転され、「アルファ」透明度値を表すようになりました。これは、IM を SVG 標準および他のグラフィックパッケージと合わせるためです。「FF
は完全な不透明を、「00」は完全な透明を表すようになりました。
特別な「rgba()」カラー関数を使用して色を指定することもできます。RGB値は0~255で、アルファチャンネルは0.0(透明)~1.0(不透明)の10進数の分数で指定します。

  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()」もアルファチャンネル値にマット値を使用していました。つまり、0が完全な不透明、255が完全な透明を表していました。これは、「W3C CSS3 Color Module recommendation for specifying colors」で定義されているとおりに変更され、特に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 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」と考えてください。これは、「赤」、「色相」、「シアン」など、画像の色空間によっては他のものを含む可能性があります。「赤」は単に「赤」または最初のチャンネルに通常使用されるチャンネルのラベルです。2番目に一般的に使用される色空間は「CMYK」であり、これは「白い」紙を暗くするために適用する必要がある色の「インク」の量を定義します(減法混色)。Kは「blacK」の略で、画像の負の強度値です。これは非常に一般的であるため、「RGB」チャンネルには「シアン」、「マゼンタ」、「イエロー」という別の名前、または文字「C」、「M」、「Y」もあります。実際には、これらは「RGB」画像に使用されるものと同じチャンネルセットを参照しています。「黒」または「K」カラーチャンネルには特別な4番目のカラーチャンネルも追加されます。これは基本的に、「Green」のカラーチャンネルが、「Magenta」に使用されるものとまったく同じカラーチャンネルを参照することを意味します。データ自体が「緑」か「マゼンタ」かは、チャンネル名ではなく、メモリ内の画像の「色空間」によって決まります。他の色空間でも同じことが起こります。「LAB」色空間を使用すると、「赤」チャンネルには「輝度」値が含まれ、「緑」チャンネルには「A」(または赤緑)値、「青」チャンネルには「B」(または青黄)値が含まれます。
同様に、チャンネル名「Alpha」(「A」)、「Opacity」(「O」)、「Matte」はすべて、「-channel」設定を参照するエイリアスです。画像の透明度情報です。「アルファ」チャンネルが「マット」チャンネルの逆であるかどうかは問題ではありません。これは依然として同じチャンネルを参照し、同じ結果、画像の内部マットチャンネルを生成します。オペレーターが内部アルファチャンネルデータを「アルファ」値として扱うかどうかは、オペレーターによって異なります。「-threshold」などの低レベルのチャンネルオペレーターは、メモリ内のチャンネルの生の「マット」データで動作します。しかし、「-fx」や「-composite」などのほとんどの上位レベルのオペレーターは、操作目的でそのデータを「アルファ」データとして扱います。格納された画像データの色空間を制御する別の方法があります。「-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」が作成され、この2つの非常に異なるタスクが分離されました。「-channel」オプションは、後続の画像操作で使用される設定に過ぎない一方で、「-separate」は、指定されたチャンネルを個別のグレースケールで完全に不透明な画像に抽出します。

IM v6.2.9-3 以降、「-separate」オペレーターを使用すると、「-channel」設定に従って複数のカラーチャンネルを分離できます。「-channel」設定の項目数によって、作成される画像の数(RGBA順)が決まります。たとえば、デフォルトの「-channel」設定は「RGB」であるため、デフォルトの動作は3つの画像を作成することです。以下にその出力を示します。

  magick rose: -separate separate_RGB_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
ここでは、「-colorspace」オペレーターを使用して、IMが画像の色データをCMYKカラー表現に格納する方法を魔法のように変えます。次に、関連する4つのカラーチャンネルを抽出します。

  magick rose: -colorspace CMYK -separate separate_CMYK_%d.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
最後の画像(「Black」または「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]
グレイ
グレイ
[IM Output]
Rec709Luma
[IM Output]
Rec601Luma (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の変更なしに格納されます。そのため、このバージョンより前のものよりも暗くなる傾向があります。「グレイ」(「強度」またはより正確には「輝度」とも呼ばれます)とYUV色空間の「輝度」は同等です。同様に、HSB色空間の「明るさ」とCMYK色空間の負の「blacK」チャンネルは同等です(グレースケール使用には通常明るすぎます)。LAB(およびLUV)色空間からの「輝度*」チャンネル(HSLからの「輝度」と混同しないでください)は、人間の視覚的知覚に最適な一致であると考えられていますが、グレースケール画像の生成には一般的に使用されません。グレースケール画像が与えられると、すべての色空間のグレースケール画像は、LAB / LUV色空間の「輝度*」(「R」)チャンネル画像を除いて、入力グレースケール画像とまったく同じ画像を生成することに注意してください。

その他のチャンネル分離方法

1つの方法は、1つのチャンネルを他のすべてのチャンネルにコピーして、分離オペレーターが生成するものと同様に、グレースケール画像を生成することです。シンプルですが遅い方法は、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" オペレーターは、2 つの画像が最初に赤、次に青であることを期待します。緑とアルファ値(画像に透過性がある場合)は、現在の "-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 画像にも有効です。CMYK 画像は、4 番目のカラーチャネルが必要なため、多くの場合、処理が困難です。

  magick separate_CMYK_?.gif  -set colorspace CMYK  -combine  \
          -colorspace sRGB  rose_CMYK_combined.gif
[IM Output]
代替策(以前のバージョンの IM の場合)は、1 つの画像(赤チャネル)を読み込み、適切なカラー空間に変更することです。その後、個々のチャネル画像を読み込み、チャネルコピー を事前に準備された画像に適用できます。

  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' 画像では機能しません。'Black' チャネル画像は実際に黒チャネルを含んでいないためです。"-compose CopyBlack" は、コピーする有効なデータが見つからず失敗します。これはバグとして認識していましたが、現在修正される可能性は低いです。

他のカラー空間を使用すると便利です。たとえば、ここでは組み込みの rose 画像を使用し、'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]
ご覧のとおり、これは簡素化されますが、達成したい効果によっては常に実用的とは限りません。

カラーチャンネルのゼロ化

場合によっては、1 つまたは 2 つのカラーチャネルをクリアまたは「ゼロ」にしたいが、他のすべてのチャネルはそのまま残したい画像(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 を使用するコンピューターシステムでは、計算集約度が高すぎない方法で、ユーザーが色を選択または変更するより良い方法が必要になりました。

色相ベースのカラー空間

おそらく最もよく知られている代替案の1つは、RGB色の色の選択インターフェースとして開発された、循環色相ベースのシステムです。基本的に、RGBカラーキューブは3次元で回転され、キューブの黒-グレー-白の対角軸がカラー空間の軸になりました。そして、これは色の暗さや明るさを指定しました。この変更の重要な特徴は、この軸の周りに一次色を均等に配置するRGB値からの簡単な変換であり、赤から緑、青、そして再び赤へと循環する色相を形成することでした。色がこの軸からどれだけ離れているか(放射状)は、彩度またはクロマとして知られていました。
たとえば、'HSB'(色相、彩度、輝度、HSV とも呼ばれ、V は値)カラー空間に変換した後、組み込みの 'rose:' 画像のチャネルを分離 してみましょう。

  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)でラップアラウンドする「モジュラス」値であることにも注意してください。これは、画像処理を行う際に問題になる可能性があります。視覚的には同一ですが、値の点では最大の色相距離だけ離れている2つの赤色があるためです。これは、色の違いに取り組む際に使用するのに適したカラー空間ではありません。実際、HSBとHSLカラー空間の明度/輝度チャネルは、さまざまな色相が均等に処理されないため、あまり役に立ちません。基本的に、一次色の強度を「均等化」します。たとえば、'黄色' の色相を '青' の色相に回転すると、非常に明るい色が非常に暗くなり、その逆も同様です。詳細については、HSLの欠点を参照してください。注意が必要です。
この同じ「六角錐」ベースの色相システムを使用するカラー空間も多数あります。HSB、HCL、HCLp(知覚HCL)。これら4つの「六角錐」カラー空間のカラーホイールを以下に示します。

  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%強度領域は、強い色を生成するのではなく、より自然なパステルカラーを生成します。たとえば、50%強度でのHSLカラー空間の色相との間の彩度の高い色相の比較を以下に示します。

  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' カラー空間のように共通の平面に「強制的に」配置されていないだけです。特に、HSLカラー空間の色相の結果とは異なり、HCLのすべてのシェードが要求されたとおりに同じ50%の強度を持っていることに注意してください。緑は、主要な色のうち、50%の強度にもっとも近い色であるため、50%の色相で良好な応答を示します。画像内のすべての色の一般的な明るさを維持するために、このカラー空間を使用して色相回転を行うことをお勧めします。HCLカラー空間での変調の例を参照してください。HWBカラー空間???

知覚カラー空間

カラー空間 'Lab' と 'Luv' は、画像のグレースケール強度と色成分を完全に分離するように設計されています。'RGB' や 'sRGB' などのカラー空間とは異なり、これにより、慣れてしまえば、カラー空間の処理と修正がはるかに容易になります。より具体的には、'Luv' は「知覚的に線形」になるように設計されました。つまり、カラー空間の一部の小さな色の変化は、カラー空間の別の部分の同様の変化とほぼ同じように見えます。このため、Luvカラー空間は画像の差分比較に非常に適しています。これら2つのカラー空間は非常に似ており、一般的に画像処理において同様の結果を生み出します。ここでは、'Lab' と 'Luv' カラー空間のチャンネルを分離して、これら2つのカラー空間が実際にはどれほど似ているかを示します。

  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' 'LCHuv' を使用して確認できます。これらのカラー空間の使用例については、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は、特定の色とほぼ一致する色を別の色に置き換えるための多くのオプションを自然に提供します。これは、非常に少数の色を含むアイコンや「ビットマップ」タイプの画像を扱う場合に最適ですが、色の濃淡やアンチエイリアシングのエッジピクセルを含む画像を扱う場合は失敗しがちです。基本的に、色は単一の色合いで置き換えられることを覚えておく必要があります。したがって、一連の色または近傍の色を置き換える場合、それらの色はすべて1つの特定の単一の色で置き換えられ、色の整合範囲で置き換えられるわけではありません。それは、陰影のある色の置き換えが不可能だと言っているわけではありませんが、現時点では、多くの作業を行わずに単純に行うことはできません。それにもかかわらず、GIF画像は半透明度を使用できないため、このように色を置き換えることは、GIFの背景の透明度を制御するための良い方法です(例については背景パターン上のGIFを参照)。もう1つの側面は、事前に定義されたカラーマップを使用してすべての「近い色」を特定のカラーマップにマッピングできますが、大規模な色のセットを完全に異なる別の色のセットに1対1で直接マッピングする演算子はありません。これは、将来のバージョンのIMで変更される可能性のある欠点です。その注意点で、IMが1つの特定の色を別の色で直接置き換えるために提供する方法を見てみましょう。

特定の色を置換

"-opaque" と "-transparent" 演算子は、画像内の1つの色を別の色に置き換えるように設計されています。たとえば、「blue」の色を「white」に置き換えるには、次のようなコマンドを使用します...

  magick balloon.gif  -fill white -opaque blue   balloon_white.gif
[IM Output] ==> [IM Output]
基本的に、「blue」だった色はすべて、現在の "-fill" の色に置き換えられました。ただし、IM v6.2.7の時点で、この演算子は "-channel" 設定によって制限されています。そのため、色(blueなど)を透過処理するには、「-channel」を指定してアルファチャンネルを含め、色を透過にする必要があります。また、透過情報を入れるために、画像に「マット」またはアルファチャンネルが有効になっていることを確認する必要があります。

  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" とは異なり、描画色の置換では、「一致する色」の反転はできません。Drawには、塗りつぶしの色の透過性のみが置き換えられる特別なマットの置換もあります。つまり、ピクセルの色自体を変更せずに、すべてのマッチする色を透過または半透過にすることができます。もちろん、適切なファイル形式を使用する場合です。

  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には、小さなファジィファクターをお勧めします。
または、シードポイントが探している色と正確に一致することを確認してください。
たとえば、エッジから塗りつぶすために既知の色で境界線を追加します...

  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]
'color' 引数は、シードポイントの色と一致する必要があるため、時々面倒になることがありますが、アクションは実行されません。しかし、これは役立つ場合もあります。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]
この場合、「Green」と「Blue」の範囲塗りつぶし操作のみがディスクにヒットし(そして塗りつぶされました)、一方「Red」の範囲塗りつぶしはディスクに一致しなかったため、画像の背景を誤って塗りつぶすことなく、ディスクは塗りつぶされませんでした。これはまた、特定の領域を既に塗りつぶした場合、2 つの点がその領域にヒットしても、後続の塗りつぶしでは同じ領域を「再塗りつぶし」しないことを意味します。これにより、多くの時間を節約できます。画像内の複数の「シード」ポイントからのより低レベルの範囲塗りつぶし操作を表す条件付き膨張も参照することをお勧めします。

ファジィファクター - 類似色/複数色のマッチング

前の例で示したように、単一の色を選択して置き換えるという全体的な結果は、通常はあまり良くありません。アンチエイリアシングのため、ソリッドカラーのエッジや領域には、一般的にエッジに色合いが混ざっています(詳細についてはアンチエイリアシングを参照してください)。そのため、可能であれば直接の色置換は避けるべきです。たとえば、ここでは、単純な白黒の「牛」のように見えるものを赤牛にしようとしています。

  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]
-opaque」演算子の「プラス」形式が追加されたバージョン6.3.7-10より古いIMを使用している場合は、このマスキング方法を使用して色のマッチングの結果を反転させることができます…

  magick colorwheel.png \
          \( +clone  -fuzz 30000 -transparent blue \
             -channel RGB +level-colors white +channel \) \
          -composite   opaque_blue_inv.png
[IM Output]
または、すべての変更を「アルファチャンネル」のみに制限する方法を使用すると、元のカラーはそのまま残ります。つまり、選択されていない色を完全に透明にするために、色選択から反転マスクを作成します。それらは存在しますが、透明です!

  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)は、「black」と「blue」を同等にします。Q16設定のIMの場合、この数値は65536(216)です。

blue」と「red」の色を一致させるには、この数値に2の平方根、つまりIM Q8の場合は362、IM Q16の場合は92682をかける必要があります。

すべての色を一致させるには(例:「black」と「white」)、3の平方根をかける必要があります。つまり、IM Q8の場合はファジィファクター設定444、IM Q16の場合は113512です。
LAB」や「LUV」などの「知覚的」なカラー空間を使用して、より適切で現実的な色の距離を定義できる可能性があります。ファジィカラーマッチングを実行する前に、画像をそのカラー空間に変換するだけです。これにより、「sRGB」や線形「RGB」カラー空間よりも、「純粋な青」と「黒」、「黄色」と「白」の色がはるかに近くなります。
上記の式からわかるように、直接的な色の距離は、コンパイル時の品質設定が正確に何であるかにも依存するため、使用するファジィファクターを設定する良い方法ではありません。「-fuzz」ファクターをパーセンテージで設定すると、使用がはるかに簡単になります。この場合、「100%」は、すべての色をカバーするのに十分な大きなファジィファクターを表します。つまり、RGBカラーキューブの3次元対角線に沿った「black」から「white」までの色の距離を表します。
ここでは、白と黒の距離の90%以内の任意の色を白で置き換えます。これにより、黒はRGBカラーキューブの反対側に位置するため、「black」に近い最後の10%の色のみが画像に残ることになります。

  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%の色の球を選択するよりもはるかに均一です。キューブの白い角を中心とした大きな球がそのキューブをどのように満たすかを考えてみてください。次に、黒い角を中心とした小さな球について考えてみてください。そうすれば、2 つの画像の違いを理解できるでしょう。
[IM Output]
-fuzz」ファクター100%は、「black」から「white」までのRGBカラーキューブの距離に相当します。これに基づいて、約57.7%のパーセンテージが「black」と「blue」の間の距離であり、81.6%が「blue」から「red」、またはこれらの色のいずれかから「white」までの距離であると計算できます。

要約すると、約25%より大きいものは(「blue」から「navy blue」までの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]
これにより、「black」や「white」ではなく、「yellow」がRGBカラー空間で最も遠い色であることがはっきりとわかります。また、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色が3次元空間でどのように立方体に配置されているかの結果です。しかし、「カラーホイール」画像は「完全に彩度が飽和した色」のみを含んでおり、これは基本的に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')でマッチングを行うと、ほぼ不透明なグレーの色が非常に球状にマッチングします。しかし、一致させる色がより半透明になるにつれて、一致する半透明色の数は大きくなるように見えます。完全に透明なグレーは、ほぼ透明な色と一致するようになります。これは、透明度が増加するにつれて、半透明色の間の距離が減少するためです。2つの色が透明になるほど、不透明な対応物と比較して、色は近づきます。2つの色が完全に透明な場合、2つの色は完璧な、または距離「0」の一致と見なされます。(IM v6.6.6-4現在)完全に透明な色(グレーなど)からの距離は、色の透明度(アルファ値)のみに依存する関数です。上記の最後の画像は、実際の色の違いに関係なく、完全に透明になる20%以内だったすべてのピクセルと一致しました。
これはまた、「ファズファクター」が大きいと、完全に透明な色(「なし」など)を使用して、すべての、またはほとんどすべての半透明色と一致させることができることを意味します。例えば…

  magick trans_gradient.png -channel RGBA \
          -fuzz 95% -fill Gray50 -opaque None \
          -alpha off  fuzz_trans.jpg
[IM Output]
上記では、ほぼ不透明な色の上位5%だけが一致せず、他のすべての半透明な色はグレーに変換されたことに注意してください。最終的な「-alpha off」は、画像から最後の半透明度を取り除きます。このため、「-channel RGBA」の設定は実際には必要ありませんが、完全性のために推奨されます。この例は、グレーの色を下地に追加する前に(透明な色をグレーにするために)、アルファチャネルの閾値を設定することに本質的に相当します。
IM v6.6.6-4より前のバージョンでは、ファジーカラーマッチングは完全に透明な色と不透明な色を等しく一致させませんでした。実際、黒は白よりもはるかに近い一致でした。そのため、最後の例は失敗します。詳細については、「ファズ距離と透明な色のバグ」を参照してください。
さらに悪いことに、IM v6.2.6-2より前のバージョンでは、ファジーカラーマッチングはすべての完全に透明な色を同じ色と見なしていませんでした。つまり、完全に透明な黒(「なし」とも呼ばれる)は、どちらも完全に透明であるにもかかわらず、完全に透明な白(または色「#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.