ImageMagick の例 --
色の変更

インデックス
ImageMagick の例 前書きとインデックス
色をグレースケールに変換
画像レベルの調整
ヒストグラムの修正を使った調整 (画像のヒストグラムを変更する)
DIY レベル調整 (一般的な色合い付け演算子)
画像の中間色を色付け (一般的な色合い付け演算子)
グローバルカラーモディファイア
ルックアップテーブルによる画像の色変更
ここでは、画像全体の色を変更するテクニックを見ていきます。画像を明るくしたり暗くしたり、より大幅な色の変更をしたりできます。
これらのテクニックを試すには、テスト画像が必要です...
私が実際にこの画像をどのように生成したのかは心配しないでください。この演習には重要ではありません。IM を使用する際に優れたワークアウトになるように、さまざまな色、透明度、その他の機能が含まれるように設計しました。
[IM Output]
この画像を生成するために使用したコマンドに本当に興味がある場合は、特別なスクリプト「generate_test」を参照してください。
警告: 次に示すカラー処理は一般に、画像が線形カラースペースを使用していることを前提としています。ただし、ほとんどの画像は sRGB またはガンマ補正されたカラースペースを使用して保存されているため、正しく行うには、最初にカラースペース補正も適用する必要があります。

色をグレースケールに変換

グレースケール画像は、元の画像の処理を進めたり、背景構成で使用したりするなど、多くの用途に非常に役立ちます。画像をグレースケールに変換する最適な方法は、IM に画像をグレースケールカラースペース表現に変換するように依頼することです。

  magick test.png  -colorspace Gray   gray_colorspace.png
[IM Output] ==> [IM Output]
青が赤よりもはるかに暗いのは、人間の目に映る強さに合わせて重み付けされているためです。つまり、「red」は「blue」に比べてかなり明るい色です。
これは、専用の「-grayscale」演算子 (IM v6.8.3-10 で追加) を使用した「rec709luma」変換式を使用するのと同等です。

  magick test.png  -grayscale rec709luma  gray_grayscale.png
[IM Output]
rec709luma」値は、「-intensity」設定で使用するために定義されている多くのグレースケール化式の 1 つにすぎません (下記参照)。
たとえば、これが別の一般的なグレースケール化式「rec601luma」です。

  magick test.png  -grayscale rec601luma  gray_grayscale_601.png
[IM Output]
ご覧のとおり、赤、緑、青のカラーチャネルの強度レベルにはわずかな違いがあります。
しかし、「グレースケール」には多くの異なる方法と意味があります...
たとえば、モジュレート演算子を使用して、すべての色の彩度レベルをゼロに設定することで、画像からすべての色を消すことができます。

  magick test.png  -modulate 100,0  gray_modulate.png
[IM Output]
これにより、本質的に画像は HSL カラースペースに変換され、そのカラースペースからグレースケールの「Lightness」値が抽出されます。ただし、「-define modulate:colorspace」を使用すると、使用する他のカラースペースモデルを指定できます。下記の他のカラースペースでのモジュレートを参照してください。テスト画像の中央の色の付いたディスクに使用した IM の「green」色が、色のついた虹で使用されているような純粋な緑ではなく、新しいSVG -- Scalable Vector Graphics規格で定義された半分の明るさの緑であることに注意してください。純粋な RGB の緑が必要な場合は、代わりに「lime」色を使用できます。詳細については、色の名前の競合を参照してください。
別の方法は、FX DIY 演算子を使用して 3 つのチャネルを平均化し、グレースケールの純粋な数学的意味を得ることです。

  magick test.png -fx '(r+g+b)/3' gray_fx_average.png
[IM Output]
sRGB チャネル値の平均は、'OHTA' カラースペース (赤チャネル) の強度チャネル、または HSI カラースペースの 'I' チャネルとも同等です。
別のテクニックは、3 つのチャネルをすべて加算する (マンハッタン距離として知られる色の測定) ことです。結果の画像は「量子丸め」効果により情報が失われることはありませんが、最も明るい色に関する情報が失われる可能性があります。残念ながら、透明度チャネルも失われます。

  magick test.png -separate \
          -background black -compose plus -flatten   gray_added.png
[IM Output]
同じチャネル追加手法を使用して、個々のカラーチャネルの重み付けを制御できます。たとえば、これは使用できる DIY 式の 1 つです...

  magick test.png -fx '0.3*r+0.6*g+0.1*b' gray_diy.png
[IM Output]
-fx」演算子内で同じ意味が必要な場合は、「強度」を使用することもできます。

  magick test.png  -fx intensity  gray_intensity.png
[IM Output]

ただし、FX DIY 演算子は解釈されるため、非常に遅くなる可能性があります。より複雑な操作の場合は、より単純な評価演算子-evaluate」を使用できます。たとえば、これは 2/5/3 比のグレースケール画像ですが、ここでも元の画像の透明度チャネルを保持しようとはしていません。

  magick test.png -channel R -evaluate multiply .2 \
                   -channel G -evaluate multiply .5 \
                   -channel B -evaluate multiply .3 \
                   -channel RGB -separate -compose add -flatten gray_253.png
[IM Output]
上記は、ImageMagick が 'Q8' 品質レベルでコンパイルされている場合、「量子化」の影響を受ける可能性があります。これは、「-evaluate」の結果が、画像の値に使用される小さな 8 ビット整数に保存されるためです。後になって初めて、これらの値が加算され、精度が低下します。

'Q16' でコンパイルされた ImageMagick、またはさらに優れたHDRI品質コンパイルオプションを使用すると、はるかに正確な結果が得られます。別の新しい方法は、Poly - 加重画像結合演算子です。これにより、分離されたチャネル画像の重み付けと加算が 1 回の操作で行われるため、「量子丸め」の影響を回避できます。

同様のテクニックを使用して、3 つの RGB チャネルを均等に平均化することにより、純粋な数学的なグレースケールを生成できます。

  magick test.png -separate -evaluate-sequence mean  gray_average.png
[IM Output]
ただし、ご覧のとおり、結果の画像のアルファチャネルを保持しようとはしていません。もう 1 つの高速な方法は、「-recolor」カラーマトリックス演算子を使用することです。これにより、3 つのカラーチャネルの重み付けを指定できます。

  magick test.png -recolor '.2 .5 .3
                             .2 .5 .3
                             .2 .5 .3'   gray_recolor.png
[IM Output]
これは透明度には影響しませんが、特定の重み付けを使用して色を変換するはるかに優れた方法になります。基本的に、最初の数値行は、結果の画像の赤チャネルのチャネル重み付け、次の 3 つは緑、最後の 3 つの数値は青のチャネル重み付けです。
また、「-type」を使用して、画像を読み書きするときに、IM に画像をグレースケールとして扱うように指示することもできます。

  magick test.png  -type GrayScaleAlpha  gray_type.png
[IM Output]
-type」設定は、通常、画像がファイルに読み書きされるときのガイドとしてのみ使用されます。したがって、そのアクションは画像の最後の書き込みまで遅延されます。その効果は、関与する画像ファイル形式の機能に大きく依存し、そのプロセス中の ImageMagick の通常の判断をオーバーライドするために使用されます。詳細については、タイプの例を参照してください。
IM v6.3.5-9 より前では、上記の操作によって、バグのために書き込まれた画像の透明度が削除されています (「-type Grayscale」と同等)。これは、私が問題を指摘して報告した直後に修正されました。(ここに教訓があります :-))

はるかに興味深いテクニックは、画像のさまざまなカラースペース表現から適切なカラーチャネルを抽出することによって、さまざまな明るさの意味を抽出することです。例については、カラースペース表現からのグレースケールチャネルを参照してください。

画像レベルの調整

画像に対して行うことができる最も基本的な調整は、「レベル」調整として知られています。これは基本的に、個々の RGB カラー値 (またはアルファチャネル値でさえ) を取得し、それらの値を伸長または圧縮するように調整することを意味します。チャネル値のみが調整されるため、カラー画像ではなく、グレースケール画像で最もよく実証されます。ただし、画像のすべてのカラーチャネルを同じ量だけ調整する場合は、画像の強調や調整を目的として、カラー画像で使用できます。これは、次に説明する例の主要なセクション正規化調整で見る、より自動的な形式のレベル調整と混同しないでください。この関数は、画像の実際の内容に関係なく、まったく同じ操作を実行します。画像が明るいか暗いか、または青色または黄色の色合いを持っているかどうかは関係ありません。操作は実際の画像の内容に対して盲目です。 [IM グラフ] これらの操作を説明するために、右に示すような、特別なスクリプト「im_graph」を使用して生成する、修正された「gnuplot」グラフを使用します。グラフには、指定された元の「x」値 (最上部のグラデーションのグレースケール値を表す) を表示される「y」値にマッピングする赤い線があります。結果のカラーグラデーションも、入力線形グラデーションの下に表示されます。右に示すグラフは、実際には画像に対して何も行わない IM 「-noop」演算子のグラフです。したがって、画像の各カラー値は、変更なしにまったく同じ値にマッピングされます。したがって、下側のグラデーションは上側のグラデーションと同じです。

画像のネガ化

最も単純で基本的なグローバルレベル調整は、"-negate" 画像演算子を使用して画像を反転させることです。基本的には、白を黒に、黒を白にするように、すべての色を調整します。つまり、赤は補色のシアンに、青は黄色になるなどです。以下のマッピンググラフを見ると、'test' 画像と標準の IM 内蔵の 'rose' 画像の両方で "-negate" 演算子を使用したことがわかります。マッピンググラフ画像の低い方のグラデーションが反転し、黒と白が入れ替わっていること、および反転された 'test' 画像にも同じ反転が現れていることに注目してください。

  magick test.png  -negate  test_negate.png
  magick rose:    -negate  rose_negate.gif
[IM Output]
[IM Output]
==> [IM Graph] ==> [IM Output]
[IM Output]
内部的には、negate は実際には非常に単純です。3つのカラーチャネルを独立して処理し、デフォルトではアルファチャネルを無視します。そうでない場合、以下のような非常に奇妙な結果が得られます...

  magick test.png -channel RGBA  -negate  negate_rgba.png
[IM Output] ==> [IM Output]
半透明のカラーグラデーションからわかるように、画像は反転しています。しかし、透明度チャネルも反転しているため、画像のすべての不透明な色が失われます。これが、"-channel" のデフォルト設定が 'RGB' である理由です。詳細については、カラーチャネルを参照してください。反転を1つのチャネル、たとえば緑色のチャネルだけに制限できます。これはあまり役に立たないように見えるかもしれませんが、時には非常に重要です。

  magick test.png -channel green  -negate  negate_green.png
[IM Output] ==> [IM Output]
"-negate" 演算子は、実際にはそれ自身の逆演算です。同じ "-channel" 設定で2回反転すると、互いに打ち消し合います。

  magick negate_green.png  -channel green  -negate  negate_restore.png
[IM Output] ==> [IM Output]
反転は、画像処理、特にグレースケール画像を他の処理オプションの前または後に扱う場合に非常に一般的です。そのため、試してみて、何かを行うときはいつでも心に留めておくことをお勧めします。反転した画像で作業することで、他の方法では難しい問題を解決できる場合があります。

ダイレクトレベル調整

"-level" 演算子は、より一般的なレベル調整演算子です。基本的に、'black_point' と 'white_point' の2つの値と、オプションの3番目の値(ガンマ調整)を指定します。これについては後で説明します。この演算は、画像のカラー値が 'black_point' 以下の場合、それらを黒(または0の値)にします。同様に、カラー値が 'white_point' 以上の場合、それらを白(または最大値)にします。これらの2つのポイントの間にある色は、値の完全な範囲を埋めるように線形に「引き伸ばされ」ます。この効果は、コントラストを改善し、画像内の色を強調することです。たとえば、グラフで示されているのと同じ値を使用して、テスト画像のコントラストを25%強調してみましょう。通常は、黒点と白点を `0%` と `100%` から同じ量だけ調整するため、'black_point' のみを指定できます。白点は同じ量だけ内側に調整されます。

  magick test.png  -level 25%,75%  test_level.png
  magick rose:    -level 25%      rose_level.gif
[IM Output]
[IM Output]
==> [IM Graph] ==> [IM Output]
[IM Output]
25% はあらゆる画像にとって非常に大きなコントラスト強調ですが、何をするかが明確にわかります。'black' と 'white' の両方のポイントを変更する必要はありません。代わりに、カラーレンジの一端だけを調整することも十分に可能です。たとえば、非常に明るい、または非常に暗いバラの画像を作成できます。

  magick rose: -level 0,75%     rose_level_light.gif
  magick rose: -level 25%,100%  rose_level_dark.gif
[IM Graph] ==> [IM Output]  [IM Graph] ==> [IM Output]
ただし、与えられた範囲外の色は「クリップ」または「焼き付け」され、後で画像処理に使用できなくなることに再度警告します。これは、"-level" 演算子を使用する際の最大の問題です。 [IM Graph] 負の値を使用すると、画像のおおまかなコントラストを下げることができます。これは、値を '黒' と '白' にマッピングするためのカラー値を提供するのではなく、代わりに架空の負の色を黒または白にマッピングするようにカラー値を圧縮することを意味します。結果は画像の全体的なグレーイングになります。

  magick rose: -level -25%  rose_decontrast.gif
[IM Output]

ただし、この画像のコントラストを下げる方法は非常に不正確であり、新しい 反転レベル演算子にアクセスできないバージョン6.4.2よりも古いIMを使用している場合を除いて、推奨されません。 [IM Graph] "-level" 演算子を使用して、画像 (前述のように、"-level 100%,0" を使用して、指定された '黒' と '白' のポイント値を交換するだけ) を反転させることができます。

  magick rose: -level 100%,0  rose_level_neg.gif
[IM Output]

[IM Graph] または、それらを同じ値に設定することで、画像内のすべてのカラー値をしきい値処理することができます。"-level" を使用して画像のしきい値処理を行うことは、その値で しきい値演算子を使用したのと同じです。右に表示されているマッピンググラフは、"-level 50%,50%" 操作の結果と、グレースケールグラデーションへの影響を示しています。

  magick rose: -level 50%,50%  rose_level_thres.gif
[IM Output]

"-threshold" とは異なり、デフォルトの "-channel" 設定で使用した場合、画像は自動的にグレースケール画像に変換されません。レベルを使用して画像を線形に修正するという一般的な性質により、"-level" 演算子は、一般的なグレースケール画像の変更やマスク調整に適しています。画像全体ではなく、個々のチャネル ( "-channel" 設定を使用) を変更できるという事実を追加すると、IMユーザーが利用できる最高のカラー変更演算子の1つになります。
また、評価および関数演算子を使用して、カラー値のより直接的な数学的変更を行い、-level の + 形式と - 形式の両方で同じ結果を実現できることに注意してください。
"-level" 演算子は、透明度チャネルを「マット」値として扱うことに注意してください。そのため、100%は完全に透明で、0%は不透明です。"-level" をぼやけたシェイプ画像で使用する場合は、これを考慮に入れてください。これは通常、結果を拡張および引き伸ばすために、 'シェイプ' 画像をぼかした後に実行されます。この例については、ソフトエッジ、およびシャドウアウトラインを参照してください。

反転レベル調整-- 画像のコントラストを低減する

IMバージョン6.4.2以降、レベル演算子は、 '反転' 形式の "+level" (「プラス」に注意)を提供するように拡張されました。または、演算子の元の "-level" 形式を使用できますが、(古いAPIインターフェースの場合)与えられたレベル引数に '!' を追加します。このバリアントの引数はまったく同じですが、'black_point' と 'white_point' を '黒' と '白' にマッピングするように値を引き伸ばすのではなく、'黒' と '白' を指定されたポイントにマッピングします。言い換えれば、"+level" は "-level" の正確な逆です。たとえば、ここで '黒' を 25% のグレーに、白を 75% のグレーにマッピングして、'反転' 形式を指定する2つの方法を使用して、画像を非常に正確な方法でコントラストを低減します。

  magick test.png   +level 25%    test_level_plus.png
  magick rose:     -level 25%\!  rose_level_plus.gif
[IM Output]
[IM Output]
==> [IM Graph] ==> [IM Output]
[IM Output]
上記の "+level 25%" 操作を、以前に示した負のコントラスト低減 "-level -25%" 演算子の使用と比較すると、同じではないことがわかります。'プラス' バージョンは、はるかにコントラストの低い画像(グレーが強い)を生成しますが、演算子に与える正確な値にマッピングすることでそうします。'マイナス' 形式で使用される「架空」の値ではありません。この正確な値の使用は重要であり、演算子の 'プラス' 形式が追加された理由の1つです。もちろん、'25%' は再び非常に大きな値であり、典型的な画像作業での使用はお勧めしません。"-level" と "+level" は、実際には同じ引数が与えられた場合、互いに正確な逆演算です。つまり、一方は値を範囲の極値にマッピングし、他方は範囲の極値からマッピングします。たとえば、ここでは "+level" を使用してテスト画像のカラーを圧縮し、次に "-level" を使用して再度展開して、画像の外観を元の状態に近づけます。

  magick test.png  +level 20%  -level 20%  test_level_undo.png
[IM Output] ==> [IM Graph] ==> [IM Output]
2つの画像は非常に類似しているように見え、IMの高品質な Q16 バージョンを使用しているため、違いに気付くのは難しいでしょう。ただし、実際には画像のカラー値を整数のより小さな範囲に圧縮し、再び復元したため、値がまったく同じではない可能性があります。極端な場合、これにより量子丸め効果が発生する可能性があります。これらの2つの操作を逆の順序(カラー値を引き伸ばし、次に圧縮する)で実行すると、量子クリッピング効果が発生します。"+level" 演算子のもう1つの便利な点は、画像内のすべてのカラー値を同じグレースケールレベルに完全に圧縮できることです。

  magick test.png  +level 30%,30%  test_level_const.png
[IM Output] ==> [IM Graph] ==> [IM Output]
個々のチャネルの特定の色値に従ってレベルを指定することにより、グレースケールグラデーションを特定のカラーグラデーションに効果的に魔法をかけることができます。ただし、これは計算して実行するのがかなり困難です。そのため、'レベル' 値ではなく、特定の色で黒点と白点を指定できるようにする "-level-colors" 演算子も提供されています。以下の色によるレベルを参照してください。

レベルガンマ調整

上記の「-level」のどちらのバリアントでも、3つ目の設定値である「ガンマ」調整値を使用できます。デフォルトでは、この値は1.0に設定されており、結果の画像の中間トーンの調整は行わず、元の画像から新しい画像への値の純粋な線形マッピングを生成します。ただし、この値を大きくすると、結果の線が曲線を描き、画像が明るくなるように調整され、値を小さくすると画像が暗くなります。たとえば、ここでは「ガンマ」設定のみを使用して、画像の中間トーンのみを明るくしたり暗くしたりします。

  magick rose: -level 0%,100%,2.0   rose_level_gamma_light.gif
  magick rose: -level 0%,100%,0.5   rose_level_gamma_dark.gif
[IM Graph] ==> [IM Output]  [IM Graph] ==> [IM Output]
一般的に、値の範囲は、目がくらむほど明るい画像の場合は10から、非常に暗い画像の場合は0.2までです。前述のように、1.0の値では画像に「ガンマ」の変更は行われません。ただし、特別な値「2.0」(上記参照)を使用すると、画像の正規化された色の平方根を取得できます。「-level」のどちらのバージョンも、「ガンマ」を同じように処理します。つまり、「黒」と「白」の両端のレベル調整を、非線形の「ガンマ」調整と組み合わせることができます。また、画像の一つのチャンネルのみを調整することも可能です。たとえば、ここでは、青チャンネルの黒の端に微妙な色合いを与え、ガンマを使って画像の中間トーンの色レベルを維持します。

  magick test.png  -channel B +level 25%,100%,.6 test_blue_tint.png
[IM Output] ==> [IM Graph] ==> [IM Output]
この特定の例は、海のみが純粋な黒で、陸地がより灰色である気象衛星写真に色合いを付けるために使用できます。この青チャンネルの調整の別の方法は、DIY数学的な非線形調整で後述します。

ガンマ演算による調整

-gamma」演算子も提供されており、「-level」演算子の「ガンマ」設定とまったく同じ効果があります。ただし、各チャンネルの「ガンマ」調整レベルを個別に調整できます。その本当の使い方は、画像に対して線形演算を実行する前に、画像の「ガンマ」関数を調整することです。詳細については、人間の色の知覚とガンマ補正を参照してください。また、この関数を使用して、個々のRGBチャンネルごとに画像の明るさを異ならせることもできます。

  magick rose: -gamma 0.8,1.3,1.0  gamma_channel.gif
[IM Output]
ご覧のとおり、これを使用して画像に微妙な色合いや色の調整を加えたり、特定の色が多すぎる画像を修正したりできます。
この関数を使用する理由については、ガンマ補正を参照してください。

この関数は実際にはEvaluate POW関数と同等ですが、引数が反転しています。そのため、「-evaluate POW 2.2」は実際には「-gamma 0.45455」(0.45455は1/2.2に等しい)演算を行い、これは「-gamma 2.2」の逆になります。
-gamma」のあまり明白でない使い方の1つは、特定の画像チャンネルをゼロにすることです(カラーチャンネルのゼロ化を参照)。または、画像を完全に「黒」、「白」、またはその他の原色で着色することです(原色のキャンバスを参照)。

色によるレベル調整

-level-colors」演算子は、IM v6.2.4-1で追加されました。基本的には、上記で説明したレベル演算子とまったく同じですが、各チャンネルの値が色値として指定されています。つまり、「-level-colors」オプションは、指定された色を「黒」と「白」にマッピングし、他のすべての色をそれらの間で線形に引き伸ばします。これにより、画像から指定された色の範囲が効果的に削除されます。そして、これは機能しますが、いくつかのチャンネルで共通の値を持つ色では失敗しやすいため、特に便利ではありません。たとえば、「DodgerBlue」と「White」の色は、青チャンネルで同じ色値を持っています。そのため、「-level-colors DodgerBlue,White」は、それらの色を常に黒と白に変換できるとは限りません。その場合のより良い手法は、最も違いが大きいチャンネル(赤など)のグレースケール画像を抽出し、そのチャンネルをレベル調整または正規化することです。警告:透明な色に注意してください。
一方、演算子のプラス形式「+level-colors」は、非常に便利です。「黒」と「白」の色を、指定された値にマッピングし、他のすべての色を線形に圧縮して、指定した2つの色に合わせます。たとえば、「black」と「white」を「green」と「gold」にマッピングしてみましょう。

  magick test.png  +level-colors green,gold   levelc_grn-gold.png
[IM Output] ==> [IM Output]
ご覧のとおり、グレースケールグラデーションは、指定された色で囲まれたグラデーションに再マッピングされ、グレースケール範囲外の色も変更されますが、指定された色の範囲の基本スタイルにも従います。これにより、「+level-colors」演算子は、特にグレースケール画像をマッピングするときに非常に便利になります。色の名前を1つだけ指定し、カンマを含めると、欠落している色は必要に応じて「black」または「white」のいずれかにデフォルト設定されます。

  magick test.png  +level-colors ,DodgerBlue   levelc_dodger.png
  magick test.png  +level-colors ,Gold         levelc_gold.png
  magick test.png  +level-colors ,Lime         levelc_lime.png
  magick test.png  +level-colors ,Red          levelc_red.png

  magick test.png  +level-colors Navy,         levelc_navy.png
  magick test.png  +level-colors DarkGreen,    levelc_darkgreen.png
  magick test.png  +level-colors Firebrick,    levelc_firebrick.png
[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output]
これにより、グレースケール画像を好きな色のグラデーションに簡単に変換できます。たとえば、ここでは、白黒のグラデーションを赤と白のグラデーションに再マッピングします(引数の「,」に注目してください)...

  magick cow.gif   +level-colors red,   cow_red.gif
[IM Output] ==> [IM Output]
これは、「黒」を「赤」に置き換えただけでなく、アンチエイリアスされたグレーの色も「赤」と「白」の適切な混合に再マッピングし、非常に滑らかな結果を生み出しました。[IM 出力] もし、純粋な黒色を赤色に変換するだけの単純な直接色置換を実行した場合、ひどい画像(右に表示)になっていたでしょう。その画像を生成するために使用された例については、ファズファクターを参照してください。もちろん、色の1つを代わりに透明にしたい場合は、グラデーションをアルファチャンネルに転送する必要があるため、-alpha Shape演算子を使用する方が適しています。
カンマ「,」区切り文字なしで単一の色を指定した場合、その色が黒点と白点の両方に使用されます。つまり、画像内のすべての色がその1つの色にリセットされます(現在の「-channel」設定の制限に従います)。

  magick test.png  +level-colors dodgerblue  levelc_blue.png
[IM Output]
これは、「-fill DodgerBlue -colorize 100%」を使用して画像をカラー化する(下記参照)のと同じ結果です。画像の透明度設定も設定する場合は、「-channel」を透明度チャンネルを含めるように設定するか、「-alpha opaque」または「-alpha off」を使用してアルファチャンネルを完全に不透明に設定する必要があります。

  magick test.png -channel ALL +level-colors dodgerblue levelc_blue2.png
[IM Output]
また、既存の画像をブランクにするも参照してください。グレースケール画像ではなく、カラフルな画像を調整または「色付け」するためにこれを使用する、さらにいくつかの例を次に示します。

  magick rose: +level-colors             navy,lemonchiffon  levelc_faded.gif
  magick rose: +level-colors        firebrick,yellow        levelc_fire.gif
  magick rose: +level-colors 'rgb(102,75,25)',lemonchiffon  levelc_tan.gif
[IM Output] ==> [IM Output] [IM Output] [IM Output]
要約すると、「+level-colors」は、グラデーション色の置換、線形の色付け演算子であり、色を完全にリセットすることもできます。

シグモイド非線形コントラスト

画像処理の基礎」に関するPDF論文(44ページ)から、彼らは、線形コントラスト制御(レベル)を使用する代わりに、ガンマ補正を使用するものを「シグモイド非線形コントラスト制御」として紹介しています。その結果、写真の色調整にはるかに適した、非線形、滑らかなコントラスト変化(数学用語で「シグモイド関数」)が、色範囲全体にわたって発生し、白と黒の色が保持されます。論文の正確な公式は非常に複雑で、間違いさえありますが、基本的には2つの調整値が必要です。コントラスト関数が中心となるしきい値レベル(通常は「50%」を中心)、およびコントラスト係数(「10」は非常に高く、「0.5」は非常に低い)です。
興味のある方のために、「シグモイド非線形コントラスト制御」の修正された公式は次のとおりです。
( 1/(1+exp(β*(α-u))) - 1/(1+exp(β*(α)) ) / ( 1/(1+exp(β*(α-1))) - 1/(1+exp(β*α)) )
ここで、αはしきい値レベル、βは適用するコントラスト係数です。

中間変数を使用する公式の別のバージョンを次に示します。
x = exp(β * (α - u)) y = exp(β + 1 結果 (x / y + 1) * (1 / (x + 1) - 1 / y)
この式は実際には非常に単純な指数曲線であり、上記の式の大半は、0が常に0のままであり、1が常に1のままであることを保証するように設計されています。つまり、グラフは常に点0,0と1,1を通過します。そして、変化の最も大きい勾配は、与えられたしきい値にあります。
たとえば、これは上記の公式の「-fx」の実装で、非常に高いコントラスト値「10」としきい値「50%」を結果として示しています。これらの値は、関数を高速化するために浮動小数点定数に組み込まれています。

  magick test.png  -fx '(1/(1+exp(10*(.5-u)))-0.006693)*1.013567' \
              sigmoidal.png
[IM Output] ==> [IM Graph] ==> [IM Output]
幸いなことに、IM v6.2.1には、この複雑な関数が新しい演算子「-sigmoidal-contrast」として組み込まれており、はるかに簡単なアプリケーションを可能にしています。

    magick test.png  -sigmoidal-contrast 10,50% test_sigmoidal.png
[IM Output]
おまけに、IMは逆関数である「シグモイドコントラスト低減」関数(演算子のプラス「+」形式)も提供しています。同じ引数を適用すると、元の画像が(ほぼ正確に)復元されます。

    magick test_sigmoidal.png +sigmoidal-contrast 10,50% \
                                             test_sigmoidal_inv.png
[IM Output]
そして、ここでそれをバラの画像に適用します...

    magick rose: -sigmoidal-contrast 10,50%  rose_sigmoidal.gif
[IM Output]
10」は非常に重いコントラスト係数であると言いました。実際、この値よりも大きい値は、コントラスト強調ではなく、ファジーなしきい値操作のようなものと見なすことができます。この演算子の実用的な使用例については、シェイプされた領域の色に追加されている明るい領域をシャープにするために使用される、高度な「ジェル」効果の例を参照してください。

その他のコントラスト演算子

建設中
   -contrast  and   +contrast
         Rather useless minor contrast adjustment operator

-threshold
   Threshold the image, any value less than or equal to the given value is
   set to 0 and anything greater is set to the maximum value.

   Note that like level, this is a channel operator, but if the default
   'channel setting' is used only the gray-scale intensity of the image is
   thresholded producing a black and white image.

   magick rose: -threshold 45%  x:

   You can force normal channel behaviour, where each channel is thresholded
   individually buy using "-channel All"

   magick rose: -channel All -threshold 45%  x:

-black-threshold
-white-threshold
   This is like -threshold except that only one side of the threshold value is
   actually modified.

   For example, here anything that is darker than 30% is set to black.

   magick rose: -black-threshold 30%  x:
   magick rose: -white-threshold 50%  x:

   These operators however do not seem to be channel effected, so may only be
   suitable for gray-scale images!


ヒストグラム修正を使用した調整

このセクションは、Fred WeinhausとAnthony Thyssenの共同作業によるものです。ヒストグラムとは何ですか?ヒストグラムは特殊なタイプのグラフです。画像内のピクセルの色レベルを、それぞれが値の小さな範囲にまたがる固定数の「ビン」にソートするだけです。そのため、各ビンには、その範囲に該当する画像内の色レベル(ピクセル値)の数が含まれます。その結果、画像を作成する色の値が、左の黒から右の白まで、どのように分布しているかが表現されます。
ヒストグラムは、各チャンネルごとに個別に生成することも、すべてのチャンネルの値を組み合わせてグローバルなヒストグラムとして生成することもできます。結果は、棒グラフの画像として表示されることがよくあります。IMでは、これは特別なHistogram:出力形式を使用して行われます。例えば...

  magick rose: histogram:histogram.gif
[IM Output]
しかし、棒グラフの上部を線でつなぐ折れ線グラフとして表示することもできます。これについては、後の議論で実例を示します。この特別な出力形式の詳細については、Histogram:を参照してください。IMを使用して画像に関するヒストグラム情報を抽出する最良の方法なので、この時点で読んでおくことをお勧めします。ヒストグラムチャートの実際の高さは、通常、最も高いピークが画像の上部に触れるようにスケーリングされるため、実際には意味がありません。そのため、個々の「バー」の高さは重要ではありません。はるかに重要なのは、全範囲にわたるヒストグラムの分布と、チャート全体での相対的な高さの相互関係です。ヒストグラムを見るときは、以下の要素を考慮します。
  • ヒストグラムは、値の広い帯を形成していますか?これは、画像がカラースペースを広く使用しており、コントラストが高いことを意味します。
  • あるいは、値の範囲の中央または端に密集していますか?これは、画像がコントラストが低く、「かすんだ」または「灰色がかった」ように見えるか、明るすぎたり暗すぎたりすることを意味します。
  • 2つ以上のピークを形成していますか?これは、画像内の非常に異なる領域または領域の結果です。
  • ほとんどのピクセルはどこにありますか?左側にある場合は、画像が非常に暗いことを意味します。右側にある場合は、非常に明るいことを意味します。それとも、中央付近に広がっていますか?
  • 個々のバーの間に規則的なギャップまたは空白のスペースがありますか?これは通常、画像にピクセルが非常に少ないため、ヒストグラム全体を完全に埋めることができなかったか、画像が色を減らされたか、ギャップを生成するように何らかの方法で変更されたことを意味します。
基本的に、ヒストグラムは画像のより単純な表現であり、そのヒストグラムの観点から画像を調整または変更する方がはるかに簡単です。画像に適用するほぼすべての数学的な色変換は、通常、画像だけでなく、そのヒストグラムも変更します。これには、レベル演算子などの線形演算や、ガンマ演算子などの非線形演算が含まれます(上記を参照)。上記で見たマッピンググラフは、画像内のグレーレベル、つまり画像のヒストグラムをどのように変換するかを表しています。たとえば、コントラストの低い画像を作成して実例を示しましょう。ただし、最終的な結果は、画像を修正するだけでなく、画像のヒストグラムを(圧縮することによって)修正することによって修正します。

  magick chinese_chess.jpg -contrast -contrast -contrast -contrast \
          chinese_contrast.png

  magick chinese_chess.jpg     histogram:chinese_chess_hist.gif
  magick chinese_contrast.png  histogram:chinese_contrast_hist.gif
[IM Output] ==> [IM Output]
[IM Output] ==> [IM Output]
上記の場合、"-contrast"は、画像に少しコントラストを加える簡単なレベルタイプの演算子です。この結果、ヒストグラム自体がより広がり、可能な色の範囲全体をより良くカバーするようになります。ヒストグラムの前後の比較から、色のストレッチの実行方法により、「ビン」の間にギャップと穴が生じることもわかります。具体的には、すべての色が「ビン」に配置された「ヒストグラム」が作成されます。これらの「ビン化された」色は、全体として変更されるため、画像の色がグループ化されます。これは、画像の色を処理する特に良い方法ではありません。ただし、この演算子は画像の内容や色の分布に関する知識がなく、盲目的に動作します。したがって、この演算子が適用された画像をより良くするのではなく、悪化させる可能性が非常に高いため、ユーザーが制御しないで行うことはできません。このセクションでは、画像処理の決定プロセスの一部として画像のヒストグラムを調べる画像処理演算子について見ていきます。次に、この調査の結果を使用して画像を修正し、画像の色分布の品質を向上させます。これらの演算子は、処理される画像からの実際の情報を使用するため、ユーザーによる多くのチェックを行わなくても、多くの画像に対してよりグローバルに使用できることがよくあります。このタイプの演算子には、"-normalize"、"-contrast-stretch"、"-linear-stretch"などの自動線形「レベル」タイプ演算子だけでなく、"-equalize"などの非線形演算子や、最終的にImageMagickに含まれる可能性のある、Fred Weinhaus氏のスクリプト、"redist"などがあります。

ヒストグラムストレッチング

前の例のような最も単純な手法では、色範囲を改善するために、画像のヒストグラムを単純に外側にストレッチします。ただし、レベル操作で黒点白点を盲目的に選択する代わりに、画像のヒストグラムに基づいて点を選択します。基本的に、各ヒストグラムビンの色の値を、両端から内側に、あるしきい値に達するまでカウントします。これらの点は、ヒストグラム(レベル)ストレッチの黒点白点として使用されます。図が必要 基本的に、ヒストグラムのカウントは、ストレッチによって黒と白に強制されるグレーレベルの値を提供します。つまり、純粋な黒から選択された黒点ビンの対応するグレーレベルまでのビン範囲内にある画像内のすべてのピクセルは、最終的に純粋な黒になります。同様に、純粋な白から白点ビンの対応するグレーレベルまでのビン範囲内にある画像内のピクセルは、最終的に純粋な白になります。ただし、これらの点の外側にあるピクセルは、可能な色の値の範囲外にストレッチされており、その結果、範囲の限界に設定されます。つまり、これらのピクセルは、純粋な黒または純粋な白の極端な色値に変換されるため、「クリッピング」され、「焼き付け」られます。その結果、黒点白点を選択するための「しきい値」の制限が高すぎると、画像に黒と白の領域が多くなり、結果として得られるヒストグラムの極端な端のビンに大きなカウント(高いバー)が表示されます。ひどい焼き付きの例 -- 中国のチェス画像?「ストレッチ」演算子のまとめ... -contrast-stretchと-linear-stretchは両方とも、(1024ビンを使用して)色をストレッチする位置を決定するためのヒストグラムを生成します。そのため、「正確」ではありません。もう1つの違いは、「ゼロ」の処理方法であり、-linear-stretchは実際にストレッチを実行するために-level操作を実行しますが、-contrast-stretchは色の置換ストレッチにヒストグラムビン値を使用します(1024の量子化丸め効果が発生します)。 -normalizeは内部的に-contrast-stretchを使用します。数学的に完璧な正規化ストレッチ演算子は-auto-levelです。完璧な「白点のみ」または「黒点のみ」バージョンも可能ですが、現時点では実装されていません。

自動レベル - 完璧な数学的正規化

"-auto-level"は、画像をフル量子範囲にストレッチするために使用する画像内の最大値と最小値を検索します。ヒストグラムが値の範囲を超えてストレッチされた結果、値が「クリッピング」されたり、「焼き付け」られたりすることはありません。"-channel"設定は、すべてのチャンネルが「同期して」均等にストレッチされるか(すべてのチャンネルの最大値と最小値を使用)、個別にストレッチされるか(各チャンネルを別個のエンティティとして)を決定します。現時点では、完全に透明なピクセルの隠された色もレベルの決定に使用されますが、透明度が関係する場合、これはいくつかの問題を引き起こす可能性があります。これはバグと見なされています。
FUTURE: We actually need three modes of operation...
  synced color channels with 'alpha' (and 'read') masking.
  synced channels (as defined by channel)       (current default)
  individual separate channels   (currently if -channel is set by user)
これは、手動のレベル演算子と同様の、純粋な数学的なヒストグラムストレッチです。つまり、最小値はゼロに調整され、最大値は量子範囲に調整され、線形方程式を使用して画像内の他のすべての値を調整します。レベルを決定するために使用される可能性のある「ヒストグラムビン」やその他の「値のグループ化」は使用しません。

正規化

"-normalize"演算子は、これらの3つの演算子の中で最も単純なものです。これは、グレースケールヒストグラムを、グレー値の完全なダイナミックレンジを占有するように拡張するだけで、ヒストグラムの低い(黒)端で2%、高い(白)端で1%クリッピングまたは焼き付けを行います。つまり、画像内の最も暗いグレーの2%が黒になり、最も明るいグレーの1%が白になります。これはほとんどの画像では大きな損失ではなく、全体的な結果として、画像のコントラスト(強度範囲)が自動的に最大化されます。理想的な図が必要です!中国のチェスを使用した例?ここで、グレースケールグラデーションを作成し、それを完全に黒と白の範囲に拡張します。

  magick -size 150x100 gradient:gray70-gray30 gray_range.jpg
  magick gray_range.jpg  -normalize  normalize_gray.jpg
[IM Output] ==> [IM Output]
JPEGの色精度(詳細についてはJPEGの色歪みを参照)やスキャンした画像のノイズに関する実際的な理由から、"-normalize"は最も明るい色と最も暗い色を拡張するのではなく、それらの値をわずかに超えて拡張します。つまり、これは、値が'2%,99%'の"-contrast-stretch"と同じです(下記を参照)。

つまり、最高の色値と最低の色値が非常に近い場合、"-normalize"は失敗し、何も処理は行われません。

正確に最も明るい色値と最も暗い色値を極限まで拡張する場合は、代わりに"-auto-level"を使用してください。
IMバージョン6.2.5-5まで、"-normalize"は純粋にグレースケール演算子として機能していました。つまり、赤、緑、青、およびアルファチャンネルのそれぞれは、"-channel"設定に従って、互いに独立して拡張されました。IMバージョン6.2.5-5以降、デフォルトの"+channel"設定のみが指定されている場合、"-normalize"はすべてのカラーチャンネルを結合し、すべて同じ量で正規化します。これにより、画像内のピクセル色がシフトしないことが保証されます。ただし、純粋な白または黒の色のピクセルが得られない可能性もあります。たとえば、ここでは、正規化テスト画像にいくつかの追加の色(青から紺へのグラデーション)を追加しました。

  magick -size 100x100 gradient:gray70-gray30 \
          -size  50x100 gradient:blue-navy  +append  color_range.jpg
  magick color_range.jpg -normalize  normalize.jpg
[IM Output] ==> [IM Output]
最後の例からわかるように、カラー画像の場合、"-normalize"はすべてのチャンネルをまとめて最大化しているため、1つのチャンネルはゼロ値を持ち、別のチャンネルは最大値を持ちます。つまり、すべての追加された青色には「赤」および「緑」チャンネルに「ゼロ」値がすでに含まれているため、黒のピクセルは生成されませんでした。そのため、画像の低い方の境界は拡張されませんでした。
古い"-normalize"の動作(IM v6.2.5-5以前)が必要な場合は、デフォルト以外の"-channel"設定を指定する必要があります。アルファ(またはマット)チャンネルを含まない画像の場合、「all」チャンネル設定を使用できます。

  magick color_range.jpg -channel all  -normalize   normalize_all.jpg
[IM Output]
あるいは、"-separate"演算子(IM v6.2.9-2以降)を使用して各チャンネルを個別の画像として正規化し、それらを"-combine"して単一の画像に戻すこともできます。

  magick color_range.jpg -separate -normalize -combine normalize_sep.jpg
[IM Output]
これらの最後の2つの例では、画像のグレースケール領域が黄色に変わっていることがわかります。これは、'red'と'green'チャンネルが明るくなり、'blue'チャンネルがわずかに暗くなったためです。このことから、重要な点が浮かび上がってきます。
ノーマライズやその他のヒストグラム演算子は、実際にはグレースケール演算子であり、
カラー画像で使用する場合は注意が必要です。
実際、「-normalize」は、より一般的な「-contrast-stretch」のサブセットに過ぎず、黒点=2%、白点=1%のデフォルト値が設定されています。では、「-contrast-stretch」とは何でしょうか?

コントラストストレッチ

-contrast-stretch」演算子(IM v6.2.6で追加)は、「-normalize」に似ていますが、クリップまたは焼き付けられるピクセル数をユーザーが指定できる点が異なります。つまり、ヒストグラムのストレッチに使用する「黒点」と「白点」の選択をある程度制御できます。したがって、ユーザーは、画像内で最も暗いグレースケールの数を黒に、最も明るいグレースケールの数を白にするように指定します(数またはパーセント数)。たとえば、これにより、上位と下位の15%の色が極値(白と黒)に置き換えられ、残りの70%の色が適切にストレッチされます。最終的な結果は、画像の全体的なコントラストを改善することです。

  magick gray_range.jpg  -contrast-stretch 15%  stretch_gray.jpg
[IM Output] ==> [IM Output]
上記グラデーションの上部と下部で「焼き付け」と「クリップ」の効果を簡単に確認できます。これらのグレーの色は、色の範囲の限界をはるかに超えてストレッチされるからです。
そしてここでは、意図的に暗いグレーの90%を「焼き付け」、最も明るいピクセルの10%だけを残して、画像の上部で狭い線形グラデーションにストレッチしました。

  magick gray_range.jpg  -contrast-stretch 90%x0%  stretch_black.jpg
[IM Output]
これは、画像内で最も明るい「N」個のピクセルを見つけるために非常に役立ちます。これらのピクセルは、ゼロの値に「焼き付け」られない唯一のピクセルになるからです。(より良い方法は「-threshold-black」を使用することです。)「-contrast-stretch」の重要な側面は、黒点白点のしきい値カウントにゼロを使用することです。この場合、「-contast-stretch 0」は、画像のヒストグラム内の最小と最大のビンを見つけます。カウントは実際にこれらのビンから始まるため、結果は単純に最小と最大のビンを完全な黒と完全な白にストレッチすることになります。これにより、クリッピングが最小限またはおそらくゼロのコントラストストレッチが行われ、これらの「ビン」内のすべての値が0および最大値になります。
 
建設中

線形ストレッチ

多くの点で、「-linear-stretch」は前の「-contrast-stretch」演算子と非常によく似ています。どちらの関数も、黒点と白点の引数を、生のカウントまたは関係するピクセル総数のパーセンテージとして受け取ることができます。ただし、いくつかの重要な違いがあります。1つの違いは、デフォルトの黒点と白点がどのように計算されるかに関係しています。「-contrast-stretch」の場合、黒点である1つの値のみが指定されている場合、白点も同じ値になります。したがって、「-contrast-stretch 1」は「-contrast-stretch 1x1」と同等であり、「-contrast-stretch 1%」は「-contrast-stretch 1x1%」と同等です。ただし、「-linear-stretch」の場合、黒点である1つの値のみが指定されている場合、白点は補完値になります。つまり、黒点が生のカウントとして指定されている場合、白点は画像の合計ピクセル数から黒点カウントを引いたものになります。同様に、黒点がパーセントカウントとして指定されている場合、白点は100%から黒点パーセントカウントを引いたものになります。したがって、「-linear-stretch 1%」は「-linear-stretch 1x99%」と同等になります。2番目の違いは、カウントがどこから始まるかに関係します。グレースケール0からグレースケール255に移行する256個のビン(一部の「ビン」にはゼロカウントがある場合があります)を持つヒストグラムを考えてみましょう。「-contrast-stretch」では、カウントはゼロから始まり、画像内で最も低い(最小)および最も高い(最大)入力されたビン(ヒストグラムのビン0またはビン255にある場合とない場合があります)。したがって、10%の黒点は、最小ビン以降のすべてのビンからカウントを累積し、10%に達すると、そのグレースケールから黒側をストレッチします。したがって、ヒストグラムの黒側で焼き付けられる量は、10%に加えて、それ以前に暗い「ビン」で見つかった量になります。同様に、ヒストグラムの明るい側からカウントする場合も同様です。「-linear-stretch」では、カウントはヒストグラムの端、つまりビン0とビン255から始まります。したがって、暗い側で焼き付けられる量は常に黒点の値になり、明るい側での焼き付けられる量は常に白点の値になります。例として、100ピクセルのグラデーションを取り上げ、そのヒストグラムを見てみましょう。

  magick -size 1x100 gradient: \
          -depth 8 -format "%c" histogram:info:
[IM Text]
予想どおり、すべてのビンに単一のピクセルが均等に入力されており、カウントは1になります。(完全なリストを表示するには、上の出力テキスト画像をクリックしてください)。次に、「-contrast-stretch 10x10%」を使用した後に同じことを行ってみましょう。

  magick -size 1x100 gradient:   -contrast-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:
[IM Text]
そして今「-linear-stretch 10x10%」。

  magick -size 1x100 gradient:   -linear-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:
[IM Text]
したがって、「-contrast-stretch 10x10%」の場合、各端に11ピクセルが得られることを確認します。つまり、端のビン内のカウントに、画像ピクセルの10%に相当する、10ピクセルを加えたものに相当します。したがって、10+1=11ピクセルが焼き付けられます。一方、「-linear-stretch」では、端のビンには10ピクセルまたは画像ピクセルの10%のみが含まれます。前述の違いの1つの結果は、「-contrast-stretch 0x0」は、入力された最も低いビンと最も高いビンが0と255の端のビンでない場合、画像を変化させる可能性があるということです。この場合、画像はこれらのビンに対応するグレースケール間でストレッチされます。一方、「-linear-stretch 0x0」は画像を変化させません。たとえば、グラデーションを取り、両端で10%ずつグレースケールを圧縮してみましょう。つまり、黒点を10%上昇させてグレースケール26にし、白点を10%下降させてグレースケール230にします。

  magick -size 1x100 gradient:   +level 10x90%  \
          -depth 8 -format "%c" histogram:info:
[IM Text]
次に、上記のコントラストを下げたグラデーションに「-contrast-stretch 0x0」を適用してみましょう。

  magick -size 1x100 gradient: -level 10x90%  -contrast-stretch 0x0  \
          -depth 8 -format "%c" histogram:info:
[IM Text]
そして今「-linear-stretch 0x0」。

  magick -size 1x100 gradient: -level 10x90%  -linear-stretch 10x10% \
          -depth 8 -format "%c" histogram:info:
[IM Text]
したがって、元の画像は0〜255の完全なダイナミックレンジにまたがらないヒストグラムを持っていたことがわかります。グレースケール26〜230の間のみでした。しかし、「-contrast-stretch 0x0」を適用した後、完全なダイナミックレンジにストレッチされました。一方、「-linear-stretch 0x0」は、結果のヒストグラムには変化を加えませんでした。3番目の違いは、「-contrast-stretch」はチャンネルに敏感ですが、「-linear-stretch」はそうではないということです。つまり、「-contrast-stretch」を使用すると、1つ以上のチャンネルが他のチャンネルに影響を与えることなく変更される可能性があります。したがって、チャンネルが指定されていない場合、すべてのチャンネルの全体的なヒストグラムが使用されて、すべてのチャンネルが同じように変更されるため、色のずれは発生しません。ただし、「-channel RGB」が指定されている場合、各チャンネルは個別にストレッチされ、結果は各チャンネルの端のビンによって異なります。それらが異なる場合、結果の画像内の個々のチャンネル間で色のずれが発生します。「-linear-stretch」では、すべてのチャンネルが共通の方法で処理されるため、チャンネル間の色のずれが発生することはありません。それでは、実際の画像の詳細な識別子とヒストグラムを取得しましょう。

  magick port.png  -verbose -identify +verbose  histogram:port_hist.gif
[IM Text] [IM Output]
[IM Output]
上記の画像のチャンネルのどれも完全なダイナミックレンジにまたがっていないことがわかります。また、各チャンネルが独自に異なる範囲の値をまたいでいることにも注意してください。次に、「-channel」設定なしで「-contrast-stretch 1x1%」を適用してみましょう。

  magick port.png -contrast-stretch 1x1% \
          -write histogram:port_cs1_hist.gif   port_cs1.png
[IM Output] [IM Output]
上記の結果では、画像はすべてのチャンネルで一貫してストレッチされています。したがって、チャンネル間に色のずれはありません。次に、「-channel RGB」を指定して同じことをしてみましょう。

  magick port.png  -channel RGB  -contrast-stretch 1x1% \
          -write histogram:port_cs1rgb_hist.gif    port_cs1rgb.png
[IM Output] [IM Output]
上記の結果では、デフォルトのチャンネル設定を使用するのではなく、「-channel RGB」を設定したため、画像はチャンネルごとに異なる方法でストレッチされます。これにより、チャンネル間に色のずれが発生します。次に、「-channel」設定なしで「-linear-stretch」を適用してみましょう。

  magick port.png   -linear-stretch 1x1% \
          -write histogram:port_ls1_hist.gif \
          port_ls1.png
[IM Output] [IM Output]
上記の結果では、画像はすべてのチャンネルで一貫してストレッチされています。したがって、チャンネル間に色のずれはありません。次に、「-channel RGB」を指定して同じことをしてみましょう。

  magick port.png  -channel RGB  -linear-stretch 1x1% \
          -write histogram:port_ls1rgb_hist.gif    port_ls1rgb.png
[IM Output] [IM Output]
-linear-stretch」を使用した上記の結果では、画像はすべてのチャンネルで一貫してストレッチされており、「-channel RGB」は無視されます。したがって、チャンネル間に色のずれはなく、結果は「-channel RGB」なしの場合と同じになります。 

ヒストグラムの再分布

ヒストグラムの再配分は、特定の形状を実現するためにヒストグラム内のビンを再配分する非線形手法です。最も一般的な2つの形状は均一(フラット)とガウス(ベル型)ですが、双曲線やレイリーなど、他のタイプの分布も使用されています。

イコライズ - 均一なヒストグラム再配分

均一な分布の場合、ヒストグラムビンは、平均してヒストグラムが全範囲にわたってフラットまたは一定の高さになるようにシフト、間隔、および結合されます。これはヒストグラムの均等化と呼ばれます。IM関数「-equalize」はこれを行います。残念ながら、これはすべてのチャンネルに同じ操作を適用するのではなく、各チャンネルを個別に操作します。そのため、RGB色空間に適用すると、色のずれが発生する可能性があります。次に、IM関数-equalizeを使用したヒストグラムの均等化の例を示します。各チャンネルで個別に均等化を行うと、カラーバランスがシフトすることに注意してください。

  magick zelda.png  -write histogram:zelda_hist.gif \
          -equalize  -write histogram:zelda_equal_hist.gif \
          zelda_equal.png
[IM Output] ==> [IM Output]
[IM Output] ==> [IM Output]
ヒストグラムがあまり均一に見えないかもしれません。しかし、結果として得られた画像をグレースケールに変換し、そのヒストグラムを表示すると、元の画像のグレースケールヒストグラムと比較して、少し均一に見えます。

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_equal.png  -colorspace gray \
          histogram:zelda_equal_ghist.gif
[IM Output] ==> [IM Output]
ビンの再分配にアプローチするもう1つの方法は、各チャネルの累積ヒストグラムと目的の積分分布曲線から生成された変換ルックアップテーブルを使用することです。チャネル間で色のずれを発生させたくない場合は、画像のすべてのチャネルからの結合ヒストグラムを使用します。近似としては、グレースケールに変換した後の画像のヒストグラムを使用するだけです。Fred Weinhausは、「redist」と呼ばれるスクリプトを開発しました。これはまさにそれを行います。画像の色チャネルすべてに同じ変更を適用しながら、画像のヒストグラムを均一な分布に再分配します。

  redist -s uniform zelda.png  zelda_uniform.png

  magick zelda_uniform.png   histogram:zelda_uniform_hist.gif
[IM Output] ==> [IM Output]
[IM Output] ==> [IM Output]
IM組み込みの「-equalize」演算子とは結果が異なることに注目してください。具体的には、以前見たような色のずれがなく、すべての色が保持されます。スクリプトが行うことは、グレースケールヒストグラムを処理し、それをすべてのカラーチャネルに適用して、すべての色が一緒に保たれるようにすることです。IM「-equalize」のヒストグラムとの比較のために、ここでもグレースケールヒストグラムの結果を示しましょう。再分配されたヒストグラムは、IMイコライズよりもわずかに平準化(平坦または均一)されているように見えることに注意してください。

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_uniform.png  -colorspace gray \
          histogram:zelda_uniform_ghist.gif
[IM Output] ==> [IM Output]
今後の課題:他の色空間での均等化の例を追加してください!つまり、HSL、HSB、およびCMYK色空間のグレースケールチャネル。

ガウス再分布

ヒストグラムを均等化することが、画像のヒストグラム分布を変更する唯一の方法ではありません。実際、コンピュータビジョンのアプリケーションを除いて、通常はあまり役に立ちません。これが同じ画像ですが、ヒストグラムがガウス(ベル型)分布になるように変換されています。ここで使用される値は、60%のグレー平均で、その平均の両側に60シグマロールオフがあります。

  redist -s gaussian 60,60,60  zelda.png \
         zelda_gaussian.png

  magick zelda_gaussian.png -colorspace gray \
          histogram:zelda_gaussian_ghist.gif
[IM Output] ==> [IM Output]
[IM Output] ==> [IM Output]
結果のグレースケールヒストグラムから、画像の色がガウスベルカーブ型の分布に従うように修正されていることがわかります。写真の場合、これにより、より「自然」に見える結果が得られます。画像はコントラストが最適化されるだけでなく、画像のほとんどのピクセルが約60%のグレースケール輝度になるように輝度も調整されます。

ヒストグラムの再分布方法

では、この種の直接的なヒストグラム調整はどのように機能するのでしょうか?基本的に、現在の画像のヒストグラムと目的の分布のヒストグラムを計算します。次に、ビン内のカウントが目的の分布に最適に従うように、各「ビン」のグレースケール値をどのように変更する必要があるかを計算します。一部のビンはより暗くシフトされる可能性があり、他のビンはより明るくシフトされる可能性があります。これは実際にはかなり複雑なプロセスであるため、ステップごとに説明しましょう。
まず、ヒストグラムのグラフィック画像ではなく、ImageMagickから実際のヒストグラムデータを取得する必要があります。データは、すべてのカラー値が組み合わされてグレースケールになっていることに注意してください。これは、すべてのチャネルをまとめて配布し、画像全体の明るさを目的の曲線に追従するように調整するために行われました。

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# collect the histogram data.
           { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   print bin[i]+0;
                 }
               } ' > zelda_hist_data.txt

  # get the maximum count for any one histogram 'bin'
  max_count=`sort -n zelda_hist_data.txt | tail -n 1`

  # magick histogram into a profile graph of the data
  echo "P2 256 1 $max_count" | cat - zelda_hist_data.txt |\
    im_profile -s - zelda_hist_graph.gif
[IM Output] ==> [IM Output]
データを収集するために、IMがこの目的のためだけに含めているヒストグラム画像の「コメント」メタデータを使用します。次に、データは(「translate」の略である「tr」と呼ばれるプログラムを使用して)クリーンアップされて、生の数値のみが残ります。この生データは、「awk」と呼ばれる別のユーティリティプログラムに渡されます。これは、各ビンの実際のヒストグラムカウントを収集するために使用されます。結果を確認できるように、ヒストグラムカウントを(NetPBM、PGMテキストグレースケール画像ファイル形式を介して)勾配画像に処理し、「im_profile」スクリプトを使用して線グラフとして表示します。基本的に、これは数値データファイルから直接、ヒストグラム画像を生成する別の方法にすぎません。ヒストグラムデータがテキストファイルになったので、再分配されたデータが一致する関数のヒストグラムも必要です。この場合、平均値が153(60%グレー)、シグマ幅が60のガウス分布です。両方の値は、ヒストグラムの「ビン」の256範囲で表されます。

  awk '# AWK to generate gaussian distribution graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  print int(65535*expo^(-(((i-mean)/256)^2)*fact));
                }
              }' /dev/null  > gaussian_hist_data.txt

   # magick gaussian data into a profile graph
   echo "P2 256 1 65535" | cat - gaussian_hist_data.txt |\
     im_profile -s -b - gaussian_hist_graph.gif
[IM Output]
上記のヒストグラムは興味深く、画像の元のヒストグラム分布とヒストグラムの目的の状態を反映しています。しかし、変換の目的のために、この形式のヒストグラムは、理解するには適していますが、私たちの目的にはあまり役に立ちません。実際には、本当に必要なのは累積ヒストグラムです。これらのヒストグラムは、通常のヒストグラムと非常によく似ていますが、ヒストグラムの各「ビン」は、0から始まる、その「ビン」とそれ以前のすべての「ビン」のカウントです。つまり、各「ビン」は、より暗いすべての「ビン」の「累積」またはカウントです。これらは、実際には元の画像から直接生成する方が簡単です。それでは、プロセスを繰り返しますが、「累積」カウントを計算して保存します。

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# Collect the cumulative histogram for an image
               { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   cum += bin[i];
                   print cum;
                 }
               } ' > zelda_cumhist_data.txt

  total_count=`tail -n 1 zelda_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - zelda_cumhist_data.txt |\
    im_profile -s - zelda_cumhist_graph.gif

  awk '# AWK to generate gaussian distribution cumulative graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  total += gas[i]
                }
                for ( i=0; i<256; i++ ) {
                  cum += gas[i];
                  print int(65535*cum/total);
                }
              }' /dev/null  > gaussian_cumhist_data.txt

  total_count=`tail -n 1 gaussian_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - gaussian_cumhist_data.txt |\
    im_profile -s -b - gaussian_cumhist_graph.gif
[IM Output]
画像累積
ヒストグラム
[IM Output]
ガウス累積
ヒストグラム
次に、画像累積ヒストグラムをガウス累積ヒストグラムに変換する必要があります。これを行うために、入力画像の各グレー値を使用して、その「正規化」累積値を見つけます。次に、これはガウス分布の同じ累積値にマッピングされ、対応するグレー値が見つけられます。この図は、マッピングプロセスをより明確にするはずです...
[diagram]
次のコマンドは、カラールックアップテーブル(CLUT)を生成するために、可能なすべての8ビットカラー値に対してルックアップを実行します。この特別な画像を使用して、元の画像の色値を、画像のヒストグラムを再分配するために必要な新しい値にマッピングできます。

  # Generate a CLUT to Redistribute the Histogram
  paste  zelda_cumhist_data.txt   gaussian_cumhist_data.txt |\
    awk '# AWK to generate gaussian distribution graph
              { bin[NR] = $1;   gas[NR] = $2;  }
          END { k=0;  # number of pixels less than this value
                print "P2 256 1 65535";
                for ( j=0; j<256; j++ ) {
                  while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                    k++;
                  }
                  print 65535*k/255;
                }
              }' |\
      magick pgm:- gaussian_clut.png

  magick zelda.png   gaussian_clut.png -clut   zelda_redist.png
[IM Output] ==> [IM Output]
[IM Output] ==> [IM Output]
ご覧のとおり、画像のヒストグラムを変換して、ガウスベルカーブなどの特定の分布関数に従わせようとすることは、非常に複雑で、数値的に高度なプロセスです。以下は、1つのかなり長く複雑なコマンドで表現されたものです...

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# AWK to generate gaussian distribution graph
            { # just read in image histogram into a 'bin' table
                  bin[$2] += $1;
                }
            END { # Generate Gaussian Histogram
                  mean = 153;   sigma = 60;
                  fact = 1/(2*(sigma/256)^2);
                  expo = exp(1);
                  for ( i=0; i<256; i++ ) {
                    gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  }
                  # Convert normal histograms to cumulative histograms
                  for ( i=0; i<256; i++ ) {
                    gas[i] += gas[i-1];
                    bin[i] += bin[i-1];
                  }
                 # Generate Redistributed Histogram
                 k=0;  # number of pixels less than this value
                 print "P2 256 1 65535";
                 for ( j=0; j<256; j++ ) {
                   while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                     k++;
                   }
                   print 65535*k/255;
                 }
                }' |\
        magick zelda.png   pgm:-  -clut   zelda_gaussian_redist.png
[IM Output] ==> [IM Output]
上記のテクニックについて、最後にいくつかの言葉を述べます。
  • awk」を使用して計算を行い、Fred Weinhausの「redist」スクリプトを高速化することは、Anthony Thyssenによって提案および提供されました。
  • 上記の再分配テクニックを適用して「均一」または「均等化」された分布を生成する場合、関数ヒストグラムは単に定数です。これにより、積分分布は単に式y = x、つまり単に斜めの直線になります。同じ変換テクニックを適用すると、入力画像の累積ヒストグラムと同一であることが判明したCLUTイメージが得られます。言い換えれば、ヒストグラムの均等化の場合、画像の累積ヒストグラムをCLUTにマジックし、それを画像に直接適用することができます。
  • 現時点でのImageMagickを含むほとんどの画像処理パッケージは、中間CLUTを生成するのではなく、変換式を画像自体の値に直接適用します。ただし、ヒストグラム、つまり累積ヒストグラムはサイズが限られている(通常は256「ビン」)ため、処理中に画像の色値が丸められる可能性があり、深刻なエラーにつながる可能性があります。ただし、ImageMagickを使用すると、(同じ丸め誤差を含む)中間CLUTを生成し、準備されたCLUTを使用して、丸められていない元の画像値を線形補間によってマジックします。この補間の結果、新しい画像の色値は、処理中に丸められたり、「ビン」化されたりしていないため、より正確になります。
上記は、最終的にはImageMagickに組み込まれることを願っています。それまでの間、このタスクを実行するためにFred Weinhausの「redist」スクリプトが利用可能です。また、このテクニックのようにグローバルではなく、画像の局所的な領域で同様の自動拡張を試みるFredの「retinex」スクリプトにも興味があるかもしれません。

DIYレベル調整

数学的な線形ヒストグラム調整

上記のレベル調整のさまざまな基本形式は、画像の色を線形に調整します。これらの変更は、数学的にも適用できます。たとえば、画像を特定の色で乗算することにより、すべての純粋な白色領域をその色に設定します。それでは、画像を読み込み、目的の色を含む画像を作成し、IMフリーフォーム「-fx」またはDIY演算子を使用して元の画像にこの色を乗算してみましょう。

  magick test.png  -size 1x1 xc:Yellow \
          -fx 'u*v.p{0,0}'    fx_linear_white.png
[IM Output] ==> [IM Output]
-fx」に2番目の「v」画像から色を読み取らせることで、数学で使用するために色をRGB値にマジックする必要なく、色を簡単に変更できます。「Gimp」や「Photoshop」のような高度なグラフィカル画像処理パッケージを使用している場合、上記の操作は画像のカラーヒストグラムグラフの「曲線」を調整することにより、画像に適用されるでしょう。 [IM 出力] たとえば、右側には、「gnuplot」で生成されたグラフ(「im_histogram」スクリプトを参照)があります。このグラフは、3つのRGBチャネルのうちの1つだけに何が起こるかを示す数式を表しています。元の色(緑の線)は、より暗い色(赤い線)に線形に再マッピングされます。黒色を線形に着色することも非常に簡単です。たとえば、「black」をゴールドのような色「rgb(204,153,51)」に(「white」を「white」のままにして)線形にマッピングするには、次のような数式が必要です...
          result = 1-(1-color)*(1-intensity)
この式は、色を反転し、画像を必要な反転色で乗算し、画像を再度反転します。その結果、グレースケールの黒い側が着色され、白は変更されません。

  magick test.png  -size 1x1 xc:'rgb(204,153,51)'  \
          -fx '1-(1-v.p{0,0})*(1-u)'   fx_linear_black.png
[IM Output] ==> [IM Output] ==> [IM Output]
再マッピング式の「gnuplot」ヒストグラムグラフも参考のために上記に表示されています。わずかに複雑な式を使用すると、グレースケールの「black」と「white」の両端を特定の色で線形に置き換えることができます。

  magick test.png  -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,0}*u+v.p{0,1}*(1-u)'   fx_linear_color.png
[IM Output] ==> [IM Output] ==> [IM Output]
上記の「-size 1x2 gradient:color1-color2」は、「-fx」式が参照する2色ピクセル画像を生成するためだけに使用されます。最初の色は白を置き換え、2番目の色は黒を置き換え、その他はすべて白と黒の間で補間されます。グレースケール演算子の典型的な例として、各RGBチャンネルは個別のグレースケールチャンネルとして扱われますが、線形補間は各チャンネルで異なります。これは、レベル調整(色別)演算子「+level-colors」とまったく同じです。
ただし、「+level-colors」とは異なり、使用する色は、引数として指定された色名だけでなく、任意の画像ソースから取得できます。ただし、色名を直接使用することも可能です。

  magick test.png   -fx "yellow*u+green*(1-u)"  fx_linear.png
[IM Output]

数学的な非線形ヒストグラム調整

線形色の調整は重要であり、より高速な方法も利用できますが、線形「レベル」調整が望ましくない状況も多く、「-fxDIY演算子がより役立ちます。線形調整の代替式は「-fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u'」です。これは、「u」を単一の乱数関数「f(u)」で置き換えて、非線形の色変化を生成できるという利点があります。これにより、より面白いことができます。たとえば、最後の例で、すべての色を「black」側にプッシュして、画像がより「firebrick」色になるようにしたい場合はどうでしょうか?

  magick test.png -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u^4'  fx_non-linear.png
[IM Output] ==> [IM Output] ==> [IM Output]
より実用的な例として、Adelmo Gomesは、開発中の自動化された天気図再着色スクリプトで色調整を必要としていました。この場合、画像の純粋な黒の部分を.25青色に着色し、画像の残りのグレースケール、特に白と中間トーンのグレーはそのままにしたいと考えていました。青色だけがこのような調整を必要としており、現在、彼は画像エディターで手動で行っていました。たとえば、「u^2」のような二次式を使用して、ヒストグラムの黒端を「.25」青色に着色できます。青色チャンネルのみを修正する必要があるため、値は式に直接挿入されました。

  magick test.png  -channel B  -fx '.25+(1-.25)*u^2'  fx_quadratic.png
[IM Output] ==> [IM Output] ==> [IM Output]
ただし、これにより妥当な結果が得られましたが、中間トーンのグレーがわずかに暗くなり、不健康な黄色の色になりました。これを回避するには、代わりに「指数」関数を使用して、着色プロセスをより適切に制御できます。

  magick test.png  -channel B  -fx '.3*exp(-u*4.9)+u'  fx_expotential.png
[IM Output] ==> [IM Output] ==> [IM Output]
ここでも、グラフは、黒を特徴的な濃い青色に着色するために青色チャンネルがどのように変更されたかを示しています。2番目の値(「4.9」)は、線形「+u」グラフに戻る減衰です。この値が小さいほど減衰は遅くなり、調整はより線形になります。値が大きいほど、「減衰」はより劇的になります。この値は異なる色値に合わせて調整する必要がある場合があるため、これは一般的な黒色の着色には適した一般的な式ではありませんが、天気図の着色には最適です。一般的に、目的の色調整を数学的に表現できる場合は、「-fx」演算子を使用して目的の結果を達成できます。

「カーブ」調整

[図] 通常、グラフィカルなフォトエディターでは、左に示したようなヒストグラムの「カーブ」チャートが表示されます。ユーザーは4つ(またはそれ以上)のコントロールポイントを移動して「カーブ」を編集でき、ヒストグラム調整関数はそれらのポイントに従います。コントロールポイントは一般に、最初のグレースケールレベルが調整後に2番目のグレースケールレベルになることを指定します。したがって、0.0、0.2のようなポイントは、基本的に、0%グレー(黒)は調整後、20%グレーレベルになる必要があることを意味します。IMでは、「カーブ」調整を生成するための「コントロールポイント」を直接指定することはできません。必要なのは、生成された「カーブ」の数式です。幸いなことに、コントロールポイントからそのカーブ式を生成できるプログラムがあり、「gnuplot」、「fudgit」、「mathematica」、「matlab」、およびその他多くの数学ソフトウェアパッケージが含まれます。以下は、「gnuplot」を使用して4つのコントロールポイントから数式を生成するために使用できる1つの方法です。「gnuplot」は、ほとんどのLinuxディストリビューション、およびWindowsにインストールできる標準の追加パッケージです。

  ( echo "0.0 0.2";  echo "1.0 0.9"; \
    echo "0.2 0.8";  echo "0.7 0.5"; )   > fx_control.txt

  ( echo 'f(x) = a*x**3 + b*x**2 + c*x + d'; \
    echo 'fit f(x) "fx_control.txt" via a, b, c, d'; \
    echo 'print a,"*u^3 + ",b,"*u^2 + ",c,"*u + ",d'; \
  ) | gnuplot 2>&1 | tail -1             > fx_funct.txt
[Data]
コントロールポイント
==> [Gnuplot]
[Gnuplot]
Gnuplotで適合させたFX関数
カーブフィッティングに必要なパラメーター(上記の「a」から「d」)の数は、指定するコントロールポイントの数と等しい必要があることに注意してください。したがって、5つのコントロールポイントが必要な場合は、関数に別の「e」項を含める必要があります。

ヒストグラムカーブが固定コントロールポイント0,0および1,1を通過する場合、「d」は「0」に等しく、「c」は「1-a-b」に等しくなるため、実際に必要なパラメーターは2つだけです。

上記の詳細な使用ガイド(特にWindowsユーザー向けですが、Linuxユーザーにも役立ちます)は、StackOverflow: IM Curves using Gnuplot on Windowsに投稿されています。上記の追加の「gnuplot」生成画像からわかるように、生成された関数はコントロールポイントに完全に適合しています。また、「-fx」スタイルの式を生成したため、IM引数としてそのまま使用できます。
例えば...

  magick test.png    -fx "`cat fx_funct.txt`"     fx_funct_curve.png
[IM Output]
ユーザーがコントロールポイントをヒストグラム調整関数に変換しやすくするために、「gnuplot」を呼び出し、指定されたコントロールポイントのより見栄えの良い多項式方程式を出力する「im_fx_curves」という名前のシェルスクリプトを作成しました。Gabe Schafferは、同じことを行うために(ダウンロードされた「Math::Polynomial」ライブラリモジュールを使用して)「im_fx_curves.pl」という名前のPerlバージョンも提供しました。どちらのスクリプトも使用できます。たとえば、これは5つのコントロールポイントを持つ別のカーブです...

    im_fx_curves  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > fx_curve.txt
[Gnuplot] ==>
[Gnuplot]
ただし、FX関数は非常に遅いです。しかし、IM 6.4.8-9以降では、適合された多項式式の発見された係数を直接多項式関数メソッドに渡せるようになりました。「im_fx_curves」を特別な「-c」オプションで使用して、係数のコンマ区切りリストを生成できます...

    im_fx_curves -c  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > coefficients.txt
[Gnuplot] ==>
[Gnuplot]
たとえば、これらのカーブをテスト画像に適用してみましょう...

  magick test.png  -function Polynomial `cat coefficients.txt`  test_curves.png
[IM Output]
この方法のより実用的な例は、高度な"アクア"エフェクトの例で詳しく説明されています。「カーブ」を生成する別の方法は、IMフォーラムのディスカッション任意のトーン再現カーブで検討されています。

画像の着色

画像の均一な色着色

通常、画像の着色は、画像に特定の量で色をブレンドすることによって実現されます。これは、評価演算子または画像のブレンドテクニックを使用して行うことができますが、これらは簡単ではありません。幸いなことに、「-colorize」画像演算子を使用することにより、均一な色を画像にブレンドする簡単な方法が利用可能です。この演算子は、現在の「-fill」色を、現在の画像シーケンスのすべての画像にブレンドします。元の画像のアルファチャンネルは保持され、色のチャンネルのみが変更されます。たとえば、画像(グレースケールまたはそれ以外)を明るくするには、「-colorize」を使用して、ある程度の白を画像にブレンドし、画像を完全に飽和させることなく明るくします。

  magick test.png  -fill white -colorize 50%  colorize_lighten.png
[IM Output] ==> [IM Output]
同様に、「black」塗りつぶし色を使用して画像を暗くすることができます。

  magick test.png  -fill black -colorize 50%  colorize_darken.png
[IM Output] ==> [IM Output]
画像の両端を中間トーンに向かってグレーにするには、特定の中間のグレーの塗りつぶし色を使用します。色「gray50」は、RGBカラースペクトルの正確な中間色です。

  magick test.png  -fill gray50 -colorize 40%  colorize_grayer.png
[IM Output] ==> [IM Output]
これは、反転レベル調整演算子が提供するもののように、「コントラストの低下」の方法としてもよく使用されますが、制御性は劣ります。「-colorize」演算子では、3つのカラーチャンネルごとに個別にディゾルブパーセントを指定することもできます。これは、特別な方法で画像を線形に暗くする(または明るくする)のに役立ちます。
IM v6.7.9より前では、「-colorize」演算子はアルファチャンネルをまったく変更しませんでした。上記の例のように、このバージョン以降は、完全に透明なピクセルを含め、すべてのピクセルを均一に着色するようになりました。
-colorize」演算子の一般的な用途の1つは、既存の画像内のすべての色を単純に置き換える(「100%」着色)ことですが、透明度(アルファ)画像の形状を保持し、色の付いたマスクを生成することです。ただし、IM v6.7.9以降では、アルファチャンネルを無効にしてから再度有効にすることで、この演算子からアルファチャンネルを保護する必要があります。(詳細については、アルファを有効にするを参照してください)。例えば...

  magick test.png -alpha off \
          -fill blue -colorize 100% \
          -alpha on  colorize_shape.png
[IM Output]
この保護がないと、colorizeはキャンバスを完全に指定された色に塗りつぶしてしまいます...

  magick test.png -fill blue -colorize 100% colorize_blank.png
[IM Output]
ただし、IM v6.7.9より古いバージョンのIMを使用する可能性がある場合は、上記に「-alpha opaque」または「-alpha off」操作を含めて、結果の画像が期待どおりの完全に空白の画像になるようにすることをお勧めします。単一の色ではなく色の範囲でレベル調整(色別)演算子を使用すると、キャンバスをより高速に空白にできることに注意してください。空白のキャンバスも参照してください。

中間色のカラーティント

Colorize演算子」は、画像のすべての色に対して「-fill」の色を線形に適用して色合いを付けるのに対し、「-tint」演算子は、「-fill」の色を、画像の中間色の部分のみに色合いを付けるように適用します。この演算子はグレースケール演算子であり、色は指定されたパーセンテージ(0〜200)によって調整または強調されます。効果を制限するために、数学的な公式を使用して調整され、黒と白には影響を与えず、各カラーチャネルの中間色に最大の効果を与えるようにします。「-tint 100」は、基本的に完全なグレーの色を、塗りつぶし色の半分の強度になるように色合いを付けます。値が低いほど暗い色に色合いが付き、値が高いほどその色に完全に一致する方向に色合いが付きます。

  magick test.png  -fill red  -tint 40 tint_red.png
[IM Output] ==> [IM Output]
テスト画像の緑色は、真のRGB緑ではなく、縮尺ベクターグラフィックスの「green」であり、真の緑色の半分の明るさしかありません。そのため、中間色でもあり、「-tint」演算子の影響を受けて暗くなります。テスト画像の赤と青の色のスポットとは異なります。また、コンマ区切りのパーセンテージリストを使用して、個々のカラーコンポーネントに色合いを付けることもできます。たとえば、「-tint 30,40,20,10」です。ただし、これは使用が難しい場合があり、適切に設定するには実験が必要になる場合があります。完全な50%のグレーに使用したい色を指定する方が良いでしょう。
[IM Output]-tint」演算子は、与えられた色とパーセンテージを取得し、次の公式に従って画像の個々の色を「-fill」色の強度に応じて調整します。(右のグラフを参照)

f(x)=(1-(4.0*((x-0.5)*(x-0.5))))
二次関数で、その結果は、画像内の既存の色のベクトルとして使用されます。ご覧のとおり、純粋な中間グレーの色に対しては色が完全に置き換えられ、白または黒のどちらにも調整は行われません。

または、このような処理をDIYで実行するために使用できる下位レベルの演算子については、「FX演算子」と「EvaluateおよびFunction演算子」を参照してください。

色合い付け演算子は、「-shade」の出力結果を調整するのに最適です(「陰影オーバーレイハイライト画像」を参照)。例については「3Dブレット画像」を参照してください。「-tint」を使用して、画像の中間色を明るくしたり暗くしたりすることもできます。これは、画像の「ガンマ調整」のようなものですが、正確にはそうではありません。たとえば、「white」色で100より大きい色合いの値を使用すると、中間色が明るくなります。

  magick test.png  -fill white  -tint 130 tint_lighter.png
[IM Output] ==> [IM Output]
100未満の値は色を暗くします。

  magick test.png  -fill white  -tint 70 tint_darker.png
[IM Output] ==> [IM Output]
現時点では、純粋な中間トーンのグレーの色は「-fill」の色にマッピングされません。

パーセント引数は「ブレンドパーセント」ではなく、実際には「明るさパーセント」のようなものです。たとえば、「黒」の塗りつぶし色ではまったく機能しません。

なぜこのように設計されたのか、その背景についてはわかりません。ただし、グレースケール画像に色合いを付ける際に、最終的な色を正確に制御することは非常に厄介です。

以下の「オーバーレイ合成による色合い付け」を使用すると、中間グレーの色をより正確に(放物線状ではなく、非常に線形に)色合い付けできます。

セピア色

特別な写真の再着色テクニックである「-sepia-tone」は、基本的には画像をグレースケールに変換し、すべての中間色を特別な茶色に着色することで構成されます。

  magick rose:  -sepia-tone 65%     sepia-tone.jpg
[IM Output]
指定された引数は、セピアトーンの色に最も近くなるグレースケールの「中間点」であり、これは「Goldenrod」の色に似ています。この最も一般的な用途は、「デュオトーン効果」を生成し、「古く見える」写真を生成することです(「セピアトーン」に関するウィキペディアを参照)。たとえば、ここでは、コントラストが強調されたグレースケールのバラの画像を、さまざまな色を使用して色合いを付け、同様のセピアトーンのような効果を実現します。使用する色は、探している正確な効果によって異なります。

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      goldenrod  gold  khaki  wheat
  do
    magick rose_grey.jpg  -fill $color   -tint 100    sepia_$color.jpg
  done
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
セピアトーンの画像を元の画像と混合またはブレンドして、その効果を軽減することで、より「色あせた」効果が得られることもあります。

  magick rose: \( +clone -sepia-tone 60% \) -evaluate-sequence mean  sepia-tone_blended.jpg
[IM Output]
上記の最後の例のような、より複雑な色の変更バリエーションを保存する方法については、Haldカラールックアップテーブルも参照してください。

デュオトーン効果

「デュオトーン」は、限られた予算または印刷装置でより良い結果を出すために、画像(黒インク)のグレースケールを他の色と混ぜる印刷方法です。たとえば、今日見られる古い写真がすべてセピアトーンに見えるのは、セピアトーンインクが生き残り、劣化したり、時間とともに色あせたりしなかったためです。他の「白黒」画像形式は、役に立たなくなりました。「セピアトーン演算子」を参照してください。また、「シアンタイプ」(一般に「青写真」として知られています)として知られる別のデュオトーン技術は、元の白黒の建築図面の大型コピーを作成する方法として広く使用されるようになりました。この技術は、レーザーと写真コピー(およびゼロックス)の発明よりずっと前に使用されていたことを覚えておいてください。詳細については、ウィキペディアの「デュオトーン」のエントリと「偽のデュオトーン対実際のデュオトーン」を参照してください。上記の色合い演算子は、上記のようなセピアトーンのような効果と同様に、デュオトーン効果の妥当なファクシミリを生成します。

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      blue  darkcyan  goldenrod  firebrick
  do
    magick rose_grey.jpg   -fill $color   -tint 100    duotone_$color.jpg
  done
[IM Output] ==> [IM Output] [IM Output] [IM Output] [IM Output]
一般的に、「デュオトーン」の色を暗くしたバージョンを選択しましたが、「色合い演算子」の引数を使用してこれを調整することもできます。明るさとコントラストは、「シグモイドコントラスト演算子」の引数を使用して調整することもできます。3色(黒点、中間点、白点の色)からデュオトーンを生成する別のより正確な方法は、「カラールックアップテーブル」(以下を参照)を使用することです。これは、デュオトーンに色「Black」、「Chocolate」、および「LemonChiffon」を使用して、非常に珍しいデュオトーンを作成する簡単な例です。そして、黒点の色は通常黒のままです。これが、通常デュオトーンと呼ばれる理由です。

  magick -size 1x1 xc:Black xc:Chocolate xc:LemonChiffon \
                                   +append     duotone_clut.gif
  magick -size 20x256 gradient: -rotate 90   duotone_clut.gif \
          -interpolate Bicubic -clut       duotone_gradient.gif
  magick rose_grey.jpg   duotone_clut.gif \
          -interpolate Bicubic -clut       rose_duotone.jpg
[IM Output] ==> [IM Output]
[IM Output] ==> [IM Output] ==> [IM Output]
上記は、(色合いとは異なり)中間点の色を正確に制御できるという利点があります。また、上記の例のように、3つの色を直接使用したり、3つ(またはそれ以上)の制御点の間で色をより細かく制御するために色の拡張グラデーションを使用したりすることもできます。このテクニックは、特定のデュオトーン効果を保存するための非常にコンパクトな方法も提供し、繰り返しおよび将来の使用に対応します。グレースケール画像に色を付けるだけでなく、色の変更を保存するより複雑な方法については、「Haldカラールックアップテーブル」も参照してください。

カラーティント、DIY

-tint」の最大の問題の1つは、グレースケール(またはベクトル)演算子であることです。つまり、赤、緑、青の各チャネルを互いに完全に別々に処理します。つまり、すべてのグレースケールレベルに影響があるにもかかわらず、「-tint」によって「blue」や「yellow」のような原色と二次色は影響を受けません。ただし、「FX演算子」や高速な「EvaluateおよびFunction演算子」などのさまざまなチャネル数学変換のおかげで、独自のカラーオーバーレイを生成して画像を修正できます。つまり、「Colorize演算子」が行うのと同様の方法で画像を色合いを付けることができます。たとえば、ここでは、画像グレースケールの明るさレベルを、特定の目的の色の半透明オーバーレイにマジックします。

  magick test.png  \( +clone -colorspace gray \
               -function polynomial -4,4,0 -background Gold -alpha shape \) \
          -composite   tint_diy_compose.png
[IM Output]
警告、これは画像の透明度を正しく維持しませんが、完全に不透明な画像では問題なく機能します。色合いとは異なり、「black」を含む任意の色を使用できることに注意してください。色はベクトル加算としてではなく、アルファ合成として扱われるためです。結果は、通常の色合いで得られるものとまったく同じではありません。

カラーティントオーバーレイ

特殊なアルファ合成メソッドである「オーバーレイ」および「ハードライト」は、実際には色(およびパターン)の色合い付けを念頭に置いて設計されました。これらの合成メソッドは、中間トーンのグレーを置き換え、画像内の黒と白のハイライトのみを残します。
たとえば、ここでは、着色されたオーバーレイ画像をすばやく生成し、それを合成して元の画像に色合いを付けます。

  magick test.png \( +clone -alpha off -fill gold -colorize 100% \) \
          -compose overlay -composite  tint_overlay.png
[IM Output]
ご覧のとおり、アルファ合成は元の画像の透明度を保持しないため、この問題を修正するために2回目のアルファ合成操作を使用する必要があります。

  magick test.png \
          \( +clone -alpha off -fill gold -colorize 100% \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_fixed.png
[IM Output]
オーバーレイ」の使用は、上記で使用されている二次関数よりもはるかに線形な色合い付けの形式であり、「-tint」と同様に、画像の各チャネルに個別に適用されるため、原色と二次色も変更されません。また、このアルファ合成メソッドでは調整制御が提供されないため、色合いのレベルを制御する場合は、色合いを適用する前にオーバーレイ画像の透明度を調整する必要があります。もちろん、これまで示してきた他の色合い付け方法とは異なり、単色に色合いを付けることに限定されず、画像やタイルのパターンを使用して色合いを適用できます。

  magick test.png \
          \( -size 150x100 tile:tile_disks.jpg \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_pattern.png
[IM Output]
ただし、これは基本的な色の処理の範囲外になるため、画像の色合い付けはこのくらいにしておきます。
アルファ合成メソッド「ハードライト」は、「オーバーレイ」と同じ結果を生成しますが、ソース画像とターゲット画像が入れ替わります。

これは、最後のいくつかの例の「+swap」の代わりに使用できた可能性があります。

グローバルカラーモディファイア

輝度、彩度、色相の変更

-modulate」演算子は、特殊なHSL(色相-彩度-明度)色空間で画像を修正するという点で特別です。画像内の各色のピクセルをこの色空間に変換して修正し、元の色空間に戻します。3つの値(後続の値はオプション)をパーセンテージとして受け取り、100の場合は画像に変化を与えません。例:

  magick rose: -modulate 100,100,100  mod_noop.gif
[IM Output]
最初の値であるbrightnessは、画像の全体的な明るさの乗数です。

  magick rose:  -modulate 0     mod_bright_0.gif
  magick rose:  -modulate 50    mod_bright_50.gif
  magick rose:  -modulate 80    mod_bright_80.gif
  magick rose:  -modulate 100   mod_bright_100.gif
  magick rose:  -modulate 150   mod_bright_150.gif
  magick rose:  -modulate 200   mod_bright_200.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
0」の明るさ引数では純粋な黒い画像が生成されますが、この演算子だけでは純粋な白い画像を生成することはできないことに注意してください。2番目の値saturationは、画像に存在する色の全体的な量を調整する乗数でもあります。

  magick rose:  -modulate 100,0     mod_sat_0.gif
  magick rose:  -modulate 100,20    mod_sat_20.gif
  magick rose:  -modulate 100,70    mod_sat_70.gif
  magick rose:  -modulate 100,100   mod_sat_100.gif
  magick rose:  -modulate 100,150   mod_sat_150.gif
  magick rose:  -modulate 100,200   mod_sat_200.gif
[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]
'0' の彩度を指定すると、上記の「色をグレースケールに変換」で示したように、グレースケール画像が生成されます。ただし、グレーはHSLカラースペースで定義されているように、3つのカラーチャネルを均等に混合するため、真の「輝度」グレースケールを生成しません。基本的に、小さな値はより「パステル」な色を生成し、「100」よりも大きい値は、より漫画のようなカラフルな画像を生成します。明るさ彩度はパーセント乗数であるため、ほぼすべての画像カラー値を最大値付近に変更するには、非常に大きな数を掛ける必要があることに注意してください。つまり、純粋な黒を除くすべての色を白にするには、100万に近い明るさ係数を使用する必要があります。

色相モジュレーション

最後の値、色相は実際にははるかに便利です。これは、画像のカラーを循環的に回転させます。これを実現するために、指定された色相値は、乗算ではなく「モジュラス加算」を生成します。ただし、色相は角度ではなく、パーセントを使用して回転することに注意してください。これは奇妙に思えるかもしれませんが、「-modulate」は常にそのように機能していました。角度とモジュレート引数の間の変換式は次のとおりです...
色相角度 = ( モジュレート引数 - 100 ) * 180/100
モジュレート引数 = ( 色相角度 * 100/180 ) + 100
つまり、「100」(3つの引数すべてに対して)は変更を加えません。一方、「0」または「200」の値は、画像のカラーを(輝度ではなく)事実上反転させます。例えば...

  magick rose:  -modulate 100,100,0      mod_hue_0.gif
  magick rose:  -modulate 100,100,33.3   mod_hue_33.gif
  magick rose:  -modulate 100,100,66.6   mod_hue_66.gif
  magick rose:  -modulate 100,100,100    mod_hue_100.gif
  magick rose:  -modulate 100,100,133.3  mod_hue_133.gif
  magick rose:  -modulate 100,100,166.6  mod_hue_166.gif
  magick rose:  -modulate 100,100,200    mod_hue_200.gif
[IM Output]
0
(赤 <-> シアン)
[IM Output]
33.3
(赤 -> 青)
[IM Output]
66.6
[IM Output]
100%
無操作
[IM Output]
133.3
[IM Output]
166.6
(赤 -> 緑)
[IM Output]
200
(0と同じ)
ご覧のとおり、「33.3」の値は、すべてのカラーを約60度、負または反時計回りに回転させ、赤を青に、青を緑に、緑を赤に効果的にマッピングします。「0」または「200」の値を使用すると、画像の輝度を否定することなく、カラーの完全な180度の反転が生成されます。色相は循環的であるため、「300」の値を使用すると、360度のカラー回転が生成され、画像に変更は加えられないことに注意してください。「色相モジュレーション」を使用して画像のカラーを変更する例については、「クロマキーマスク」および「マップ内のピン」を参照してください。
これらの種類の操作は、高度なカラースペース技術(リカラーマトリックス演算子(下記)での使用など)を使用して適用することもできますが、画像の基本的な「モジュレーション」には、この演算子が大幅に簡略化されます。原色のスワップには、リカラーマトリックス演算子、またはチャネルスワップ(「分離/結合演算子」を参照)のどちらかが、おそらくより正確な手法です。ただし、汎用性ははるかに低くなります。特に色相の変化について、後で再利用するためにカラー変更のバリエーションを保存する方法については、「ハルドカラー参照テーブル」も参照してください。

DIY による変更

本当に「自分でやる」こともできます。基本的には、画像を適切なカラースペースにマジック変換し、値を変更して、マジック変換を元に戻します。HSL カラースペースでは、緑のチャネルが彩度値を保持し、青のチャネルが輝度値を保持していることを覚えておいてください。たとえば、「-modulate 80,120」(少し暗くし、彩度を上げる)に相当する、デフォルトのHSLカラースペースを使用した例を次に示します...

  magick rose: -colorspace HSL \
          -channel B -evaluate multiply 0.80 \
          -channel G -evaluate multiply 1.20 \
          +channel -colorspace sRGB   modulate_channel.png
[IM Output] ==> [IM Output]
もちろん、この方法で色相(赤チャネル)を変更する場合は、最終値が最大値または最小値で単純にクリッピングされるのではなく、値を「ラップ」(モジュラス)するようにする必要があります(どちらも「赤」の色相です)。したがって、色相の変更にはモジュレート演算子を直接使用する方がおそらく簡単です。

他のカラースペースでの変更

-modulate」の最大の問題は、多くの「ほぼ白」の色を含む画像を処理する場合です。これは、HSLカラースペースで機能するため、オフホワイトの色は、明るさが低下するにつれてより「飽和」になります。上記バラの画像の白い葉でこれを確認できます。50%暗くすると、多くのカラーアーティファクトが表示されます。これは、JPEG画像形式を扱う場合に特に問題になります。JPEG画像形式は、非可逆圧縮アルゴリズムが原因で、オフホワイトの色(実際にはすべての色がJPEGでわずかにオフになっています)を生成する傾向があるためです。例えば...

  magick wedding_party_sm.jpg  -modulate 85  modulate_off-white.png
[IM Output] ==> [IM Output]
ここでの問題は、HSLではすべてのオフホワイトの色が、使用されているカラースペースの小さな「ホワイトポイント」領域(二重円錐)にパックされていることです。明るさが低下すると、色の円錐が拡大するにつれて、オフホワイトの色が拡張され、オフホワイトの色がよりカラフルな(彩度の高い)オフホワイト色のセットを生成します。つまり、色の小さな変化が誇張されます。この解決策は、HSLカラースペースの代わりに、HSBカラースペースで「-modulate」を使用することです。
HSBの「B」は輝度を意味しますが、「V」は値を意味するHSVとしても一般的に知られています。これらは同じカラースペースですが、値は通常「格納された数値」を意味するため、「V」は紛らわしい用語です。

HSIカラースペース(輝度の「I」を使用)もありますが、一般的ではなく、HCL(「L」は輝度を意味します)サイクリックカラースペース(下記参照)が追加されたため、必要ありません。

HSBカラースペースでは、「白」は単一の点ではなく、大きな「ディスク」であり、オフホワイトは互いに「近い」わけではありません。そのため、明るさを下げると、オフホワイトは均等に収縮し、わずかな色の変化を拡大するのではなく、減少させます。そのため、白はよりカラフルになるのではなく、単にグレーになります。HSB カラースペースで画像をモジュレートするには、そのカラースペースでDIY手法(上記参照)を使用できます。または、IM v6.5.3-7以降では、「modulate:colorspace」の操作制御を定義できます。これは、「色相」カラースペースの1つです。

  magick wedding_party_sm.jpg \
          -define modulate:colorspace=HSB -modulate 85 \
          modulate_HSB.png
[IM Output]
その他の「色相」カラースペースは、HWBとHCL(次のセクションを参照)です。もちろん、画像をこの小さなサイズにリサイズした場合、さらに優れた解決策は、オフホワイトの値の原因となったJPEGに画像を保存しないことです。さらに、完了するまで画像を保存しない方がよいでしょう。これにより、すべてのカラー値を最高のインメモリ品質設定に保つことができます。HSBカラースペースがモジュレートのデフォルトで使用されない理由は、このカラースペースで画像を明るくすると、色がより彩度が高くなり、より大胆になるのに対し、画像がより鮮やかで白っぽくなることはないためです。比較のために、デフォルトのHSLと、指定されたHSBカラースペースで、「バラ」の画像を150%明るくした例を次に示します。

  magick rose:         -modulate 150        mod_bright_HSL.gif
  magick rose: -define modulate:colorspace=HSB \
                         -modulate 150        mod_bright_HSB.gif
[IM Output]
HSL
[IM Output]
HSB
IM v6.4.0-10より前の「-modulate」演算子は、実際にはHSLカラースペースではなく、HSBカラースペースを使用していました。これは、上記のような状況に関するユーザーからのバグレポートのために変更されました。

ポイントは、一部の画像ではHSLを使用すると困り、他の画像ではHSBカラースペースを使用すると困るということです。これは、何をしようとしているかによって異なります。

LCHabおよびその他のカラースペースでのモジュレート

色相モジュレーション(HSLまたはHSBカラースペース)は、実際にはかなり粗雑と見なされています。これらのカラースペースは、より現実的な色の強度を考慮に入れていません。したがって、「青」と「黄」の色相を回転させると、明るさも大きくシフトします。「Wikipedia:HSLカラースペースの欠点」を参照してください。1つの代替案は、「Grafica Obscura」の「マトリックス操作」論文で説明されているように、輝度を維持した回転を行うことです。これは、カラー変更が操作の一部として実行されており、必要な回転量に応じて異なる単一の計算されたマトリックス操作として実行されているため、複雑です。IM v6.8.4-7以降では、モジュレート演算子は、特別なカラースペース「LCHab」および「LCHuv」も処理できるようになりました。これらは、それぞれの「Luv」および「Lab」カラースペースの円筒形(色相-彩度)です。詳細については、「Wikipedia:円筒LUVまたはLCHuvカラースペース」および「HCLカラースペース」を参照してください。
LCHab」および「LCHuv」カラースペースの同等のチャネルは、「HCL」および「HCB」カラースペースのチャネルとは逆です。つまり、「グレースケール」強度相当は、画像の最初の(「赤」)チャネルにあり、色相は3番目の(「青」)チャネルにあります。
たとえば、「LCHab」カラースペースを使用して、赤いバラの色相を回転させてみます。上記の「HSL」カラースペースの以前のセットと比較してください。

  for i in   0 25 50 75 100 125 150 175;  do
    magick rose: -define modulate:colorspace=LCHab \
                            -modulate 100,100,$i     mod_lch_$i.gif
  done
[IM Output]
0% & 200%
[IM Output]
25%
(赤->青)
[IM Output]
50%
[IM Output]
75%
[IM Output]
100%
無操作
[IM Output]
125%
[IM Output]
150%
[IM Output]
175%
色相は、より伝統的な色相カラースペースとは異なる方法で分散されていることに注意してください。しかし、さらに重要なのは、元の画像の強度が保持されていることです。このため、これらのいずれも同じ強度を持たないため、純粋な原色/二次色から別の純粋な原色/二次色に循環することはありません。ただし、色相全体の色の進行はよりスムーズになり、原色と二次色で「ピーク」が少なくなります。これは、「LCHab」と通常の「HSL」カラースペース(適切な回転パーセントを使用)での赤から青への単純な色相回転の比較です。
[IM Output]
オリジナル
[IM Output]
LCHab
25%
[IM Output]
HSL/HSB
33.3%
青はそれほど暗くなく、元の画像の陰影によく一致する陰影であることに注意してください。HCLカラースペースの色相の詳細については、「LCHカラーホイール」の例を参照してください。
IM v6.8.4-7より前は、カラースペース「HCL」(IM v6.7.9-1で導入)を使用していたでしょう。このカラースペースは「LCHuv」とまったく同じですが、チャネルの順序が逆になっています(画像で赤チャネルに保存されている色相は、そのカラースペースが定義された方法にすぎません)。つまり、モジュレート演算子が正しく機能するには、さまざまなチャネルを入れ替える必要がありました。

LCHab」および「LCHuv」カラースペースは、「HSL」と同じ方法でチャネルを順序付けて、モジュレートがチャネルの再配置を必要とせずに、カラースペースで正しく、直接機能できるようにします。

非常に暗い色の場合、「LCHuv」は不連続なカラー値を生成する可能性があることに注意してください。ただし、これは実際の画像ではなく、円筒形空間で直接生成された画像でのみ発生するはずです。

カラーマトリックス演算子

-color-matrix」演算子は、マトリックス手法を使用して画像をリカラーします。つまり、画像に新しいカラー値を生成するために、画像のさまざまなカラーチャネル値を線形に混合する方法を表す値のマトリックスを指定します。一般的な使用法は、3つの関数(行)または3つの乗数(列)を形成する9つの値を演算子に提供することです。したがって、最初の3つの数値は、赤チャネルのカラー式です。次は「緑」の式などです。例えば...

  magick rose: -color-matrix ' 1 0 0
                                0 1 0
                                0 0 1 '   matrix_noop.png
[IM Output]
次の式を適用するのと同じです...
赤' = 1 * 赤 + 0 * 緑 + 0 * 青
緑' = 0 * 赤 + 1 * 緑 + 0 * 青
青' = 0 * 赤 + 0 * 緑 + 1 * 青
この特定のケースでは、画像に変更は加えられません。マトリックスは、「単位行列」として知られる特別な配列を形成します。行を混在させることで、これを使用してさまざまなチャネルを入れ替えることができます。たとえば、ここでは赤と青のチャネル値を入れ替えます。

  magick rose: -color-matrix ' 0 0 1
                                0 1 0
                                1 0 0 '  matrix_red_blue_swap.png
[IM Output]
または、赤チャネルを他の2つのチャネルにコピーして、「赤チャネル」を抽出または分離します(「チャネル画像の分離」も参照)...

  magick rose: -color-matrix ' 1 0 0
                                1 0 0
                                1 0 0 '  matrix_red_channel.png
[IM Output]
または、2/5/3のグレースケール比を使用して画像をグレースケール画像に変換します(「カラーからグレースケールへの変換」を参照)。

  magick rose: -color-matrix ' .2 .5 .3
                                .2 .5 .3
                                .2 .5 .3 '  matrix_grayscale.png
[IM Output]

最大6行6列の行列を使用できます。これらは、チャネルの「Red」、「Green」、「Blue」、「Black」(設定されている場合)、「Alpha」(設定されている場合)、および定数に対応します。「Black」と「Alpha」のチャネルは、たとえ値自体が存在しないか使用されない場合でも、行列がその大きさである場合は、やはり提供する必要があります。最後の定数列は、式への単純な加算(負の場合は減算)です。6行目(指定されている場合)は単に無視され、使用されません。デフォルトでは、「matrix」定義はユーザー定義のモルフォロジー/畳み込みカーネルと同じ構造に従い、サイズジオメトリが指定されていない場合は「正方形」カーネルとして扱われます。カーネルのオフセットは現在使用されていません。与えられた「値の配列」は、画像に適用される前に、より大きな「6x6の単位行列」(1の対角線)に重ねられます。この内部処理により、実際には、すべての行ではなく、少数の行の数値だけでmatrix値を単純化できます。これは、カラー計算に「定数」を含める必要がある場合、または1つのチャネルのみを変更したい場合に特に役立ちます。たとえば、画像を反転(ネゲート)します。

  magick rose: -color-matrix '6x3: -1  0  0 0 0 1
                                     0 -1  0 0 0 1
                                     0  0 -1 0 0 1'  matrix_negate.png
[IM Output]
(「定数」を使用して)すべての赤チャネルの値を最大に設定します...

  magick rose: -color-matrix '6x1: 0,0,0,0,0,1'  matrix_red_max.png
[IM Output]
単位行列への重ね合わせのため、他のチャネル値は影響を受けませんが、内部的には再計算されます。
IM v6.6.1-0より前では、「-color-matrix」は「-recolor」という名前でした。

カラー行列の例

セピア色、または少なくともその操作の線形形式

  magick rose: -color-matrix ' 0.393 0.769 0.189
                                0.349 0.686 0.168
                                0.272 0.534 0.131  ' matrix_sepia.png
[IM Output]
鮮やかな色Digital Velviaと呼ばれる手法で...

  magick rose: -color-matrix '  1.2 -0.1 -0.1
                                -0.1  1.2 -0.1
                                -0.1 -0.1  1.2 ' matrix_vivid.png
[IM Output]
この行列は、各カラーチャネルを明るくしながら、他のチャネルから色を減算し、RGB画像の色をより鮮やかにします。これは、画像の彩度を20%増加させるためにModulateを使用するのとは少し異なりますが、それに似ています。ポラロイドカラー...

  magick rose: -color-matrix \
            '6x3:  1.438 -0.122 -0.016  0 0 -0.03
                  -0.062  1.378 -0.016  0 0  0.05
                  -0.062 -0.122 1.483   0 0 -0.02 ' matrix_polaroid.png
[IM Output]
今後:カラー行列を使用した色相回転...
Grafica ObscuraのWebページで説明されているように。
カラー行列の使用に関する詳細については、以下を参照してください...ただし、これらの実装のほとんどは、列が式を形成し、行ではなく転置形式の行列を使用していることに注意してください。または、より少ないチャネル(行/列の数が少ない)を含みます。

ソラライズカラー

画像を「-solarize」するということは、基本的には最も明るい色を黒く「焼き付ける」ことです。色が明るいほど、ソーラー化した色は暗くなります。これは、化学フィルムが過度に露出した場合に写真で発生します。

  magick rose:  -solarize 90%     solarize.jpg
[IM Output]
基本的に、与えられたグレースケールレベルを超えるものはすべてネゲートされます。したがって、「0%」の引数を与えると、基本的には貧弱なネゲート演算子になります。たとえば、ここに「-solarize」を、「-fx」の数式を使用して偽造したものを以下に示します。

  magick rose:  -fx  '.9>u ? u : 1-u'     solarize_fx.jpg
[IM Output]
この演算子は、画像から中間トーンのグレー色を抽出するのに特に適しています。たとえば、ここで私は非常に強いシグモイドコントラスト操作を使用して、70%グレーで一種の「ファジー」しきい値を生成します。次に、結果をソーラーライズして、ファジーしきい値ではなく、ファジースパイクを生成します。最終的なレベル調整により、スパイクが最大輝度になり、「フィラメント」効果が生成されます。

  magick -size 10x300 gradient: -rotate 90 \
                         -sigmoidal-contrast 50x70%   fuzzy_thres.png
  magick fuzzy_thres.png  -solarize 50%   fuzzy_spike.png
  magick fuzzy_spike.png  -level 0,50%    filament.png
[IM Output] ==> [IM Output] ==> [IM Output]
補足:グラデーションの「プロファイル」グラフを示す上記の画像は、IM Examplesの「im_profile」、Scriptsディレクトリを使用して生成されました。白のものが黒になり、中央のスパイク周辺の中間トーンのグレーがどのように保持されるかに注意してください。スパイクのファジーさと配置は、「-sigmoidal-contrast」演算子によって決定されます。通常、結果は発光する電気フィラメントや落雷のように見えるため、私はそれを「フィラメント」と呼んでいます。この効果の別の例については、ランダムフラックスを参照してください。この中間トーンのグレーの抽出は、ビットマップ形状からのエッジアウトラインの生成や、2つのバイアスグラデーションの乗算の技術にも役立ちます。この操作のもう1つの新しい使い方は、画像が基本的にシェーディングされたグレースケールまたはカラー画像ではなく、純粋な白黒スケッチまたは描画(書籍など)であるかどうかを判断することです。 画像が純粋な白黒かグレースケールかを判断するを参照してください。

ルックアップテーブルを使用した画像のリカラー

上記のようにさまざまなヒストグラムカラー調整を使用して画像をリカラーできますが、事前に準備されたカラーグラデーションまたは「カラールックアップテーブル」(Color LUTまたはCLUT)から変更された値を「ルックアップ」するだけで画像をリカラーする別の手法があります。カラーLUTには2つのタイプがあります。単純な1次元または「チャネルごとの」LUTと3DカラーLUTです。チャネルLUTには、R、G、Bチャネルごとに1つずつ、3つの独立したルックアップテーブルがあります。チャネルLUTの各エントリは、入力チャネル値を対応する出力チャネル値にマッピングします。出力画像の赤チャネルは、入力画像の元の赤の値によってのみ影響を受けます。ただし、3DカラーLUTを使用すると、入力カラー全体を関数として置き換えることができます。つまり、赤チャネルの出力値は、入力の赤、緑、および青の値のいずれかまたはすべてに依存する可能性があります。これは、チャネルクロストークと呼ばれることがあります。

カラー(チャネル)ルックアップテーブル

画像処理ツールの一般的な要件は、事前に準備されたカラーテーブルから色の範囲全体を置き換える機能です。これにより、1セットの色(通常はグレースケール)の画像を、特別な画像から代替色をルックアップするだけで、まったく異なる色のセットに変換できます。もちろん、代替色を読み取るための「ルックアップテーブル」画像が必要です。これらの最初のいくつかの例では、IMの「gradient:」ジェネレーターを使用して「カラールックアップテーブル」の生成を簡略化できるように、LUTに色の垂直グラデーションを使用することを選択しました。理論はこれくらいにしておきます。それでは、シンプルなグレースケールプラズマ画像をリカラーし、グレースケールを濃い青からオフホワイトのグラデーションのカラーに置き換えてみましょう。


magick -size 100x100 plasma:fractal -virtual-pixel edge -blur 0x5 \ -shade 140x45 -normalize \ -size 1x100 xc:black -size 9x100 gradient: \ +append gray_image.jpg magick -size 10x100 gradient:navy-snow gradient_ice-sea.png magick gray_image.jpg gradient_ice-sea.png -clut gray_recolored.jpg
[IM Output] ==> [IM Output] ==> [IM Output]
-clut」演算子は2つの画像を取得します。1つ目は色値を置き換える画像で、2つ目は単一の行または単一の列のいずれかのグラデーション画像です。
-clut」演算子はIM v6.3.5-8で追加されました。
IMが古すぎて「-clut」演算子を理解できない場合、または2次元のカラールックアップテーブルのような通常とは異なることを実行したい場合は、一般的なDIY演算子、FXを使用して独自にロールできます。たとえば、上記と同等の遅いコマンドを次に示します。

  magick gray_image.jpg  gradient_ice-sea.png \
          -fx 'v.p{0,u*v.h}'  gray_recolored_fx.jpg
[IM Output]
問題は、上記の単純なプロセスでさえ、「-fx」演算子が非常に遅く、行LUTまたは列LUTのいずれかに対して特別に設計する必要があることです。しかし、それは機能します。LUTは非常に大きくする必要はありません。たとえば、ここでは、非常に限られた数の色を持つ非常に小さなLUTを使用します。

  magick -size 1x6 gradient:navy-snow  gradient_levels.png
  magick gray_image.jpg  gradient_levels.png  -clut  gray_levels.jpg
[IM Output] ==> [IM Output] ==> [IM Output]
Webページに表示するために上記のグラデーション画像を拡大しました。そうしないと、小さすぎて適切に見ることができませんでした。LUTは実際にはわずか6ピクセルのサイズです。ただし、結果を見ると、カラールックアップ演算子がそれらの6色をスムーズなグラデーションに滑らかにしていることがわかります。ここで起こっているのは、IMがLUT画像の補間ルックアップを実行していることです。つまり、見つかった色を選択するだけでなく、LUTをより適切に表現するために、近くのすべての色の加重平均を行います。この特定のケースでは、各色のピクセルを線形線分でリンクするだけのデフォルトの「Bilinear」設定を使用しました。非常に小さなカラーLUTを使用する場合、さまざまな「-interpolate」設定により、LUTカラーのさまざまなレベルのスムージングが生成されます。たとえば、ここでは、LUTカラーのさまざまなタイプの補間スムージングを示します。

  magick gray_image.jpg  gradient_levels.png \
          -interpolate Integer         -clut  gray_levels_integer.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate NearestNeighbor -clut  gray_levels_nearest.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Average         -clut  gray_levels_average.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Blend           -clut  gray_levels_blend.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate BiLinear        -clut  gray_levels_bilinear.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Catrom          -clut  gray_levels_catrom.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Spline          -clut  gray_levels_spline.jpg
[IM Output]
整数
[IM Output]
最近傍
[IM Output]
平均
[IM Output]
ブレンド
[IM Output]
バイリニア
[IM Output]
キャットロム
[IM Output]
スプライン
Integer」と「Nearest」の設定は、色を全く滑らかにしないという点で特別です。つまり、新しい「混合色」は追加されず、存在する正確な色値のみがグレースケール画像の着色に使用されます。ただし、2つの間での色のルックアップ方法の違いに注目してください。これは微妙な違いですが、非常に重要になる可能性があります。「Average」設定は、色の帯も生成しますが、色の混合のみを使用するため、カラー参照テーブル画像のサイズよりも色が1つ少なくなります。一方、「Blend」は、「Average」と「Nearest」を混合して、より多くのピクセルを追加します。このタイプの色の「バンディング」(またはブロッキングアーティファクト)は、地理的な地図や温度グラフでは実際によく見られます。これは、地図の正確な形状をより適切に表現できるためです。シャープな境界線は等値線と呼ばれます。最終画像にわずか1ピクセルのぼかしを追加すると、色バンディングを損なうことなく、エッジの見栄えが少し滑らかになり、向上させることができます。「BiLinear」設定もバンディングを生成しますが、色が急激に変化するとき(この例ではそうではありません)、急激なグラデーションの変化の形でしか生成しません。一方、「Catrom」は色の変化を滑らかにします。最後に、「Spline」は色をぼかし、指定されたCLUTの色をまったく生成しない可能性があります。補間問題を回避したり、色のグラデーションをより適切に定義したりするには、より長いLUTを使用するのが最善の方法です。理想的には、これは可能な強度の値の全範囲をカバーする必要があります。ImageMagick Q16(16ビット品質でコンパイル)の場合、LUTの高さは65536ピクセルである必要があります。ただし、ピクセル補間を使用すると、ほとんどの画像再着色タスクに適した、より妥当な500ピクセルのLUTグラデーション画像を使用できます。上記の例で使用されている垂直グラデーションLUTは、黒または「0」インデックスが画像の上部にあるため、私たちの目には逆さまに見えることに注意してください。通常、私たち人間は(進化の歴史のおかげで)黒レベルが下部にあるグラデーションを見ることを好みます。グラデーション画像を「正しい向き」で保存する場合は、読み込むときに画像を「-flip」することができます。たとえば、より複雑なLUTを試してみて、画像で使用する前に垂直グラデーションを反転してみましょう。

  magick -size 1x33 gradient:wheat-brown gradient:Brown-LawnGreen \
          gradient:DodgerBlue-Navy   -append  gradient_planet.png
  magick gray_image.jpg \
          \( gradient_planet.png -flip \) -clut   gray_planet.jpg
[IM Output] ==> [IM Output] ==> [IM Output]
ご覧のとおり、垂直グラデーションの場合、使用する前に反転すると非常に理にかなっています。グラデーションの生成例については、色のグラデーションを参照してください。また、各グレーレベルに画像を使用してグレースケール画像をタイル表示する方法にも興味があるかもしれません。これにより、さらに優れた「マップ」のような画像を生成できます。パターンによるディザリングを参照してください。

カラーLUT変換への関数

これらの事前に準備された「ルックアップテーブル画像」(またはLUT)は、非常に複雑で時間がかかる「-fx」操作の速度を大幅に向上させるためにも使用できます。これにより、IMがピクセルごとに3〜4回関数の文字列を解釈する代わりに、置換色のルックアップをはるかに高速に実行できます。この手順は非常に簡単です。関数を未修正の線形グラデーションに適用するか、関数内の「u」を値「(i/w)」または「(j/h)」に置き換えて、位置に基づいて置換値を計算します。たとえば、高度な「アクア」エフェクトの例では、複雑な「-fx」関数を使用して、シェード演算子のグレースケール出力を調整しました。また、このグレースケール調整は「ドジャーブルー」の形状にも重ねられているため、これらの両方の演算子の結果を単一のグラデーションルックアップテーブルに組み合わせることができない理由はありません。つまり、「-fx」式とカラーオーバーレイからLUTを生成します。また、これらの例では、以前のように列ではなく、ピクセルの単一行を生成することにしました。

  magick -size 1x512 gradient: -rotate 90 -alpha off \
          -fx '3.5u^3 - 5.05u^2 + 2.05u + 0.3' \
          -size 512x1 xc:DodgerBlue -compose Overlay -composite \
          aqua_gradient.png
[IM Output]
上記の多項式「-fx」は、多項式関数を使用して、より直接的かつ高速に生成できるようになりました。例えば
"-function Polynomial 3.5,-5.05,2.05,0.3"
この事前に生成されたLUTは、非常に小さな画像を保存する最小限のコストで、シェードされた形状にはるかに迅速に適用できます。

  magick -font Candice -pointsize 72 -background None label:A \
          -trim +repage  aqua_mask.png
  magick aqua_mask.png -alpha Extract -blur 0x6 -shade 120x21 \
          -alpha On -normalize  aqua_shade.png
  magick aqua_shade.png  aqua_gradient.png -clut aqua_font.png
[IM Output] ==> [IM Output] ==> [IM Output]
警告:上記は不完全です(エッジが暗くなっていない)。
ご覧のとおり、結果は非常に効果的であり、適切なLUTグラデーションが生成されると、同じグラデーションを何度でも繰り返し再利用できます。

CLUT および透明度の処理

-clut」演算子は、「-channel」設定によって制御されますが、実際には、画像内の個々のチャンネル値のみを置き換えます。つまり、通常、ソース画像の個々のチャンネルは、カラー参照テーブルからそのチャンネルの置換値を「ルックアップ」するために使用されます。これには通常非常に不便で、適用が難しいアルファチャンネルが含まれます。通常、「-clut」演算子は、グレースケールのソース画像を着色する(前の例を参照)か、グレースケールのCLUT(カラー参照テーブル)を使用してカラー画像のヒストグラム調整を行うために使用されます。言い換えれば、通常、画像の1つは通常グレースケールになります。IM v6.4.9-8以降、「-channel」設定で、画像のアルファチャンネルを置換/調整する場合(「A」が存在する場合)、および「ソース」画像または「CLUT」画像にアルファチャンネルが定義されていない場合、IMはその画像をグレースケールであるとみなし、それに応じて動作します。たとえば、ここでは、単純なぼかし三角形をグレースケール画像として生成します。次に、透明度を含むカラー参照テーブルを使用して色付けすることができます。今回はCLUT画像を反転しなかったので、黒の置換は上部に、白の置換は下部になります。

  magick -size 100x100 xc:  -draw 'polygon 50,10 10,80 90,80' \
          -blur 0x10  blurred_shape.jpg
  magick -size 1x5 xc:none \
          -draw 'fill red    point 0,2' \
          -draw 'fill yellow rectangle 0,0 0,1'   gradient_border.png
  magick blurred_shape.jpg -alpha off    gradient_border.png \
          -channel RGBA  -interpolate integer -clut  clut_shape.png
[IM Output] ==> [IM Output] ==> [IM Output]
上記は、グレースケール画像にアルファチャンネルがない場合(「-alpha off」または「-alpha off」を使用してオフにする)と、アルファチャンネル値もルックアップする必要があることを指定した場合(「-channel RGBA」を使用)、期待どおりに機能することに注意してください。そして、ここに、透明度(およびアルファチャンネル)を持つ画像を、アルファチャンネルが有効になっていないグレースケールヒストグラム調整グラデーションを使用して調整する必要があるという、もう1つの特別なケースを示します。

  magick -size 100x100 xc:none -draw 'polygon 50,10 10,80 90,80' \
          tile_disks.jpg -compose In -composite shape_triangle.gif
  magick shape_triangle.gif -channel A -blur 0x10 +channel shape_blurred.png
  magick -size 1x50 gradient: xc:black -append -flip \
          -sigmoidal-contrast 6x0%  feather_histogram.jpg
  magick shape_blurred.png \( feather_histogram.jpg -alpha off \) \
          -channel A    -clut    shape_feathered.png
[IM Output] ==> [IM Output] ==> [IM Output] ==> [IM Output]
上記は典型的な画像フェザリングの問題です。中間画像の「黒」のハローは、「-blur」操作により、三角形を囲む完全に透明な領域が表示されるために発生します。完全に透明な場合は色が定義されていないため、IMはデフォルトで黒になります。CLUT画像自体は、50%未満の透明度のピクセルが完全に透明になるように設計されており、画像の以前の完全に透明な部分を実質的に再び透明にしています。この例では、最初の「ぼかし」を過度に行い、次にアルファチャンネルの調整を過度に修正します。その結果、三角形の点がひどく丸められます。通常の画像フェザリングでは、通常、「-blur」と「-sigmoidal-contrast」アルファ調整の両方に、はるかに小さい値を使用します。フレッド・ワインハウスは、使いやすくするために、彼の「feather」スクリプトにぼかしフェザリング技術を実装しました。

Hald 3D カラー ルックアップ テーブル

IM v6.5.3-4以降、複数の画像のすべての色を直接置き換えるために使用できるフル3Dカラー参照テーブルを使用することもできます。つまり、各カラーチャンネルの値を別個のエンティティとしてルックアップするのではなく(上記のCLUTのように)、色全体を使用して新しい色をルックアップします。ただし、3Dカラーテーブルは通常、色の値の3D配列を正しく格納するために特別なファイル形式が必要です。ただし、色の値の特別な配置を使用することで、3DテーブルをHALDカラーLUTとして知られる2D画像に保存できます。これは単なる通常の画像であり、そのため、優れた画像ファイル形式を使用してHALD 3DカラーLUTを保存できます。HALD画像の詳細と例については、公式ウェブサイトHald Images, Clut Technologyを参照してください。HALD 3Dカラーテーブルを生成するには、「HALD:{レベル}」画像ジェネレーターを使用します。たとえば、これは私が拡大した小さなもので、個々のピクセルを確認できます。

  magick  hald:3    hald_3.png
[IM Output]
この表は、一辺が '{level}2' 色、または9色のカラーキューブを保持します。フルカラーキューブには '9 × 9 × 9' 色、合計729色が含まれており、その数の平方根、つまり27x27ピクセルの画像に格納されています。色は、最初の9色(左上隅)が「純粋な黒」から「純粋な赤」へのグラデーションを形成するように格納されています。その後、9番目の色ごとに「緑」のグラデーションを形成し、81番目の色ごとに「青」のグラデーションを形成します。右下隅の最後の色は「純粋な白」です。画像を、3Dカラーキューブとして参照される、より単純な1Dピクセル配列として考えると、イメージしやすくなるでしょう。これは小さなHALD CLUT画像にすぎません。通常は、少なくともレベル8のHald(デフォルト)を使用します。これは、一辺あたり64色、または64^3 = 262144色のカラーキューブを保持し、512x512ピクセルのサイズの画像を生成し、約10KbyteのPNG画像に保存します。これはすべて8ビットの色ではありませんが、非常に優れています。すべての8ビットカラーを持つHALD画像の場合、4096x4096の画像を生成するレベル16バージョンが必要になります。これは、通常のデジタルカメラの画像でさえ、すべての可能な8ビットカラーを保持できないことを証明するだけです。ただし、IMはHALDから近隣の8色を補間して、ルックアップ置換の最終的な色を計算するため、より小さなHALD画像を使用できます。それは、より大きなバージョンほど優れた表現にはなりません。8よりも大きいHALD画像は推奨されず、それを保持するには少なくとも16ビット値深度の非常に大きな画像が必要になります。これらの生成されたHALD画像は「恒等」または「no-op」CLUT画像です。つまり、それらは3Dカラーキューブを形成する通常のカラー値であり、そのため画像を変更しません。たとえば、「-hald-clut」演算子を使用して、「no-op」HALD画像を適用してみましょう。

  magick rose:  hald_3.png -hald-clut   rose_hald_noop.png
[IM Output] ==> [IM Output] ==> [IM Output]
この画像は元の画像とまったく同じで、HALD画像には変更は含まれていません。ただし、手動で、または色の変更を使用してHALD画像を修正することにより、元の色を修正された色に置き換えることができます。たとえば、ここで、ブレンドされたセピアトーンのカラースキームを作成します...

  magick hald_3.png \( +clone -sepia-tone 60% \) -evaluate-sequence mean hald_sepia.png
  magick rose.png   hald_sepia.png -hald-clut   rose_hald_sepia.png
[IM Output] ==> [IM Output] ==> [IM Output]
もちろん、HALD画像に特定の色の変更を適用できる場合は、実際の画像にも直接適用できます。ただし、色の変更を保存して再利用できるようになり、必要な回数だけ適用できます。つまり、HALDに労力を費やし、将来のために保存できます。HALD CLUT画像を他の人や他のアプリケーションに送信またはダウンロードすることもできます。「Gimp」や「Photoshop」のような画像エディターを使用して、または列挙ピクセルテキスト画像に保存されている場合は、プレーンテキストエディターを使用して、HALDの色を直接編集することさえできます!これは、特に非常に複雑な色の変更の場合に当てはまります。興味深いまたは役立つHALD CLUT画像をお持ちの場合は、メールでお送りください。ここで例を挙げます。あなたもクレジットされます!

Hald CLUT の制限

CLUT演算子を使用した、より単純な1次元グラデーションルックアップとは異なり、HALD CLUTを使用して色を回転できます。たとえば、赤と青の色を入れ替えます。これは、はるかに用途の広いCLUTメソッドです。ただし、グレースケール画像に色を付けたり、色値のヒストグラム調整を行ったりするなどの単純な操作にはあまり適していません。また、HALD CLUT画像にそのような置き換え色を保存することにより、色を透明または半透明の値に置き換えることもできます。ただし、この置き換えルックアップは色のみに基づいています。特定の方法で透明な色を置き換えるために使用することはできません。結局のところ、4Dカラールックアップハイパーキューブではありません!

Hald CLUT を使った色の置換

色値全体が色の置き換えを検索するために使用されるため、これを、画像内のすべての色を他の色で直接置き換える方法として使用することもできます。ただし、IMは現在HALDの線形補間ルックアップを実行しているため、3Dカラーキューブの近隣の8つのカラーセルすべてに置き換え色を設定する必要があります。
建設中
これにはさらに作業が必要であり、特定の色置換のためにより良く機能させるために、3D線形補間ルックアップではなく、「最近傍」HALDルックアップ設定(たとえば、-interpolateを使用)が必要になる場合があります。また、HALD内の特定の色を簡単に見つける方法(最近傍、または8つの近傍)があれば、これがはるかに簡単になるでしょう。アイデア、提案、またはさらに良い小さな例をお持ちの場合は、メールまたはIMディスカッションフォーラムに投稿して貢献してください。もう1つのアイデアは、元の画像と変換された画像の2つの画像がある場合、2つの画像の比較からHALD CLUT画像を埋めることが可能であるということです。すぐに色を埋めたら、残りのカラーキューブは、存在する色をカーブフィッティングすることで、少なくともおおまかに導き出すことができるはずです。つまり、発見された色の変化から4次元の色表面を作成します。完了したら、HALD CLUTを他の画像に適用して、他の画像に同じ色の変換(どちらの方向でも)を行うことができます。

フルカラーマップの置換

将来:1つのカラーマップのすべての色を別のカラーマップの色で置き換えます。これを最適に実行する方法に関する提案、または一部の画像カラーマップ関数を実装するプログラマーを歓迎します。1つの方法は、シンボルによるディザリングで提示されたアイデアを使用することです。最もよく知られている解決策(ただし理想的とは言えません)は、現在、Fred Weinhausが「mapcolors」スクリプトで提供しています。このスクリプトは、基本的に各色を一度に1つずつマッピングし、一方の画像から関与するピクセルを新しい初期ブランク画像にマスクします。もう1つのアイデアは、3次元色の置換をHALDカラーテーブルに何らかの方法でマッピングすることです。これにより、指定された色がマッピングされるだけでなく、指定された色間の色も論理的な方法で再マッピングされます。HALDジェネレーター募集中。
建設中
More color options yet to be looked at in detail...

  -contrast
  -brightness-contrast

Color Cycling?
    -cycle     shift colormap (for animations of fractals???)

Chromaticity Color Points???
   –white-point x,y
   –red-primary x,y
   –green-primary x,y
   –blue-primary x,y


Thresholds  (after negation)
  Specifically  -white-threshold and -black-threshold