ImageMagick 使用例 -- 色の変更
- 画像の反転(ネガ化) (黒と白を反転する)
- レベル調整演算子 (コントラストと黒/白の調整)
- 逆方向のレベル調整 (脱コントラスト化)
- ガンマレベル調整 (中間調の調整)
- ガンマ演算子による調整 (レベル調整を伴わないガンマ)
- 色によるレベル調整 (色を使った画像レベルの調整)
- シグモイド非線形コントラスト (非線形なコントラスト調整)
-
ヒストグラム変更による調整 (画像のヒストグラムを変更する)
- Normalize (自動レベル伸長)
- Contrast Stretch (制御された伸長)
- Linear-Stretch (別方式の伸長)
- ヒストグラム再分布
- Equalize (一様なヒストグラム再分布)
- ガウシアン再分布
-
DIY レベル調整 (汎用の着色演算子)
- 数式による非線形調整
-
画像の中間調を着色する (汎用の着色演算子)
- 中間調の色付け
- セピア調の着色
- デュオトーン効果
- 色の着色、DIY
- Modulate による色相サイクル
- Modulate DIY
- 他の色空間での Modulate
- LCHuv その他の色空間での Modulate
- カラーマトリックス演算子
- 関数からカラー LUT への変換
- CLUT と透明度の扱い
- Hald 3D カラールックアップテーブル
- Hald CLUT の制限
- Hald CLUT を使った色の置換
- カラーマップ全体の置換 (解決策はなく、アイデアのみ)
ここでは、画像のすべての色を全体として変更する技法を見ていきます。画像を明るくしたり暗くしたりするものから、より思い切った色の変更まで扱います。これらの技法を試すには、テスト画像が必要になります...
この画像をどう生成したかは気にしないでください。この演習にとって重要ではありません。私はこの画像を、さまざまな色・透明度・その他の特徴を含むように意図的に設計し、IM を使ったときに十分に動作確認できるようにしてあります。 | ![[IM 出力]](../static/img/images/test.png)
---|---
この画像を生成するために使ったコマンドに本当に興味がある場合は、私がこの画像を作成するために使っている特別なスクリプト "[**generate_test**](../static/img/scripts/generate_test)" を参照してください。 | 警告: 以下の色処理は一般に、画像が線形色空間を使っていることを前提としています。しかしほとんどの画像は sRGB やガンマ補正された色空間で保存されているため、正しく処理するにはまず色空間の補正も適用すべきです。
---|---
カラーからグレースケールへの変換
グレースケール画像は、元画像のさらなる処理や、背景の合成への利用など、多くの用途で非常に役立ちます。画像をグレースケールに変換する最良の方法は、IM に画像をグレースケールの色空間表現へ変換するよう指示することです。
magick test.png -colorspace Gray gray_colorspace.png
青が赤よりもずっと暗くなっていることに注目してください。これは、人間の目に見える強度に合わせて重み付けがされているためです。つまり、'red' は明るい色である一方、'blue' はより暗く見える色なのです。これは、専用の "[-grayscale](https://imagemagick.org/command-line-options/#grayscale)" 演算子(IM v6.8.3-10 で追加)で 'rec709luma' 変換式を使う場合と同等です。 |
magick test.png -grayscale rec709luma gray_grayscale.png
![[IM 出力]](../static/img/color_mods/gray_grayscale.png)
'rec709luma' という値は、"[-intensity](https://imagemagick.org/command-line-options/#intensity)" 設定(後述)で使うために定義されている多くのグレースケール化の式のうちの一つにすぎません。例えば、こちらはもう一つの一般的なグレースケール化の式 'rec601luma' です。 |
magick test.png -grayscale rec601luma gray_grayscale_601.png
![[IM 出力]](../static/img/color_mods/gray_grayscale_601.png)
ご覧のとおり、赤・緑・青の各色チャンネルの強度レベルにわずかな違いがあります。
しかし、'グレースケール' には他にも多くの方法や意味があります... 例えば、Modulate 演算子を使い、すべての色の彩度レベルをゼロに設定することで、画像からすべての色を抜き取ることができます。 |
magick test.png -modulate 100,0 gray_modulate.png
![[IM 出力]](../static/img/color_mods/gray_modulate.png)
これは本質的に、画像を HSL 色空間に変換し、その色空間からグレースケールの 'Lightness'(明度)値を抽出するものです。ただし "-define modulate:colorspace" を使えば、他の色空間モデルを指定できます。下記の他の色空間での Modulate を参照してください。私がテスト画像の中央の色付き円盤に使った IM の 'green' 色は、実は虹色に使われるような純粋な緑ではなく、新しい SVG -- Scalable Vector Graphics 規格で定義された半分の明るさの緑であることに注目してください。純粋な RGB の緑が必要な場合は、代わりに 'lime' という色を使えます。詳しくは色名の衝突を参照してください。 もう一つの方法は、FX DIY 演算子を使って 3 つのチャンネルを平均し、純粋に数学的な意味でのグレースケールを得ることです。 |
magick test.png -fx '(r+g+b)/3' gray_fx_average.png
![[IM 出力]](../static/img/color_mods/gray_fx_average.png)
| sRGB チャンネル値の平均は、'OHTA' 色空間の強度チャンネル(赤チャンネル)とも同等です。あるいは HSI 色空間の 'I' チャンネルとも同等です。
---|---
別の技法として、3 つのチャンネルすべてを単純に加算する方法(マンハッタン距離として知られる色の尺度)があります。この場合、結果として得られる画像は '量子丸め' の影響による情報の損失はありませんが、最も明るい色についての情報を失う可能性があります。残念ながら、透明度チャンネルも失われます。 |
magick test.png -separate \
-background black -compose plus -flatten gray_added.png
![[IM 出力]](../static/img/color_mods/gray_added.png)
同じチャンネル加算の技法を使って、個々の色チャンネルの重み付けを制御することもできます。例えば、これは使用できる一つの DIY の式です... |
magick test.png -fx '0.3*r+0.6*g+0.1*b' gray_diy.png
![[IM 出力]](../static/img/color_mods/gray_diy.png)
"[-fx](https://imagemagick.org/command-line-options/#fx)" 演算子内で同じ意味を持たせたい場合は、'intensity' を使うこともできます。 |
magick test.png -fx intensity gray_intensity.png
ただし、FX DIY 演算子は逐次解釈されるため、非常に非常に遅くなることがあります。より複雑な演算には、よりシンプルな Evaluate 演算子 "[-evaluate](https://imagemagick.org/command-line-options/#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 出力]](../static/img/color_mods/gray_253.png)
| _上記は、'Q8' の品質レベルでコンパイルされた ImageMagick では '量子化' の影響を受けます。これは、"[-evaluate](https://imagemagick.org/command-line-options/#evaluate)" の結果が、画像値に使われる小さな 8 ビット整数に保存されるためです。それらの値が加算されるのはその後であり、結果として精度が失われます。
'Q16' でコンパイルされた ImageMagick、あるいはさらに良い HDRI 品質のコンパイルオプションを使えば、はるかに正確な結果が得られます。もう一つの新しい代替手段は Poly -- 重み付き画像マージ演算子で、これは分離したチャンネル画像の重み付けと加算を 1 つの演算で行うため、'量子丸め' の影響を回避できます。
_
---|---
同様の技法を使って、3 つの RGB チャンネルを等しく直接平均することで、純粋に数学的なグレースケールを生成できます。 |
magick test.png -separate -evaluate-sequence mean gray_average.png
![[IM 出力]](../static/img/color_mods/gray_average.png)
ただしご覧のとおり、結果画像のアルファチャンネルを保持しようとはしていません。もう一つの高速な代替手段は、"[-recolor](https://imagemagick.org/command-line-options/#recolor)" カラーマトリックス演算子を使うことで、これにより 3 つの色チャンネルの重み付けを指定できます。 |
magick test.png -recolor '.2 .5 .3
.2 .5 .3
.2 .5 .3' gray_recolor.png
![[IM 出力]](../static/img/color_mods/gray_recolor.png)
これは透明度に影響を与えず、特定の重み付けを使った色変換のはるかに優れた方法になります。基本的に、最初の行の数値が結果画像の赤チャンネルのチャンネル重み付けで、次の 3 つが緑、最後の 3 つが青のためのものです。 "[-type](https://imagemagick.org/command-line-options/#type)" を使って、画像の読み込みや書き出しの際に IM へその画像をグレースケールとして扱うよう指示することもできます。 |
magick test.png -type GrayScaleAlpha gray_type.png
![[IM 出力]](../static/img/color_mods/gray_type.png)
| "[-type](https://imagemagick.org/command-line-options/#type)" 設定は一般に、画像をファイルから読み込んだり書き出したりする際の指針としてのみ使われます。そのため、その動作は画像の最終的な書き出しまで遅延されます。その効果は、関係する画像ファイル形式の能力にも大きく依存し、その過程で ImageMagick が通常行う判断を上書きするために使われます。詳しくは Type の例を参照してください。
---|---
| IM v6.3.5-9 以前では、上記はバグにより書き出された画像中の透明度をすべて除去していました("[-type](https://imagemagick.org/command-line-options/#type) Grayscale" と同等)。私はこの問題に気づいて報告するとすぐに修正されました。(ここに教訓があります :-)
---|---
はるかに興味深い技法は、画像のさまざまな色空間表現から適切な色チャンネルを抽出することで、多様な意味の明るさを取り出すことです。例については色空間表現からのグレースケールチャンネルを参照してください。
画像のレベル調整
画像に対して行える最も基本的な調整は、'レベル' 調整として知られるものです。これは基本的に、個々の RGB 色値(あるいはアルファチャンネル値)を取り、それらを伸長または圧縮するように調整するものです。調整されるのはチャンネル値だけなので、これらはカラー画像よりもグレースケール画像で示すのが最適です。ただし、画像のすべての色チャンネルを同じ量だけ調整すれば、画像を強調したり調整したりする目的でカラー画像にも使えます。 これを、より自動的な形のレベル調整と混同しないでください。それについては、下記の例の次の主要セクション Normalize 調整で見ていきます。この関数は、実際の画像内容にかかわらず、まったく同じ演算を行います。画像が明るくても暗くても、青みや黄みがかっていても関係ありません。これらの演算は、実際の画像内容に対して盲目的です。
これらの演算を示すにあたり、私は右に示すような変更を加えた "[gnuplot](http://www.gnuplot.info/)" グラフを使います。これは私が作った特別なスクリプト "[im_graph](../static/img/scripts/im_graph)" で生成しています。グラフには赤い線があり、与えられた元の 'x' 値(一番上のグラデーションのグレースケール値を表す)を、示される 'y' 値にマッピングします。結果として得られる色のグラデーションは、入力の線形グラデーションの下にも表示されます。右に示したグラフは、実際には画像に何もしない IM の "[-noop](https://imagemagick.org/command-line-options/#noop)" 演算子のものです。そのため、画像の各色値はまったく同じ値に変化なくマッピングされます。したがって下のグラデーションは上のグラデーションと同じです。
画像の反転(ネガ化)
行える最もシンプルで基本的な大域的レベル調整は、"[-negate](https://imagemagick.org/command-line-options/#negate)" 画像演算子を使って画像を反転することです。本質的に、これは白を黒に、黒を白にし、すべての色をそれに合わせて調整します。つまり、赤色をその補色であるシアンに、青を黄に、といった具合に変えます。これは、下に示したマッピンググラフで確認できます。私は 'test' 画像と標準の IM 'rose' 組み込み画像の両方に "[-negate](https://imagemagick.org/command-line-options/#negate)" 演算子を使っています。マッピンググラフ画像の下のグラデーションが反転し、黒と白が入れ替わっていること、そして反転された 'test' 画像にも同じ反転が現れていることに注目してください。
magick test.png -negate test_negate.png
magick rose: -negate rose_negate.gif
内部的には、negate は実はかなり単純です。3 つの色チャンネルを独立に扱い、デフォルトではアルファチャンネルを無視します。もしそうでなければ、次のような非常にばかげた結果になります...
magick test.png -channel RGBA -negate negate_rgba.png
半透明の色グラデーションを見ればわかるように、画像は反転されています。しかし透明度チャンネルも反転されているため、画像中の不透明な色がすべて失われています。これが、"[-channel](https://imagemagick.org/command-line-options/#channel)" のデフォルト設定が 'RGB' である理由です。詳しくは色チャンネルを参照してください。 反転を 1 つのチャンネル、例えば緑色チャンネルだけに限定することもできます。これはあまり役に立たないように見えるかもしれませんが、時には極めて重要になります。
magick test.png -channel green -negate negate_green.png
"[-negate](https://imagemagick.org/command-line-options/#negate)" 演算子は、実はそれ自身の逆演算です。同じ "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定で 2 回反転を行うと、互いに打ち消し合います。
magick negate_green.png -channel green -negate negate_restore.png
反転は画像処理において極めて一般的で、特にグレースケール画像を扱う際、他の処理オプションの前後のステップとして使われます。そのため、これで遊んでみて、何かをするときには常に念頭に置いておくことをお勧めします。反転された画像を扱うことで、そうでなければ難しい問題を解決できることがあるからです。
直接的なレベル調整
"[-level](https://imagemagick.org/command-line-options/#level)" 演算子は、より汎用的なレベル調整演算子です。基本的に、2 つの値 'black_point'(黒点)と 'white_point'(白点)、そして省略可能な 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
25% はどんな画像にとっても巨大なコントラスト強調ですが、何をするものかを明確に示しています。'黒' と '白' の両方の点を変える必要はありません。代わりに、色範囲の片方の端だけを調整することも十分に許容されます。例えば、非常に明るい、または非常に暗い rose 画像を作れます。
magick rose: -level 0,75% rose_level_light.gif
magick rose: -level 25%,100% rose_level_dark.gif
ただし、ここでも警告しておきますが、与えられた範囲外の色は 'クリップ' または '焼き付け' られ、後の画像処理には使えなくなります。これが "[-level](https://imagemagick.org/command-line-options/#level)" 演算子を使う際の最大の問題です。
負の値を使うことで、画像のおおまかな脱コントラスト化を行えます。これが意味するのは、色値を '黒' と '白' にマッピングする色値を与えて間の色を伸長するのではなく、色値を圧縮して、想像上の負の色を黒や白にマッピングするということです。結果として、画像全体が灰色がかります。 |
magick rose: -level -25% rose_decontrast.gif
ただし、画像を脱コントラスト化するこの方法は非常に不正確であり、新しい逆方向レベル演算子を使えない version 6.4.2 より古い IM を使っている場合を除き、お勧めしません。
"[-level](https://imagemagick.org/command-line-options/#level)" 演算子を使って画像を反転(前に上で示したとおり)することもできます。'黒' 点と '白' 点の値を入れ替えて与えるだけで、"-level 100%,0" のようにします。 |
magick rose: -level 100%,0 rose_level_neg.gif
あるいは、両者を同じ値に設定すると、画像中のすべての色値を実質的にしきい値処理させることができます。"[-level](https://imagemagick.org/command-line-options/#level)" を使って画像をしきい値処理することは、その値でしきい値演算子を使った場合とまったく同じです。右に示したマッピンググラフは、"-level 50%,50%" 演算の結果と、それがグレースケールグラデーションに及ぼす効果を示しています。 |
magick rose: -level 50%,50% rose_level_thres.gif
"[-threshold](https://imagemagick.org/command-line-options/#threshold)" とは異なり、デフォルトの "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定で使った場合、画像は自動的にはグレースケール画像に変換されないことに注目してください。 level を使って画像を線形に変更するという一般的な性質により、"[-level](https://imagemagick.org/command-line-options/#level)" 演算子は一般的なグレースケール画像の変更やマスクの調整に適しています。さらに("[-channel](https://imagemagick.org/command-line-options/#channel)" 設定を使って)画像全体ではなく個々のチャンネルを変更できるという事実が加わり、IM ユーザーが利用できる最良の色変更演算子の一つになっています。 |
なお、Evaluate と Function 演算子を使って色値をより直接的に数学的に変更し、-level の + と - の両方の形と同じ結果を得ることもできます。 |
|---|---|
なお、"[-level](https://imagemagick.org/command-line-options/#level)" 演算子は透明度チャンネルを 'マット' 値として扱うことに注意してください。そのため 100% が完全に透明で、0% が不透明です。ぼかしたシェイプ画像に "[-level](https://imagemagick.org/command-line-options/#level)" を使う際はこの点を考慮してください。これは最も一般的に、'シェイプ' 画像をぼかした後、結果を拡大・伸長するために行われます。これらの例については、ソフトエッジや影の輪郭を参照してください。 |
|
| --- | --- |
逆方向のレベル調整 -- 画像の脱コントラスト化
IM version 6.4.2 で、Level 演算子が拡張され、'逆方向' の形 "[+level](https://imagemagick.org/command-line-options/#level)"('プラス' に注意)が提供されるようになりました。あるいは、元の "[-level](https://imagemagick.org/command-line-options/#level)" の形を使い、level 引数に '!' を加えることもできます(古い API インターフェース向け)。この変種の引数はまったく同じですが、'black_point' と 'white_point' を '黒' と '白' にマッピングするように値を伸長するのではなく、'黒' と '白' を与えられた点にマッピングします。言い換えれば、"[+level](https://imagemagick.org/command-line-options/#level)" は "[-level](https://imagemagick.org/command-line-options/#level)" のちょうど逆です。 例えば、ここでは '黒' を 25% グレーに、白を 75% グレーにマッピングし、'逆方向' の形を指定する 2 つの方法を使って、画像を非常に正確に脱コントラスト化しています。
magick test.png +level 25% test_level_plus.png
magick rose: -level 25%\! rose_level_plus.gif
上記の "+level 25%" 演算を、前に示した負の脱コントラスト化 "-level -25%" 演算子の使用と比較すると、両者が同じではないことがわかります。'プラス' 版ははるかに強く脱コントラスト化された画像(より灰色がかっている)を生成しますが、それは演算子に与えた正確な値にマッピングすることで行われ、'マイナス' の形が使った '想像上の' 値ではありません。この正確な値の使用は重要であり、演算子の 'プラス' の形が追加された理由の一つです。もちろん、'25%' はここでも非常に大きな値であり、典型的な画像作業での使用はお勧めしません。 なお、"[-level](https://imagemagick.org/command-line-options/#level)" と "[+level](https://imagemagick.org/command-line-options/#level)" は、同じ引数を与えたとき実際には互いにちょうど逆になります。つまり、一方は値を範囲の両端にマッピングし、もう一方は範囲の両端からマッピングします。例えば、ここではテスト画像の色を "[+level](https://imagemagick.org/command-line-options/#level)" を使って圧縮し、その後 "[-level](https://imagemagick.org/command-line-options/#level)" を使って再び伸長し、画像を元の見た目に近い状態に復元しています。
magick test.png +level 20% -level 20% test_level_undo.png
2 つの画像は非常に非常に似て見え、私は高品質の 'Q16' 版 IM を使っているので、違いに気づくのはまず難しいでしょう。しかし、画像の色値をより小さな整数の範囲に圧縮してから再び復元しているため、値はまったく同じではないかもしれません。極端な場合、これは量子丸めの影響を引き起こすことがあります。これら 2 つの演算を逆の順序で行う(色値を伸長してから圧縮する)と、量子クリッピングの影響が生じます。 "[+level](https://imagemagick.org/command-line-options/#level)" 演算子のもう一つの有用な側面は、画像中のすべての色値を同じグレースケールレベルに完全に圧縮できることです。
magick test.png +level 30%,30% test_level_const.png
各チャンネルごとに特定の色の値に従ってレベルを指定することで、グレースケールグラデーションを特定の色のグラデーションに実質的に変換できます。しかしこれは計算して行うのがかなり難しいです。そのため、'level' 値ではなく特定の色で黒点と白点を指定できる "[-level-colors](https://imagemagick.org/command-line-options/#level-colors)" 演算子も提供されています。下記の色によるレベル調整を参照してください。
レベルのガンマ調整
上記の "[-level](https://imagemagick.org/command-line-options/#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
値は一般に、まぶしいほど明るい画像にする 10 から、非常に暗い画像にする .2 までの範囲です。前述のとおり、値 1.0 は画像に 'ガンマ' 変更を加えません。ただし、'2.0' という特別な値(上記参照)を使うと、画像の正規化された色の平方根を得られます。 "[-level](https://imagemagick.org/command-line-options/#level)" 演算子の両版は 'ガンマ' を同じ方法で扱います。これは、'黒' と '白' の端のレベル調整を、非線形の 'ガンマ' 調整と組み合わせられることを意味します。 画像の単一チャンネルだけを調整することもできます。例えば、ここでは青チャンネルだけの黒い端に微妙な色合いを与え、ガンマを使って画像の中間調の色レベルを保持しています。
magick test.png -channel B +level 25%,100%,.6 test_blue_tint.png
この具体的な例は、海だけが純粋な黒で、陸地がより灰色がかっている気象衛星写真に色合いを付けるために使えます。この青チャンネル調整の他の代替手段は、下記の DIY 数式による非線形調整で示します。
ガンマ演算による調整
"[-gamma](https://imagemagick.org/command-line-options/#gamma)" 演算子も提供されており、"[-level](https://imagemagick.org/command-line-options/#level)" 演算子の 'ガンマ' 設定とまったく同じ効果を持ちます。ただし、各チャンネルごとに 'ガンマ' 調整レベルを調整することもできます。その本当の用途は、画像に対して線形演算を行う前に画像の 'ガンマ' 関数を調整することです。詳しくは人間の色知覚とガンマ補正を参照してください。 この関数を使って、各 RGB チャンネルごとに異なる方法で画像を明るくすることもできます。 |
magick rose: -gamma 0.8,1.3,1.0 gamma_channel.gif
![[IM 出力]](../static/img/color_mods/gamma_channel.gif)
ご覧のとおり、これを使って画像に微妙な色合い付けや色調整を行ったり、特定の色を含みすぎた画像を補正したりできます。 | _この関数を使うべき理由については、ガンマ補正を参照してください。
_
---|---
この関数は実はEvaluate POW 関数と同等ですが、引数が反転しています。そのため "-evaluate POW 2.2" は実際には "-gamma 0.45455"(0.45455 は 1/2.2 に等しい)演算を行い、これは "-gamma 2.2" の逆になります。
"[-gamma](https://imagemagick.org/command-line-options/#gamma)" のあまり明白でない用途の一つは、特定の画像チャンネルをゼロにすることです(色チャンネルのゼロ化を参照)。あるいは、画像を完全に '黒'、'白'、その他の原色で塗りつぶすことです(原色のキャンバスを参照)。
色によるレベル調整
"[-level-colors](https://imagemagick.org/command-line-options/#level-colors)" 演算子は IM v6.2.4-1 で追加されました。本質的に、これは上で説明した Level 演算子とまったく同じですが、各チャンネルの値が色値として指定されます。つまり、"[-level-colors](https://imagemagick.org/command-line-options/#level-colors)" オプションは、与えられた色を '黒' と '白' にマッピングし、その間の他のすべての色を線形に伸長します。これにより、与えられた色の範囲が画像から実質的に除去されます。 そしてこれは機能しますが、特に有用ではありません。なぜなら、あるチャンネルで共通の値を持つ色に対しては失敗しやすいからです。例えば、'DodgerBlue' と 'White' は青チャンネルで同じ色値を持ちます。そのため、"-level-colors DodgerBlue,White" は必ずしもそれらの色を黒と白にマッピングしないかもしれません。その場合のより良い技法は、最も差の大きいチャンネル(赤など)のグレースケール画像を抽出し、そのチャンネルを level または normalize することです。警告: '透明' な色には注意してください。
一方、演算子のプラスの形 "[+level-colors](https://imagemagick.org/command-line-options/#level-colors)" は極めて有用です。これは '黒' と '白' の色を与えられた値にマッピングし、その間の他のすべての色を、与えた 2 つの色に収まるように線形に圧縮するからです。例えば、'black' と 'white' を 'green' と 'gold' にマッピングしてみましょう...
magick test.png +level-colors green,gold levelc_grn-gold.png
ご覧のとおり、グレースケールグラデーションは与えられた色で区切られたグラデーションに再マッピングされ、グレースケール範囲外の色も変更されますが、それらも指定された色範囲の基本的なスタイルに従います。これにより、"[+level-colors](https://imagemagick.org/command-line-options/#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
これにより、グレースケール画像を好きな色のグラデーションに簡単に変換できます。例えば、ここでは黒白のグラデーションを赤白のグラデーションに再マッピングしています(引数の ',' に注意)...
magick cow.gif +level-colors red, cow_red.gif
これは単に '黒' を '赤' に置き換えただけでなく、アンチエイリアスされた灰色の色をすべて '赤' と '白' の適切な混合に再マッピングし、非常に滑らかな結果を生み出しました。
もし単純な直接的な色の置換を行って純粋な黒色を赤に変換していたら、ひどい画像(右に表示)になっていたでしょう。その画像を生成するために使った例については、ファズ係数を参照してください。 もちろん、色の一方を代わりに透明にしたい場合は、-alpha Shape 演算子を使う方が良いです。これはグラデーションをアルファチャンネルに転送することを必要とします。
'カンマ' 区切りなしで色を 1 つだけ指定すると、その色が黒点と白点の両方に使われます。これは、画像内のすべての色がその 1 色にリセットされることを意味します(現在の "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定の制限に従って)。 |
magick test.png +level-colors dodgerblue levelc_blue.png
![[IM 出力]](../static/img/color_mods/levelc_blue.png)
これは、画像を着色する(下記参照)ために "-fill DodgerBlue -colorize 100%" を使うのと同じ結果です。画像の透明度設定も設定したい場合は、透明度チャンネルを含むように "[-channel](https://imagemagick.org/command-line-options/#channel)" を設定するか、"-alpha opaque" または "-alpha off" のいずれかを使ってアルファチャンネルを完全に不透明に設定する必要があります。 |
magick test.png -channel ALL +level-colors dodgerblue levelc_blue2.png
![[IM 出力]](../static/img/color_mods/levelc_blue2.png)
既存の画像を空白にするも参照してください。 グレースケール画像ではなくカラフルな画像を調整したり '色合い付け' したりするために、これを使ったいくつかの例を以下に示します。
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
まとめると、"[+level-colors](https://imagemagick.org/command-line-options/#level-colors)" はグラデーションによる色の置換であり、線形の着色演算子であり、色を完全にリセットすることもできます。
シグモイド非線形コントラスト
'画像処理の基礎' についての PDF 論文(44 ページ)では、線形コントラスト制御(level)を使う代わりに、ガンマ補正を使った 'シグモイド非線形コントラスト制御' として知られる手法が提示されています。結果は、色範囲全体にわたる非線形で滑らかなコントラスト変化(数学用語での 'シグモイド関数')であり、白と黒の色をよりよく保持するため、写真の色調整にはるかに適しています。 論文の正確な式は非常に複雑で、間違いさえありますが、本質的に 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 result (x / y + 1) * (1 / (x + 1) - 1 / y) _この式は実は非常にシンプルな指数曲線で、上記の式の大部分は 0 が 0 のまま、1 が 1 のままになることを保証するために設計されています。つまり、グラフは常に 0,0 と 1,1 の点を通ります。そして変化の傾きが最も大きいのは与えられたしきい値のところです。
---|---
例えば、これは上記の式の "[-fx](https://imagemagick.org/command-line-options/#fx)" 実装で、非常に高いコントラスト値 '10' と '50%' のしきい値から得られたものです。これらの値は、関数を高速化するために浮動小数点定数に組み込まれています。
magick test.png -fx '(1/(1+exp(10*(.5-u)))-0.006693)*1.013567' \
sigmoidal.png
幸運なことに、IM v6.2.1 にはこの複雑な関数が新しい演算子 "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)" として組み込まれており、はるかに簡単に適用できます。 |
magick test.png -sigmoidal-contrast 10,50% test_sigmoidal.png
![[IM 出力]](../static/img/color_mods/test_sigmoidal.png)
おまけに、IM はその逆である 'シグモイドコントラスト低減' 関数(演算子のプラス '+' の形)も提供しており、同じ引数で適用すると元の画像を(ほぼ正確に)復元します。 |
magick test_sigmoidal.png +sigmoidal-contrast 10,50% \
test_sigmoidal_inv.png
magick rose: -sigmoidal-contrast 10,50% rose_sigmoidal.gif
![[IM 出力]](../static/img/color_mods/rose_sigmoidal.gif)
'10' は非常に重いコントラスト係数だと言いました。実際、この値より高いものは、コントラスト強調というより、ぼやけたしきい値処理のようなものと考えられます。この演算子を使った実践的な例については、上級編の"Gel" 効果の例を参照してください。そこでは、シェイプ領域の色に追加される明るい領域をシャープにするために使われています。
その他のコントラスト演算子
作成中
-contrast と +contrast
かなり役に立たない、ささやかなコントラスト調整演算子
<a id="threshold"></a>-threshold
画像をしきい値処理する。与えられた値以下のすべての値は
0 に設定され、それより大きいものは最大値に設定される。
level と同様、これはチャンネル演算子であるが、デフォルトの
'channel 設定' が使われた場合は、画像のグレースケール強度のみが
しきい値処理され、白黒画像が生成される。
magick rose: -threshold 45% x:
"-channel All" を使うことで、各チャンネルが個別にしきい値処理される
通常のチャンネル動作を強制できる。
magick rose: -channel All -threshold 45% x:
<a id="black-threshold"></a>-black-threshold
<a id="white-threshold"></a>-white-threshold
これは -threshold に似ているが、しきい値の片側だけが実際に
変更される。
例えば、ここでは 30% より暗いものはすべて黒に設定される。
magick rose: -black-threshold 30% x:
magick rose: -white-threshold 50% x:
ただしこれらの演算子はチャンネルの影響を受けないようなので、
グレースケール画像にのみ適しているかもしれない!
ヒストグラム変更による調整
このセクションはFred Weinhaus氏と Anthony Thyssen 氏の共同作業によるものです。 ヒストグラムとは何でしょうか? ヒストグラムは特別な種類のグラフです。これは単純に、画像中のピクセルの色レベルを、それぞれ値の小さな範囲をカバーする固定数の 'ビン' に振り分けます。そのため、各ビンには、その範囲に入る画像中の色レベル(ピクセル値)の数のカウントが含まれます。結果として、画像を構成する色値が、左の黒から右の白まで、どのように分布しているかの表現が得られます。 ヒストグラムは、各チャンネルごとに個別に生成することも、すべてのチャンネルを合わせた値を見る大域的なヒストグラムとして生成することもできます。結果はしばしば棒グラフの画像として表示されます。IM では、これは特別な Histogram: 出力形式を使って行われます。例えば... |
magick rose: histogram:histogram.gif
![[IM 出力]](../static/img/color_mods/histogram.gif)
しかしこれは、線が棒の頂点を結ぶ折れ線グラフとして表示することもできます。これは下記の議論で後に示します。この特別な出力形式の詳細については Histogram: を参照してください。これは、IM を使って画像のヒストグラム情報を抽出する最良の方法なので、この時点で読んでおくことをお勧めします。 ヒストグラムグラフの実際の高さにはほとんど意味がありません。通常、最も高いピークが画像の上端に触れるようにスケーリングされるからです。そのため、個々の '棒' の高さは関係ありません。はるかに重要なのは、ヒストグラムの全範囲にわたる分布と、グラフ全体にわたって相対的な高さが互いにどう関係しているかです。ヒストグラムを見るときは、次の要素を考慮します。
- ヒストグラムは値の 1 つの広い帯を形成していますか? これは、画像が色空間を広く使っており、良いコントラストを持つことを意味します。
- それとも、すべてが中央や範囲の一端の密集したグループになっていますか? これは、画像のコントラストが低く、'もやがかかった' または '灰色がかった'、あるいは過度に明るいか暗い見た目になることを意味します。
- 2 つ以上のピークを形成していますか? 画像内の大きく異なる領域や区域の結果として。
- ほとんどのピクセルはどこにありますか? 左にあれば、画像は非常に暗いことを意味します。あるいは右にあれば、非常に明るいことを意味します。あるいは中央の周りに広がっていますか?
- 個々の棒の間に規則的な隙間や空白がありますか? これは通常、画像のピクセルが非常に少なくヒストグラム全体を完全に埋められなかったか、画像が減色されたか、何らかの方法で変更されてそれらの隙間が生じたことを意味します。
本質的に、ヒストグラムは画像のよりシンプルな表現であり、そのためヒストグラムの観点で画像を変更したり調整したりするのははるかに簡単です。画像に適用するほとんどすべての数学的な色変換は、通常、画像だけでなくそのヒストグラムも変更します。これには、Level 演算子のような線形演算や、Gamma 演算子(上記参照)のような非線形演算が含まれます。上で見たマッピンググラフは、画像中のグレーレベル、ひいては画像のヒストグラムがどう変換されるかを表しています。 例えば、低コントラストの画像を作って実演してみましょう。ただし、最終的な結果は、画像を変更するだけでなく、画像のヒストグラムを(圧縮することで)変更することによってそれを行います。
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
上記の場合、"-contrast" は単純な Level 型の演算子で、画像にほんの少しだけコントラストを加えます。この結果、ヒストグラム自体がより広がり、可能な色範囲全体をよりよくカバーするようになります。また、前後のヒストグラムから、伸長が行われた方法のために、色が 'ビン' の間に隙間や穴を持つことになるのもわかります。具体的には、すべての色を 'ビン' に配置した 'ヒストグラム' を作成します。これらの 'ビン化' された色が全体として変更されるため、画像の色が一緒にグループ化されます。これは画像の色を扱う特に良い方法ではありません。 ただし、この演算子は画像の内容や色分布についての知識なしに盲目的に動作します。そのため、何らかのユーザー制御なしでは行えません。演算子は、適用されたどんな画像でも、改善するどころか悪化させてしまうことが非常に簡単に起こりうるからです。 このセクションでは、画像のヒストグラムを意思決定プロセスの一部として調べる画像処理演算子を見ていきます。それはその調査の結果を使って画像を変更し、画像の色分布のなんらかの品質を強調します。これらの演算子は処理対象の画像から来る実際の情報を利用するため、ユーザーによるチェックをあまり必要とせず、多くの画像にわたってより大域的に使えることがしばしばあります。 この種の演算子には、"[-normalize](https://imagemagick.org/command-line-options/#normalize)"、"[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)"、"[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)" のような自動的な線形 'level' 型演算子のほか、"[-equalize](https://imagemagick.org/command-line-options/#equalize)" のような非線形のもの、そして Fred Weinhaus 氏のスクリプト "redist" のように、いずれ ImageMagick に含まれるかもしれないものが含まれます。
ヒストグラム伸長
前の例のような最もシンプルな技法は、単に画像のヒストグラムを外側に伸長して色範囲を改善するものです。しかし、Level 演算のために単に盲目的に 黒点 と 白点 を選ぶ代わりに、画像のヒストグラムに基づいて点を選びます。基本的に、両端のそれぞれから内側に向かって各ヒストグラムビンの色値の数を数え上げ、あるしきい値に達するまで続けます。これらの点が、ヒストグラム(level)伸長のための 黒点 と 白点 として使われます。 図が必要 基本的に、ヒストグラムのカウントは、伸長によって黒と白に強制されるグレーレベル値を提供します。これは、純粋な黒から選ばれた 黒点 ビンに対応するグレーレベルまでのビンの範囲内に入る画像中のすべてのピクセルが、純粋な黒になることを意味します。同様に、純粋な白から 白点 ビンに対応するグレーレベルまでのビンの範囲内に入る画像中のピクセルは、純粋な白になります。 しかし、これらの点の外側にあるピクセルは、可能な色範囲の外に伸長されることになり、結果として単に範囲の限界値に設定されます。つまり、これらのピクセルは純粋な黒か純粋な白の色値という極値に変換されるため、'クリップ' '焼き付け' られます。 結果として、黒点 と 白点 を選ぶための 'しきい値' の限界が高すぎると、画像に多くの黒と白の領域が生じ、結果のヒストグラムは極端な端のビンに大きなカウント(高い棒)を持つことになります。 深刻な焼き付けの例 -- Chinese Chess 画像? 'stretch' 演算子のまとめ... -contrast-stretch と -linear-stretch はどちらも、伸長する色の位置を決めるためにヒストグラム(1024 ビンを使用)を生成します。そのため 'exact'(正確)ではありません。もう一つの違いは 'zero' の扱い方で、-linear-stretch は実際には伸長を行うために -level 演算を行う一方、-contrast-stretch は色置換の伸長にヒストグラムビン値を使います(これは 1024 の量子丸めの影響を導入します)。-normalize は内部で -contrast-stretch を使います。数学的に完璧な normalize 伸長演算子は -auto-level です。完璧な '白点のみ' または '黒点のみ' の版も可能ですが、現時点では実装されていません。
Auto-Level - 完璧な数学的 normalize
"[-auto-level](https://imagemagick.org/command-line-options/#auto-level)" は、画像を完全な量子範囲に伸長するために使う、画像中の最大値と最小値を見つけます。ヒストグラムが値の範囲を超えて伸長された結果として、値が 'クリップ' または '焼き付け' られることは決してありません。"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定が、すべてのチャンネルを '同期して' 等しく伸長するか(すべてのチャンネルにわたる最大値と最小値を使う)、個別に伸長するか(各チャンネルを別個の実体として)を決定します。 現時点では、完全に透明なピクセルの隠れた色も、レベルを決める際に使われており、透明度が関わる場合に問題を引き起こすことがあります。これはバグと見なされています。
将来: 実際には 3 つの動作モードが必要である...
'alpha'(および 'read')マスキングを伴う同期した色チャンネル。
同期したチャンネル(channel で定義されるとおり) (現在のデフォルト)
個別の独立したチャンネル (現在はユーザーが -channel を設定した場合)
これは、手動の Level 演算子とまったく同じ純粋に数学的なヒストグラム伸長です。つまり、最小値はゼロに、最大値は量子範囲に調整され、画像中の他のすべての値を調整するために線形方程式が使われます。レベルを決めるためにも、他のヒストグラム調整のためにも、他の方法が使うかもしれない 'ヒストグラムビン' やその他の '値のグループ化' を使いません。
Normalize
"[-normalize](https://imagemagick.org/command-line-options/#normalize)" 演算子は、これら 3 つの演算子の中で最もシンプルなものです。これは単に、グレースケールヒストグラムをグレー値の全ダイナミックレンジを占めるように拡大し、その際ヒストグラムの低い(黒)端で 2%、高い(白)端で 1% をクリップまたは焼き付けます。つまり、画像中の最も暗いグレーの 2% が黒になり、最も明るいグレーの 1% が白になります。これはほとんどの画像で大きな損失ではなく、全体的な結果として、画像のコントラスト(強度範囲)が自動的に最大化されます。 理想化された図がここに必要!__chinese chess を使った例? ここでは、グレースケールグラデーションを作成し、それを完全な黒白範囲に拡大します。
magick -size 150x100 gradient:gray70-gray30 gray_range.jpg
magick gray_range.jpg -normalize normalize_gray.jpg
| _JPEG の色の不正確さ(詳しくは JPEG 色の歪みを参照)やスキャン画像のノイズに関する実用的な理由から、"[-normalize](https://imagemagick.org/command-line-options/#normalize)" は最も明るい色と最も暗い色を拡大せず、それらの値より少し先まで拡大します。つまり、'2%,99%' の値を持つ "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)"(下記参照)と同等です。
これは、最高と最低の色値が非常に近接している場合、"[-normalize](https://imagemagick.org/command-line-options/#normalize)" が失敗し、何も行われないことを意味します。
正確に最も明るい色と最も暗い色値を極値まで本当に拡大したい場合は、代わりに "[-auto-level](https://imagemagick.org/command-line-options/#auto-level)" を使ってください。_
---|---
IM version 6.2.5-5 までは、"[-normalize](https://imagemagick.org/command-line-options/#normalize)" は純粋にグレースケール演算子として動作していました。つまり、赤・緑・青・アルファの各チャンネルが、"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定に従って互いに独立に拡大されていました。IM version 6.2.5-5 以降では、デフォルトの "[+channel](https://imagemagick.org/command-line-options/#channel)" 設定だけが与えられた場合、"[-normalize](https://imagemagick.org/command-line-options/#normalize)" はすべての色チャンネルを結びつけ、それらすべてを同じ量だけ normalize します。これにより、画像内のピクセルの色がずれないことが保証されます。しかし、純粋な白や黒の色のピクセルが得られないかもしれないことも意味します。 例えば、ここでは normalize テスト画像にいくつかの追加の色(青から紺へのグラデーション)を加えました。
magick -size 100x100 gradient:gray70-gray30 \
-size 50x100 gradient:blue-navy +append color_range.jpg
magick color_range.jpg -normalize normalize.jpg
最後の例からわかるように、カラー画像では "[-normalize](https://imagemagick.org/command-line-options/#normalize)" はすべてのチャンネルを一緒に最大化したため、あるチャンネルがゼロ値を持ち、別のチャンネルが最大値を持つようになります。つまり、黒のピクセルは生成されませんでした。追加されたすべての青色がすでに '赤' と '緑' チャンネルに 'ゼロ' 値を含んでいるためです。そのため、画像の下限は拡大されませんでした。 古い "[-normalize](https://imagemagick.org/command-line-options/#normalize)" の動作(IM v6.2.5-5 以前)が欲しい場合は、デフォルト以外の "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定を指定する必要があります。アルファ(またはマット)チャンネルを含まない画像では、単に 'all' チャンネル設定を使えます。 |
magick color_range.jpg -channel all -normalize normalize_all.jpg
![[IM 出力]](../static/img/color_mods/normalize_all.jpg)
あるいは、"[-separate](https://imagemagick.org/command-line-options/#separate)" 演算子(IM v6.2.9-2 以降)を使って各チャンネルを別個の画像として normalize し、その後 "[-combine](https://imagemagick.org/command-line-options/#combine)" を使ってそれらを再び単一の画像に結合することもできます。 |
magick color_range.jpg -separate -normalize -combine normalize_sep.jpg
![[IM 出力]](../static/img/color_mods/normalize_sep.jpg)
これら最後の 2 つの例では、画像のグレースケール領域が黄色くなったことがわかります。'赤' と '緑' チャンネルが明るくされた一方、'青' チャンネルはわずかに暗くされただけだからです。これは重要な点につながります。
Normalize やその他のヒストグラム演算子は実はグレースケール演算子であり、
カラー画像で使う際は注意が必要です。
実際のところ、"[-normalize](https://imagemagick.org/command-line-options/#normalize)" は、黒点 2%、白点 1% のデフォルト値を持つ、より汎用的な "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" の単なる一部にすぎません。では "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" とは何でしょうか?
contrast-stretch
"[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" 演算子(IM v6.2.6 で追加)は "[-normalize](https://imagemagick.org/command-line-options/#normalize)" に似ていますが、クリップまたは焼き付けられるピクセル数をユーザーが指定できる点が異なります。つまり、ヒストグラム伸長に使う '黒点' と '白点' の選択をある程度制御できます。そのため、ユーザーは画像中の最も暗いグレーで黒になるカウント(またはパーセントカウント)と、白になる最も明るいグレーのカウントを指定します。 例えば、これは色の上位と下位の両方の 15% をそれぞれの極値(白と黒)で置き換え、残りの 70% の色を適切に伸長します。最終的な結果は、画像の全体的なコントラストを改善しようとするものです。
magick gray_range.jpg -contrast-stretch 15% stretch_gray.jpg
上記のグラデーションの上端と下端で '焼き付け' と 'クリップ' の効果も簡単に見て取れます。これらのグレー色は色範囲の限界をはるかに超えて伸長されています。 そしてここでは、暗いグレーの 90% を意図的に '焼き付け'、最も明るいピクセルの 10% だけを画像の上部の密な線形グラデーションに伸長します。 |
magick gray_range.jpg -contrast-stretch 90%x0% stretch_black.jpg
![[IM 出力]](../static/img/color_mods/stretch_black.jpg)
これは、画像中の最も明るい 'N' 個のピクセルを見つけるのにかなり役立ちます。それらだけが値ゼロに '焼き付け' られない唯一のピクセルになるからです。(より良い方法は "[-threshold-black](https://imagemagick.org/command-line-options/#threshold-black)" を使うことです) "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" の重要な側面の一つは、黒点 と 白点 のしきい値カウントにゼロを使うことです。この場合、"-contast-stretch 0" は画像のヒストグラム中の最小と最大のビンを見つけます。カウントは実際にはこれらのビンから始まるので、結果は単に最小と最大のビンを完全な黒と完全な白に伸長することです。これにより、最小限の、あるいはおそらくゼロのクリッピングでコントラスト伸長が行われ、それらの 'ビン' のすべての値が 0 と最大値になります。
Linear-Stretch
多くの点で、"[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)" は前述の "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" 演算子と非常によく似ています。どちらの関数も、黒点と白点の引数を、生のカウントとして、または関係するピクセルの総数のパーセントとして取れます。しかし、いくつかの重要な違いがあります。 一つの違いは、デフォルトの黒点と白点がどう計算されるかに関わります。"[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" では、黒点という 1 つの値だけが与えられた場合、白点は同じ値になります。そのため "-contrast-stretch 1" は "-contrast-stretch 1x1" と同等で、"-contrast-stretch 1%" は "-contrast-stretch 1x1%" と同等です。しかし、"[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)" では、黒点という 1 つの値だけが与えられた場合、白点は補数の値になります。つまり、黒点が生のカウントとして指定された場合、白点は画像中の総ピクセル数から黒点カウントを引いたものになります。同様に、黒点がパーセントカウントとして指定された場合、白点は 100% から黒点のパーセントカウントを引いたものになります。そのため "-linear-stretch 1%" は "-linear-stretch 1x99%" と同等になります。 2 つ目の違いは、カウントがどこから始まるかに関わります。グレーレベル 0 からグレーレベル 255 まで、256 個のビン(カウントがゼロのビンもあるかもしれない)を持つヒストグラムを考えます。"[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" では、カウントは画像中の最も低い(最小)ビンと最も高い(最大)ビン(ヒストグラムのビン 0 やビン 255 にあるとは限らない)からゼロで始まります。そのため、10% の黒点は、最小ビンの後のすべてのビンから 10% に達するまでカウントを累積し、そのグレーレベルから黒側を伸長します。そのため、ヒストグラムの黒側で焼き付けられる量は、10% に加えて、その前のより暗い 'ビン' にすでにあった分の合計になります。ヒストグラムの明るい側からのカウントも同様です。"[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)" では、カウントはヒストグラムの両端、すなわちビン 0 とビン 255 から始まります。そのため、暗い側で焼き付けられる量は常に黒点の値になり、明るい側で焼き付けられる量は常に白点の値になります。 例として、100 ピクセルのグラデーションを取り、そのヒストグラムを見てみましょう。 |
magick -size 1x100 gradient: \
-depth 8 -format "%c" histogram:info:
予想どおり、すべてのビンが単一のピクセルで等しく埋められ、カウント 1 を生成します。(完全なリストを見るには上の出力テキスト画像をクリックしてください)。では、"-contrast-stretch 10x10%" を使った後で同じことをしてみましょう。
magick -size 1x100 gradient: -contrast-stretch 10x10% \
-depth 8 -format "%c" histogram:info:
そして今度は "-linear-stretch 10x10%" です。
magick -size 1x100 gradient: -linear-stretch 10x10% \
-depth 8 -format "%c" histogram:info:
そこで、"-contrast-stretch 10x10%" では各端に 11 ピクセルが得られることを確認します。つまり、端のビンのカウントに、画像ピクセルの 10%(これは 10 ピクセルに等しい)を加えたものと同等です。よって 10+1=11 ピクセルが焼き付けられます。一方、"-linear-stretch" では、端のビンは最終的に 10 ピクセル、つまり画像の 10% だけを含むことになります。 前述の違いの一つの帰結は、最も低い、または最も高い分布を持つビンが 0 と 255 の端のビンでない場合、"-contrast-stretch 0x0" が画像を変更しうるということです。この場合、画像はそれらのビンに対応するグレーレベルの間で伸長されます。一方、"-linear-stretch 0x0" は決して画像を変更しません。 例えば、グラデーションを取り、そのグレーレベルを各端で 10% 圧縮してみましょう。つまり、黒点を 10% 上のグレーレベル 26 に、白点を 10% 下のグレーレベル 230 に移動します。
magick -size 1x100 gradient: +level 10x90% \
-depth 8 -format "%c" histogram:info:
では、上記の脱コントラスト化されたグラデーションに "-contrast-stretch 0x0" を適用してみましょう。
magick -size 1x100 gradient: -level 10x90% -contrast-stretch 0x0 \
-depth 8 -format "%c" histogram:info:
そして今度は "-linear-stretch 0x0" です。
magick -size 1x100 gradient: -level 10x90% -linear-stretch 10x10% \
-depth 8 -format "%c" histogram:info:
そこで、元の画像は 0 から 255 の全ダイナミックレンジにまたがらないヒストグラムを持っていたことがわかります。それはグレーレベル 26 と 230 の間にしかありませんでした。しかし "-contrast-stretch 0x0" を適用した後、全ダイナミックレンジに伸長されました。一方、"-linear-stretch 0x0" は結果のヒストグラムに何の変更も加えませんでした。 3 つ目の違いは、"-contrast-stretch" はチャンネルに敏感である一方、"-linear-stretch" はそうでないということです。これは、"-contrast-stretch" では他のチャンネルに影響を与えることなく、任意の 1 つ以上のチャンネルを変更できることを意味します。そのため、チャンネルが指定されない場合、すべてのチャンネルからの全体的なヒストグラムが使われ、すべてのチャンネルを同じ方法で変更し、色のずれが生じないようにします。しかし、"-channel RGB" が指定された場合、各チャンネルが個別に伸長され、結果は各チャンネルの端のビンに依存します。それらが異なる場合、結果画像の個々のチャンネル間に色のずれが生じます。"-linear-stretch" では、すべてのチャンネルが共通の方法で処理されるため、チャンネル間で相対的な色のずれが生じないことが保証されます。 では、実際の画像について verbose な identify とヒストグラムを取得しましょう。
magick port.png -verbose -identify +verbose histogram:port_hist.gif
上記の画像のどのチャンネルも全ダイナミックレンジにまたがっていないことがわかります。また、各チャンネルがそれぞれ異なる値の範囲にまたがっていることにも注目してください。では、"[-channel](https://imagemagick.org/command-line-options/#channel)" 設定なしで "-contrast-stretch 1x1%" を適用してみましょう。
magick port.png -contrast-stretch 1x1% \
-write histogram:port_cs1_hist.gif port_cs1.png
上記の結果では、画像はすべてのチャンネルにわたって一貫して伸長されています。そのため、チャンネル間の色のずれはありません。では、今度は "-channel RGB" を使って同じことをしてみましょう。
magick port.png -channel RGB -contrast-stretch 1x1% \
-write histogram:port_cs1rgb_hist.gif port_cs1rgb.png
上記の結果では、デフォルトのチャンネル設定を使う代わりに "-channel RGB" を設定したため、画像は各チャンネルごとに異なる方法で伸長されています。これによりチャンネル間に色のずれが生じます。では、"-channel" 設定なしで "-linear-stretch" を適用してみましょう。
magick port.png -linear-stretch 1x1% \
-write histogram:port_ls1_hist.gif \
port_ls1.png
上記の結果では、画像はすべてのチャンネルにわたって一貫して伸長されています。そのため、チャンネル間に色のずれはありません。では、今度は "-channel RGB" を使って同じことをしてみましょう。
magick port.png -channel RGB -linear-stretch 1x1% \
-write histogram:port_ls1rgb_hist.gif port_ls1rgb.png
"-linear-stretch" を使った上記の結果では、画像はすべてのチャンネルにわたって一貫して伸長され、"-channel RGB" は無視されます。そのため、チャンネル間に色のずれはなく、結果は "-channel RGB" なしの上記のものと同一です。
ヒストグラム再分布
ヒストグラム再分布は、ヒストグラム中のビンを再分布して特定の形状を達成する非線形技法です。最も一般的な 2 つの形状は一様(フラット)とガウシアン(ベル型)ですが、双曲線型やレイリー型といった他の種類の分布も使われてきました。
Equalize - 一様なヒストグラム再分布
一様分布の場合、ヒストグラムのビンは、平均してヒストグラムが全範囲にわたってフラットまたは一定の高さになるようにシフト・配置・結合されます。これはヒストグラム均等化と呼ばれます。IM の関数 "[-equalize](https://imagemagick.org/command-line-options/#equalize)" はこれを行います。残念ながら、これはすべてのチャンネルに同じ演算を適用するのではなく、各チャンネルを個別に処理します。そのため、RGB 色空間に適用された場合、色のずれが起こりうります。 これは IM の関数 -equalize を使ったヒストグラム均等化の例です。各チャンネルを独立に均等化したことによる色バランスのずれに注目してください。
magick zelda.png -write histogram:zelda_hist.gif \
-equalize -write histogram:zelda_equal_hist.gif \
zelda_equal.png
ヒストグラムがあまり一様に見えないことに気づくかもしれません。しかし、結果画像をグレースケールに変換してそのヒストグラムを表示すると、元画像のグレースケールヒストグラムと比較してそのヒストグラムは少し一様に見えます。
magick zelda.png -colorspace gray histogram:zelda_ghist.gif
magick zelda_equal.png -colorspace gray \
histogram:zelda_equal_ghist.gif
ビンを再分布するもう一つの方法は、各チャンネルの個別の累積ヒストグラムと、望ましい積分分布曲線から生成される変換ルックアップテーブルを使うことです。チャンネル間の色のずれを望まない場合は、画像のすべてのチャンネルから結合したヒストグラムを使います。近似としては、画像をグレースケールに変換した後のヒストグラムを使うだけで済みます。Fred Weinhaus 氏は、まさにそれを行う "redist" というスクリプトを開発しました。これは画像のヒストグラムを一様分布に再分布しつつ、同じ変更をすべての色チャンネルに等しく適用します。
redist -s uniform zelda.png zelda_uniform.png
magick zelda_uniform.png histogram:zelda_uniform_hist.gif
結果が IM 組み込みの "[-equalize](https://imagemagick.org/command-line-options/#equalize)" 演算子とどう異なるかに注目してください。具体的には、前に見たような色のずれなしに、すべての色が保持されています。このスクリプトが行うのは、グレースケールヒストグラムに対して作業し、それをすべての色チャンネルに適用することで、すべての色を一緒に保つことです。IM の "[-equalize](https://imagemagick.org/command-line-options/#equalize)" のヒストグラムと比較するため、ここでもグレースケールヒストグラムの結果を示しましょう。再分布されたヒストグラムが、IM の equalize のものより少し均された(フラット、つまり一様な)状態に見えることに注目してください。
magick zelda.png -colorspace gray histogram:zelda_ghist.gif
magick zelda_uniform.png -colorspace gray \
histogram:zelda_uniform_ghist.gif
将来: 他の色空間での均等化の例を追加する! つまり、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
結果のグレースケールヒストグラムから、画像がその色がガウシアンのベル曲線型の分布に従うように変更されていることがわかります。写真の場合、これはより '自然' に見える結果を生み出します。画像はコントラストが最適化されているだけでなく、明度も調整され、画像中のほとんどのピクセルが約 60% のグレースケール明度を持つようになります。
ヒストグラム再分布の方法論
では、この種の直接的なヒストグラム調整はどう機能するのでしょうか? 基本的に、現在の画像のヒストグラムと、望ましい分布のヒストグラムを計算します。次に、各 'ビン' のグレーレベル値を、ビンのカウントが望ましい分布に最もよく従うようにどう変更する必要があるかを計算します。一部のビンはより暗くシフトされ、他のビンはより明るくシフトされるかもしれません。これは実はかなり込み入ったプロセスなので、ステップごとに見ていきましょう。
まず、ヒストグラムのグラフィック画像ではなく、ImageMagick から実際のヒストグラムデータを取得する必要があります。データはすべての色値をグレースケールに結合したものであることに注意してください。これは、すべてのチャンネルを一緒に分布させ、画像の全体的な明度を望ましい曲線に従うように調整するために行われます。
magick zelda.png -colorspace gray \
-depth 8 -format "%c" histogram:info:- |\
tr -cs '0-9\012' ' ' |\
awk '# ヒストグラムデータを収集する。
{ bin[$2] += $1; }
END { for ( i=0; i<256; i++ ) {
print bin[i]+0;
}
} ' > zelda_hist_data.txt
# いずれかのヒストグラム 'ビン' の最大カウントを取得する
max_count=`sort -n zelda_hist_data.txt | tail -n 1`
# ヒストグラムをデータのプロファイルグラフに変換する
echo "P2 256 1 $max_count" | cat - zelda_hist_data.txt |\
im_profile -s - zelda_hist_graph.gif
データを収集するために、IM がまさにこの目的のために含めているヒストグラム画像の 'comment' メタデータを取得します。データはその後、生の数値だけを残すようにクリーンアップされます('translate' の略である "tr" というプログラムを使用)。この生データは次に、"awk" という別のユーティリティプログラムに渡され、各ビンの実際のヒストグラムカウントを収集するために使われます。結果を見られるように、ヒストグラムカウントを(NetPBM, PGM テキストグレースケール画像ファイル形式を介して)グラデーション画像に処理し、"[im_profile](../static/img/scripts/im_profile)" スクリプトを使って折れ線グラフとして表示します。本質的に、これは数値データファイルから直接ヒストグラム画像を生成する別の方法にすぎません。 ヒストグラムデータをテキストファイルに取得したので、再分布されたデータが一致してほしい関数のヒストグラムも必要です。この場合、それは平均値 153(60% グレー)とシグマ幅 60 のガウシアン分布です。両方の値は、ヒストグラムの 256 範囲のビンに換算したものです。
awk '# ガウシアン分布グラフを生成する AWK
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
# ガウシアンデータをプロファイルグラフに変換する
echo "P2 256 1 65535" | cat - gaussian_hist_data.txt |\
im_profile -s -b - gaussian_hist_graph.gif
上記のヒストグラムは興味深く、画像の元のヒストグラム分布とヒストグラムの望ましい状態を反映しています。しかし、変換の目的には、この形のヒストグラムは、理解するには良くても、私たちの目的にはあまり有用ではありません。実際、本当に必要なのは累積ヒストグラムです。これらのヒストグラムは通常のヒストグラムと非常によく似ていますが、ヒストグラム中の各 'ビン' が、そのビンに加えて、0 から始まるそれより前のすべての 'ビン' のカウントである点が異なります。つまり、各 'ビン' はそれより暗いすべての 'ビン' の '累積' またはカウントです。これらは実は元画像から直接生成する方が簡単です。そこで、このプロセスを繰り返しますが、'累積' カウントを計算して保存します。
magick zelda.png -colorspace gray \
-depth 8 -format "%c" histogram:info:- |\
tr -cs '0-9\012' ' ' |\
awk '# 画像の累積ヒストグラムを収集する
{ 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
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 出力]](../static/img/color_mods/zelda_cumhist_graph.gif)
画像の累積
ヒストグラム | ![[IM 出力]](../static/img/color_mods/gaussian_cumhist_graph.gif)
ガウシアンの累積
ヒストグラム
---|---
さて、今行う必要があるのは、画像の累積ヒストグラムをガウシアンの累積ヒストグラムに変換することです。これを行うために、入力画像の各グレー値を使ってその '正規化' された累積値を見つけます。これを次にガウシアン分布の同じ累積値にマッピングし、それに対応するグレー値を見つけます。この図でマッピングプロセスがより明確になるはずです...
![[図]](../static/img/img_diagrams/redist_working.jpg)
次のコマンドは、画像のヒストグラムを再分布するのに必要な新しい値に元画像の色値をマッピングするために使える、カラールックアップテーブル(CLUT)を生成するために、可能なすべての 8 ビット色値に対してルックアップを行います。
# ヒストグラムを再分布するための CLUT を生成する
paste zelda_cumhist_data.txt gaussian_cumhist_data.txt |\
awk '# ガウシアン分布グラフを生成する AWK
{ bin[NR] = $1; gas[NR] = $2; }
END { k=0; # この値より小さいピクセルの数
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
ご覧のとおり、画像のヒストグラムをガウシアンのベル曲線のような特定の分布関数に従わせようと変換することは、かなり込み入った非常に数値的なプロセスです。これがすべて 1 つのかなり長く複雑なコマンドにまとまったものです...
magick zelda.png -colorspace gray \
-depth 8 -format "%c" histogram:info:- |\
tr -cs '0-9\012' ' ' |\
awk '# ガウシアン分布グラフを生成する AWK
{ # 画像ヒストグラムを 'bin' テーブルに読み込むだけ
bin[$2] += $1;
}
END { # ガウシアンヒストグラムを生成する
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);
}
# 通常のヒストグラムを累積ヒストグラムに変換する
for ( i=0; i<256; i++ ) {
gas[i] += gas[i-1];
bin[i] += bin[i-1];
}
# 再分布されたヒストグラムを生成する
k=0; # この値より小さいピクセルの数
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
上記の技法についての最後の言葉をいくつか。
- Fred Weinhaus 氏の "
[redist](http://www.fmwconcepts.com/imagemagick/redist/)" スクリプトを高速化するために計算を "awk" で行うことは、Anthony Thyssen 氏によって提案・貢献されました。 - 上記の再分布技法を '一様' または '均等化' された分布を生成するために適用するには、関数のヒストグラムは単純に定数になります。これは順に、単に式
y = x、つまり単なる対角の直線である積分分布をもたらします。同じ変換技法を適用すると、入力画像の累積ヒストグラムと同一であることがわかる CLUT 画像になります。言い換えれば、ヒストグラムの均等化のためには、単に画像の累積ヒストグラムを CLUT に変換し、それを画像に直接適用すればよいのです。 - ImageMagick を含むほとんどの画像処理パッケージは、現時点では、中間の CLUT を生成する代わりに、変換式を画像自体の値に直接適用します。しかし、ヒストグラム、ひいては累積ヒストグラムはサイズに限りがある(典型的には 256 の 'ビン')ため、プロセス中に画像の色値が丸められて深刻な誤差につながりかねません。しかし ImageMagick では、(それらと同じ丸め誤差を含む)中間の CLUT を生成し、その後、準備された CLUT を通して元の丸められていない画像値を、値の線形補間を使って変換します。この補間の結果として、新しい画像の色値はより正確になります。処理中に丸められたり 'ビン化' されたりしていないからです。
うまくいけば上記はいずれ ImageMagick に組み込まれるでしょう。それまでの間、その作業を行うために Fred Weinhaus 氏の "redist" スクリプトが利用できます。Fred 氏の "retinex" スクリプトにも興味があるかもしれません。これは、この技法のように大域的にではなく、画像の局所的な領域で、画像に同様の自動的な強調を行おうとするものです。
DIY レベル調整
数式による線形ヒストグラム調整
上で示したさまざまな基本的な形の レベル調整は、画像の色を線形に調整します。これらの変更は数学的に適用することもできます。例えば、画像を特定の色で乗算することで、すべての純粋な白の領域をその色に設定します。そこで、画像を読み込み、欲しい色を含む画像を作成し、IM の自由形式の "[-fx](https://imagemagick.org/command-line-options/#fx)" すなわち DIY 演算子を使って元画像をこの色で乗算してみましょう。
magick test.png -size 1x1 xc:Yellow \
-fx 'u*v.p{0,0}' fx_linear_white.png
"[-fx](https://imagemagick.org/command-line-options/#fx)" に 2 番目の 'v' 画像から色を読ませることで、数式で使うために色を RGB 値に変換する必要なく、色を簡単に変更できます。 "[Gimp](http://www.gimp.org/)" や "[Photoshop](http://www.adobe.com/products/photoshopfamily.html)" のような派手なグラフィカル画像処理パッケージを使っていれば、上記の演算は画像の色ヒストグラムグラフの 'カーブ' を調整することで画像に適用されていたでしょう。
例えば右にあるのは、3 つの RGB チャンネルのうちの 1 つだけに何が起こるかを示す数式の "[gnuplot](http://www.gnuplot.info/)" 生成グラフ(スクリプト "[**im_histogram**](../static/img/scripts/im_histogram)" を参照)です。元の色(緑の線)は、線形により暗い色(赤の線)に再マッピングされています。 黒い色を線形に着色するのもかなり簡単です。例えば、'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
参考までに、再マッピング式の "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
上記の "-size 1x2 gradient:color1-color2" は、"[-fx](https://imagemagick.org/command-line-options/#fx)" 式が参照するための 2 色ピクセル画像を生成するためだけに使われています。最初の色は白を置き換え、2 番目の色は黒を置き換え、その他はすべて白と黒の間で補間されます。グレースケール演算子の典型として、各 RGB チャンネルは別個のグレースケールチャンネルとして扱われますが、線形補間は各チャンネルごとに異なります。 これはちなみに、色によるレベル調整演算子 "[+level-colors](https://imagemagick.org/command-line-options/#level-colors)" とまったく同等です。ただし "[+level-colors](https://imagemagick.org/command-line-options/#colors)" とは異なり、使う色はもちろん任意の画像ソースから来ることができ、引数として与えられる色名だけに限りません。とはいえ、色名の直接使用ももちろん可能です。 |
magick test.png -fx "yellow*u+green*(1-u)" fx_linear.png
数式による非線形ヒストグラム調整
線形の色調整は重要であり、より高速な方法も利用できますが、線形の 'level' 調整が望ましいものでない状況も多くあり、ここで "[-fx](https://imagemagick.org/command-line-options/#fx)" DIY 演算子がより有用になります。線形調整の別の式は "-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
より実践的な例として、Adelmo Gomes 氏は、開発していた自動気象図再着色スクリプトのための色調整を必要としていました。この場合、彼は画像の純粋な黒い部分を .25 の青に着色しつつ、グレースケールの残り、特に画像の白と中間調のグレーは触れたくありませんでした。青色だけがそのような調整を必要とし、彼は現在それを画像エディタで手作業で行っていました。 例えば、'u^2' のような二次式を使って、ヒストグラムの黒い端を '.25' の青色に着色できます。青チャンネルだけを変更すればよいので、値は式に直接挿入されました。
magick test.png -channel B -fx '.25+(1-.25)*u^2' fx_quadratic.png
しかし、これは妥当な結果を生成する一方、中間調のグレーをわずかに暗くし、不健康な黄ばんだ色を生み出します。これを避けるために、着色プロセスをより良く制御する '指数' 関数を代わりに使えます。
magick test.png -channel B -fx '.3*exp(-u*4.9)+u' fx_expotential.png
ここでもグラフは、黒に独特の暗い青の色合いを与えるために青チャンネルがどう変更されたかを示しています。2 番目の値('4.9')は、線形の '+u' グラフへの減衰です。この値が小さいほど減衰が遅く、調整がより線形になります。値が大きいほど、'減衰' がより劇的になります。値は異なる色値に対して調整する必要があるかもしれないので、これは一般的な黒い色の着色のための良い汎用式ではありませんが、気象図の着色には完璧です。 一般に、欲しい色調整を数学的に表現できれば、"[-fx](https://imagemagick.org/command-line-options/#fx)" 演算子を使って望む結果を達成できます。
'カーブ' 調整
通常、グラフィカルな写真エディタでは、左に示したようなヒストグラムの 'カーブ' チャートが提示されます。ユーザーは次に、4 つ(またはそれ以上)の制御点を移動して 'カーブ' を編集でき、ヒストグラム調整関数はそれらの点に従います。制御点は一般に、最初のグレースケールレベルが調整後に 2 番目のグレースケールレベルになることを指定します。そのため、0.0,0.2 のような点は基本的に、0% グレー(黒)が調整後に 20% グレーレベルになるべきだということを意味します。 さて、IM は 'カーブ' 調整を生成するために 'control points' を直接指定することを許しません。それが望むのは、その 'カーブ' の数式が生成されることです。幸運なことに、"[gnuplot](http://www.go.dlr.de/pdinfo_dv/gnuplot.html)"、"[fudgit](http://www.go.dlr.de/pdinfo_dv/fudgit.html)"、"mathematica"、"[matlab](http://www.mathworks.com/)"、そしてさらに多くの数学ソフトウェアパッケージを含め、制御点からその曲線の数式を生成できるプログラムがあります。 以下は、ほとんどの Linux ディストリビューションや Windows にインストールできる標準的な追加パッケージである "gnuplot" を使って、4 つの制御点から数式を生成するために使える一つの方法です。
( 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
| ![[データ]](../static/img/color_mods/fx_control.txt.gif)
| _なお、曲線フィッティングに必要なパラメータの数(上記の '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 出力]](../static/img/color_mods/fx_funct_curve.png)
ユーザーが制御点をヒストグラム調整関数に変換しやすくするために、私は "gnuplot" を呼び出し、与えられた制御点からより見栄えの良い多項式方程式を出力する "[**im_fx_curves**](../static/img/scripts/im_fx_curves)" というシェルスクリプトを作成しました。Gabe Schaffer 氏も、同じことを行う perl 版(ダウンロードした "Math::Polynomial" ライブラリモジュールを使用)"[**im_fx_curves.pl**](../static/img/scripts/im_fx_curves.pl)" を提供しました。どちらのスクリプトも使えます。 例えば、これは 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]](../static/img/color_mods/fx_curve.txt.gif)
しかし、FX 関数は非常に遅いです。ただし IM 6.4.8-9 以降では、フィッティングした多項式表現の発見された係数を、多項式関数メソッドに直接渡せるようになりました。"[**im_fx_curves**](../static/img/scripts/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]](../static/img/color_mods/coefficients.txt.gif)
例えば、それらのカーブをテスト画像に適用してみましょう... |
magick test.png -function Polynomial `cat coefficients.txt` test_curves.png
![[IM 出力]](../static/img/color_mods/test_curves.png)
このメソッドのより実践的な例は、上級編の"Aqua" 効果の例で詳述されています。'カーブ' を生成する別の方法は、IM フォーラムの議論 Arbitrary tonal reproduction curves で検討されています。
画像の着色
画像を均一に色で着色する
通常、画像の着色は、画像をある色である程度ブレンドすることで達成されます。これは Evaluate 演算子や画像のブレンド技法を使って行えますが、これらは使うのが簡単ではありません。幸運なことに、"[-colorize](https://imagemagick.org/command-line-options/#colorize)" 画像演算子を使うことで、均一な色を画像ににじませるよりシンプルな方法が利用できます。この演算子は、現在の "[-fill](https://imagemagick.org/command-line-options/#fill)" 色を、現在の画像シーケンス中のすべての画像にブレンドします。元画像のアルファチャンネルは保持され、色チャンネルだけが変更されます。 例えば、画像(グレースケールでもそうでなくても)を明るくするには、"[-colorize](https://imagemagick.org/command-line-options/#colorize)" を使って画像にある程度の白をブレンドし、画像を完全に飽和させることなく明るくします。
magick test.png -fill white -colorize 50% colorize_lighten.png
同様に、'black' の塗り色を使って画像を暗くできます。
magick test.png -fill black -colorize 50% colorize_darken.png
画像の両端を中間調に向かって灰色にするには、特定のグレーの塗り色を使います。色 'gray50' は RGB 色スペクトルのちょうど中央の色です。
magick test.png -fill gray50 -colorize 40% colorize_grayer.png
これは、逆方向レベル調整演算子が提供するような '脱コントラスト' の方法としてもしばしば使われますが、制御は劣ります。 "[-colorize](https://imagemagick.org/command-line-options/#colorize)" 演算子は、3 つの色チャンネルそれぞれに対して個別に溶解パーセンテージを指定することも許します。これは、特別な方法で画像を線形に暗く(または明るく)するのに役立ちます。 |
IM v6.7.9 以前は、"[-colorize](https://imagemagick.org/command-line-options/#colorize)" 演算子はアルファチャンネルをまったく変更しませんでした。そのバージョン以降は、上で見たとおり、完全に透明なピクセルを含むすべてのピクセルを均一に着色するようになりました。 |
|---|---|
"[-colorize](https://imagemagick.org/command-line-options/#colorize)" 演算子の一般的な用途の一つは、既存の画像のすべての色を単に置き換え('100%' で着色)つつ、画像の透明度(アルファ)形状を保持して、色付きのマスクを生成することです。しかし IM v6.7.9 以降では、この演算子からアルファチャンネルを保護するために、アルファチャンネルを無効にしてから再び有効にする必要があります。(詳しくは Alpha On を参照)。例えば... |
magick test.png -alpha off \
-fill blue -colorize 100% \
-alpha on colorize_shape.png
![[IM 出力]](../static/img/color_mods/colorize_shape.png)
この保護がなければ、colorize はキャンバスを与えられた色で完全に塗りつぶしていたでしょう... |
magick test.png -fill blue -colorize 100% colorize_blank.png
![[IM 出力]](../static/img/color_mods/colorize_blank.png)
ただし、IM v6.7.9 より古いバージョンの IM を使う可能性がある場合は、結果画像が期待どおりの完全に空白の画像になることを保証するために、上記に "-alpha opaque" または "-alpha off" 演算を含めることをお勧めします。 なお、色の範囲ではなく単一の色で色によるレベル調整演算子を使うことで、より高速にキャンバスを空白にできます。空白のキャンバスも参照してください。
中間調の色付け
Colorize 演算子が "[-fill](https://imagemagick.org/command-line-options/#fill)" 色を適用して画像中のすべての色を線形に着色するのに対し、"[-tint](https://imagemagick.org/command-line-options/#tint)" 演算子は "[-fill](https://imagemagick.org/command-line-options/#fill)" 色を、画像の中間調の色だけを着色するように適用します。この演算子はグレースケール演算子で、色は与えられたパーセンテージ(0 から 200)によって緩和または強調されます。その効果を制限するため、白と黒には影響を与えず、各色チャンネルの中間調の色に最大の効果を持つように、数式を使って調整されます。"-tint 100" は本質的に、完全なグレー色を着色して塗り色の半分の強度になるようにします。より低い値はより暗い色に着色し、より高い値はその色の完璧な一致に向かって着色します。
magick test.png -fill red -tint 40 tint_red.png
テスト画像の緑色は真の RGB の緑ではなく、Scaled Vector Graphics の 'green' で、これは真の緑色の半分の明るさしかありません。そのため、これも中間調の色であり、"[-tint](https://imagemagick.org/command-line-options/#tint)" 演算子の影響を受け、テスト画像の赤と青の色のスポットとは異なり、より暗くなります。 また、パーセンテージのカンマ区切りリストを使って、個々の色成分を着色することもできます。例えば "-tint 30,40,20,10" です。しかし、これは使うのが難しく、正しく設定するには多少の実験が必要かもしれません。完璧な 50% グレーに対して欲しい色を指定する方が良いです。 | _
"[-tint](https://imagemagick.org/command-line-options/#tint)" 演算子は、与えられた色とパーセンテージを何らかの方法で取り、次の式に従って "[-fill](https://imagemagick.org/command-line-options/#fill)" 色の強度に応じて画像中の個々の色を調整することで動作します。(右のグラフを参照)
_ f(x)=(1-(4.0*((x-0.5)*(x-0.5)))) _二次関数で、その結果が画像中の既存の色のベクトルとして使われます。ご覧のとおり、純粋な中間グレーに対しては色の完全な置換を与え、白にも黒にも調整を加えません。
この種のことを DIY するために使える、より低レベルの演算子については、FX 演算子、および Evaluate と Function 演算子を参照してください。
_
---|---
tint 演算子は、"[-shade](https://imagemagick.org/command-line-options/#shade)"(Shade オーバーレイハイライト画像を参照)の出力の結果を調整するのに完璧です。例えば 3d 弾丸画像の例のようなものです。 "[-tint](https://imagemagick.org/command-line-options/#tint)" を使って画像の中間調の色を明るくしたり暗くしたりすることもできます。これは画像の 'ガンマ調整' のようなものですが、正確には違います。例えば、'white' 色で 100 より大きい tint 値を使うと、中間調を明るくします。
magick test.png -fill white -tint 130 tint_lighter.png
一方、100 より小さい値は色を暗くします。
magick test.png -fill white -tint 70 tint_darker.png
| _現時点では、純粋な中間調のグレー色は "[-fill](https://imagemagick.org/command-line-options/#fill)" 色にマッピングされません。
パーセンテージの引数は 'ブレンドパーセンテージ' ではなく、実際にはむしろ '明度パーセンテージ' です。例えば 'black' の塗り色に対してはまったく機能しません。
なぜこのように設計されたのか、その背景の歴史は知りません。しかしこれは、グレースケール画像を着色する際の最終的な色の正確な制御を非常に厄介なものにします。
下記のオーバーレイ合成による着色を使えば、中間調のグレーに対してより正確な(ただし放物線的というより非常に線形な)色の着色が得られます。
セピア調の着色
特別な写真の再着色技法 "[-sepia-tone](https://imagemagick.org/command-line-options/#sepia-tone)" は、基本的に画像をグレースケールに変換し、すべての中間調を特別な茶色に着色することからなります。 |
magick rose: -sepia-tone 65% sepia-tone.jpg
![[IM 出力]](../static/img/color_mods/sepia-tone.jpg)
与えられる引数は、セピア調の色に最も近くなるグレースケールの '中間点' で、色 'Goldenrod' に似ています。これの最も一般的な用途は、'古く見える' 写真を生成するためにデュオトーン効果を生成することです(セピア調についての Wikipedia を参照)。 例えば、ここではコントラストを強調したグレースケールの rose 画像を、さまざまな色を使って着色(Tint)し、同様のセピア調のような効果を達成します。どの色を使うべきかは、求めている正確な効果によります。
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
私自身は、セピア調の画像を元画像と混合またはブレンドしてその効果を弱めることでも、より良い '色あせた' 効果が生み出せると思います。 |
magick rose: \( +clone -sepia-tone 60% \) -evaluate-sequence mean sepia-tone_blended.jpg
![[IM 出力]](../static/img/color_mods/sepia-tone_blended.jpg)
上の最後の例のような、より複雑な色変化のバリエーションを保存できる方法については、Hald カラールックアップテーブルも参照してください。
デュオトーン効果
'デュオトーン' は、限られた予算や印刷機材で、画像のグレースケール(黒インク)を他の色と混ぜてより良い結果を生み出す印刷方法です。例えば、今日見る古い写真がすべてセピア調の見た目をしている理由は、セピア調のインクが生き残り、時間とともに劣化したり色あせたりしなかったからです。他の '白黒' 画像形式は色あせて使い物にならなくなりました。上記のセピア調演算子を参照してください。'Cyanotype'(より一般的には 'blue-prints' として知られる)という別のデュオトーン技法は、元の白黒の建築図面の大規模な複製を作る方法として広く使われるようになりました。この技法はレーザー、ひいてはそれによるコピー(とゼロックス)の発明よりずっと前に使われていたことを思い出してください。詳しくは Duotone の Wikipedia エントリ、また Fake duotones vs Real duotones を参照してください。 しかし上記の Tint 演算子は、上のセピア調のような効果と同様に、デュオトーン効果の妥当な複製を生み出します。
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
なお、私は一般に 'デュオトーン' 色のより暗いバージョンを選びましたが、Tint 演算子の引数を使ってこれを調整することもできます。明度とコントラストは、シグモイドコントラスト演算子の引数を使って調整することもできます。 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
上記の利点は、中間点の色を正確に制御できることです(正確でない Tint とは異なり)。上の例のように、好きな 3 つの色を直接使うことも、3 つ(またはそれ以上)の制御点の間の色をより細かく制御するために色を拡大したグラデーションを使うこともできます。この技法はまた、特定のデュオトーン効果を、繰り返しおよび将来の使用のために、非常にコンパクトに保存する方法を提供します。 グレースケール画像の着色を超える、より複雑な色変化を保存する方法については、Hald カラールックアップテーブルも参照してください。
色の着色、DIY
"[-tint](https://imagemagick.org/command-line-options/#tint)" の最大の問題の一つは、それがグレースケール(またはベクトル)演算子であることです。つまり、赤・緑・青の各チャンネルを互いに完全に別個に扱います。これは順に、'blue' や 'yellow' のような原色や 2 次色は、すべてのグレーレベルが影響を受けるにもかかわらず、"[-tint](https://imagemagick.org/command-line-options/#tint)" の影響を受けないことを意味します。 しかし、FX 演算子やより高速な Evaluate と Function 演算子のようなさまざまなチャンネルの数学的変換のおかげで、画像を変更するための独自の色オーバーレイを生成できます。つまり、Colorize 演算子が行うのと同様の方法で画像を着色(Tint)できます。 例えば、ここでは画像のグレースケール明度レベルを、欲しい特定の色の半透明オーバーレイに変換します。 |
magick test.png \( +clone -colorspace gray \
-function polynomial -4,4,0 -background Gold -alpha shape \) \
-composite tint_diy_compose.png
![[IM 出力]](../static/img/color_mods/tint_diy_compose.png)
警告: これは画像の透明度を正しく保持しませんが、完全に不透明な画像では問題なく機能します。なお、tint とは異なり、色はベクトルの加算ではなくアルファ合成として扱われるため、'black' を含む任意の色が使えます。結果は通常の tint で得られるものとはまったく同じではありません。
着色オーバーレイ
特別なアルファ合成メソッド '[Overlay](compose.html#overlay)' と '[Hardlight](compose.html#hardlight)' は、実は色(とパターン)の着色を念頭に置いて設計されました。これらの合成メソッドも、中間調のグレーを置き換え、画像中の黒と白のハイライトはそのまま残します。 例えば、ここでは色付きのオーバーレイ画像を素早く生成し、それを合成して元画像を着色します。 |
magick test.png \( +clone -alpha off -fill gold -colorize 100% \) \
-compose overlay -composite tint_overlay.png
![[IM 出力]](../static/img/color_mods/tint_overlay.png)
ご覧のとおり、アルファ合成は元画像の透明度を保持しないため、この問題を修正するには 2 つ目のアルファ合成演算を使う必要があります。 |
magick test.png \
\( +clone -alpha off -fill gold -colorize 100% \
+clone +swap -compose overlay -composite \) \
-compose SrcIn -composite tint_overlay_fixed.png
![[IM 出力]](../static/img/color_mods/tint_overlay_fixed.png)
'[Overlay](compose.html#overlay)' を使うことは、上で使った二次関数よりもはるかに線形な形の着色で、"[-tint](https://imagemagick.org/command-line-options/#tint)" と同様に画像の各チャンネルに別個に適用されるため、原色と 2 次色も変化しないままになります。また、このアルファ合成メソッドでは調整制御が提供されないので、着色のレベルを制御したい場合は、tint を適用する前にオーバーレイ画像の透明度を調整する必要があります。 もちろん、これまで示した他の着色方法とは異なり、単純な色の着色に限定されず、画像やタイルパターンを使った着色を適用できます。 |
magick test.png \
\( -size 150x100 tile:tile_disks.jpg \
+clone +swap -compose overlay -composite \) \
-compose SrcIn -composite tint_overlay_pattern.png
![[IM 出力]](../static/img/color_mods/tint_overlay_pattern.png)
しかし、これは基本的な色の扱いの範囲を超えてきているので、画像の着色についてはここまでにします。 | _アルファ合成メソッド '[HardLight](compose.html#hardlight)' は、'[Overlay](compose.html#overlay)' と同じ結果を生み出しますが、ソース画像とデスティネーション画像が入れ替わります。
これは、最後のいくつかの例の "+swap" の代わりに使えたでしょう。_
---|---
大域的な色の変更
明度・彩度・色相の Modulate
"[-modulate](https://imagemagick.org/command-line-options/#modulate)" 演算子は、特別な HSL(色相・彩度・明度)色空間で画像を変更するという点で特別です。各色ピクセルをこの色空間に変換して変更し、元の色空間に戻します。これは 3 つの値(ただし後の値は省略可能)をパーセンテージとして取り、100 で画像に変更を加えません。例えば... |
magick rose: -modulate 100,100,100 mod_noop.gif
![[IM 出力]](../static/img/color_mods/mod_noop.gif)
最初の値 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
明度の引数 '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
彩度 '0' は、上記のカラーからグレースケールへの変換でも示したとおり、グレースケール画像を生成します。ただし、このグレーは HSL 色空間で定義されるとおり 3 つの色チャンネルすべてを等しく混合するため、真の 'intensity'(強度)グレースケールは生成しません。本質的に、小さな値はより 'パステル' な色を生成し、'100' より大きい値はより漫画のようなカラフルな画像を生成します。 なお、brightness と saturation はパーセンテージの乗数なので、ほとんどすべての画像の色値を最大値近くに変えるには、非常に大きな数で乗算する必要があります。つまり、純粋な黒を除くすべての色を白にするには、100 万に近い brightness 係数を使う必要があります。
色相の Modulate
最後の値 Hue(色相)は、実ははるかに有用です。これは画像の色を循環的に回転させます。これを達成するために、与えられた Hue の値は乗算ではなく 'モジュラス加算' を生成します。ただし、色相はパーセンテージで回転され、角度では回転されないことに注意してください。これは奇妙に思えるかもしれませんが、"[-modulate](https://imagemagick.org/command-line-options/#modulate)" は常にそのようになっています。角度と modulate の引数の間の変換式は次のとおりです...
_色相角度_ = ( _modulate_arg - 100_ ) * 180/100
_modulate_arg_ = ( _色相角度 * 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
0
(赤 <-> シアン) |
33.3
(赤 -> 青) |
66.6 |
100%
no-op |
133.3 |
166.6
(赤 -> 緑) |
200
(0 と同じ)
---|---|---|---|---|---|---
ご覧のとおり、'33.3' の値は、すべての色をおよそ 60 度、負方向、つまり反時計回りに回転させ、実質的に赤を青に、青を緑に、緑を赤にマッピングします。'0' または '200' の値を使うと、画像の明度を反転することなく、色を完全に 180 度反転します。 色相は循環的であることに注意してください。そのため、'300' の値を使うと 360 度の色の回転を生成し、結果として画像に変更を加えません。 画像中の色を変更するために '色相の Modulate' を使う例については、クロマキーマスキングや地図上のピンを参照してください。
これらの種類の演算やそれ以上のことは、下記の Recolor Matrix 演算子で使われるような、高度な色空間技法を使っても適用できますが、画像の基本的な 'modulate' には、この演算子が物事を大幅に簡素化します。原色の入れ替えには、Recolor Matrix 演算子、またはチャンネルの入れ替え(Separate/Combine 演算子を参照)の方がおそらくより正確な技法です。ただし汎用性ははるかに劣ります。 色変化のバリエーション、特に色相の変化を後で再利用するために保存できる方法については、Hald カラールックアップテーブルも参照してください。
Modulate DIY
本当に望むなら "Do It Yourself"(自分でやる)こともできます。基本的に、画像を適切な色空間に変換し、値を変更し、戻します。HSL 色空間では、緑チャンネルが彩度値を保持し、青チャンネルが輝度値を保持することを思い出してください。例えば、これはデフォルトの HSL 色空間を使った "-modulate 80,120"(わずかに暗くし、色の彩度を増やす)と同等です...
magick rose: -colorspace HSL \
-channel B -evaluate multiply 0.80 \
-channel G -evaluate multiply 1.20 \
+channel -colorspace sRGB modulate_channel.png
もちろん、この方法を使って色相(赤チャンネル)を変更する場合は、最終的な値が最大値や最小値(どちらも '赤' の色相)で単純にクリップされるのではなく、'ラップアラウンド'(モジュラス)することを保証する必要があります。そのため、色相の変更には Modulate 演算子を直接使う方がおそらく簡単です。
他の色空間での Modulate
"[-modulate](https://imagemagick.org/command-line-options/#modulate)" の最大の問題は、多くの 'ほぼ白' の色を含む画像を扱うときです。これは HSL 色空間で作業を行うため、明度が下げられると、オフホワイトの色がより '彩度' が高くなります。これは上の rose 画像の白い葉で見られ、50% の暗化で多くの色のアーティファクトを示しています。これは特に JPEG 画像形式を扱う際の問題で、その不可逆圧縮アルゴリズムのためにオフホワイトの色を生成しがちです(実際、JPEG ではすべての色が一般にわずかにずれています)。例えば...
magick wedding_party_sm.jpg -modulate 85 modulate_off-white.png
ここでの問題は、HSL では、すべてのオフホワイトの色が、使われる色空間(二重円錐)の小さな '白点' 領域に詰め込まれていることです。明度が下げられると、円錐が広がるにつれてオフホワイトの色が拡大され、オフホワイトの色がよりカラフルな(彩度の高い)オフホワイトの色のセットを生成します。つまり、色の小さな変動が誇張されます。 これの解決策は、HSL 色空間ではなく HSB 色空間で "[-modulate](https://imagemagick.org/command-line-options/#modulate)" することです。 | _HSB の 'B' は Brightness(明度)を意味しますが、'V' を Value(値)の意味で使う HSV としても一般に知られています。それらは同じ色空間ですが、'V' は紛らわしい用語です。value は通常 '保存された数値' を意味するからです。
HSI 色空間(Intensity の 'I' を使用)もありますが、これは一般的ではなく、HCL('L' は Luminance を意味する)循環色空間の追加(下記参照)のために必要ありません。
_
---|---
HSB 色空間では、'白' は単一の点ではなく大きな 'ディスク' であり、そのためオフホワイトは互いに '近く' ありません。そのため、明度を下げると、オフホワイトは等しく収縮し、わずかな色の変動を拡大するのではなく減らします。そのため、白は単にグレーになり、よりカラフルにはなりません。 画像を HSB 色空間で modulate するには、その色空間で DIY 技法(上記参照)を使うか、IM v6.5.3-7 以降では、'Hue' 色空間の一つで 'modulate:colorspace' の操作制御を定義できます。 |
magick wedding_party_sm.jpg \
-define modulate:colorspace=HSB -modulate 85 \
modulate_HSB.png
![[IM 出力]](../static/img/color_mods/modulate_HSB.png)
他の 'Hue' 色空間は HWB と HCL です(次のセクションを参照)。 もちろん、画像をこの小さなサイズにリサイズしたなら、さらに良い解決策は、オフホワイトの値の原因であった JPEG に画像を保存しないことです。さらに良いのは、すべての色値を最良のメモリ内品質設定で保てるように、作業が終わるまで画像をまったく保存しないことです。 HSB 色空間が modulate のデフォルトで使われない理由は、この色空間で画像を明るくすると、画像がより鮮やかで白くなるのではなく、色がより彩度が高く濃くなるからです。例えば、ここに比較のための、デフォルトの HSL と指定された HSB 色空間での 'rose' 画像の 150% 明化があります。
magick rose: -modulate 150 mod_bright_HSL.gif
magick rose: -define modulate:colorspace=HSB \
-modulate 150 mod_bright_HSB.gif
| _IM v6.4.0-10 以前は、"[-modulate](https://imagemagick.org/command-line-options/#modulate)" 演算子は実際には HSL 色空間ではなく HSB 色空間を使っていました。これは上記の状況についてのユーザーからのバグ報告のために変更されました。
要点は、ある画像では HSL を使うとひどい結果になり、他の画像では HSB 色空間を使うとひどい結果になるということです。何をしようとしているかによるのです!
LCHab その他の色空間での Modulate
(HSL または HSB 色空間での)色相の modulate は、実はかなり粗いものと見なされています。これらの色空間は、色のより現実的な強度を考慮しません。そのため、色相 '青' と '黄' の間を回転させると、非常に大きな明度のずれも生成されます。Wikipedia: HSL 色空間の欠点を参照してください。一つの代替手段は、Grafica Obscura の "Matrix Operations" 論文で説明されているように、輝度を保持する回転を行うことです。これは複雑です。色の変更が演算の一部として、必要な回転量に応じて異なる単一の計算されたマトリックス演算として行われるからです。IM v6.8.4-7 以降、Modulate 演算子は、それぞれ 'Luv' と 'Lab' 色空間の円筒(色相・クロマ)形式である特別な色空間 'LCHab' と 'LCHuv' も扱えます。詳しくは Wikipedia, 円筒形 LUV, または LCHuv 色空間と The HCL Colorspace を参照してください。 |
'LCHab' と 'LCHuv' 色空間の同等のチャンネルは、'HCL' と 'HCB' 色空間のものとは逆です。つまり、'グレースケール' の強度に相当するものが最初の('赤')チャンネルにあり、色相が画像の 3 番目の('青')チャンネルにあります。 |
|---|---|
例えば、'LCHab' 色空間を使って赤い rose の色相回転をいくつか行います。これらを上の '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
0% & 200% |
25%
(赤->青) |
50% |
75% |
100%
no-op |
125% |
150% |
175%
---|---|---|---|---|---|---|---
なお、色相がより伝統的な Hue 色空間とは異なる形で分布していることに注目してください。しかしより重要なのは、元画像の強度が保持されることです。このため、純粋な原色/2 次色から別の純粋な原色/2 次色へ循環することは決してありません。これらのどれも同じ強度を持たないからです。ただし、色相にわたる色の進行は、原色と 2 次色で鋭い 'ピーク' が少なく、より滑らかに流れます。 ここに、'LCHab' と通常の 'HSL' 色空間(適切な回転パーセンテージを使用)について、赤から青への単純な色相回転の比較があります。
オリジナル | |
LCHab
25% |
HSL/HSB
33.3%
---|---|---|---
青がまったく暗くなく、元画像の色合いによりよく一致する色合いになっていることに注目してください。HCL 色空間の色相についての詳しい情報は、LCH カラーホイールの例を参照してください。 | _IM v6.8.4-7 以前は、色空間 'HCL'(IM v6.7.9-1 で導入)を使っていたでしょう。この色空間は 'LCHuv' とまったく同じですが、チャンネルの順序が逆です(色相が画像の赤チャンネルに保存される。これは単にその色空間の定義の仕方でした)。これは、Modulate 演算子が正しく機能するように、さまざまなチャンネルを入れ替える必要があったことを意味しました。
'LCHab' と 'LCHuv' 色空間は、'HSL' と同じ方法でチャンネルを順序付けるため、modulate がチャンネルの再順序付けを必要とせず、色空間上で直接、適切に機能できます。
_
---|---
| _なお、非常に暗い色に対しては、'LCHuv' は不連続性のある色値を生成することがあります。ただし、これは実際の画像では起こらないはずで、円筒空間で直接生成された画像でのみ起こります。
カラーマトリックス演算子
"[-color-matrix](https://imagemagick.org/command-line-options/#color-matrix)" 演算子は、マトリックス技法を使って画像を再着色します。つまり、画像のさまざまな色チャンネル値を線形に混合して新しい色値を生成する方法を表す値のマトリックスを与えます。典型的な使用法は、演算子に 9 つの値を提供することで、これは 3 つの関数(行)または 3 つの乗数(列)を形成します。そのため、最初の 3 つの数値は '赤' チャンネルの色の式です。次が '緑'、というように続きます。例えば... |
magick rose: -color-matrix ' 1 0 0
0 1 0
0 0 1 ' matrix_noop.png
red' |
= 1 * red + 0 * green + 0 * blue |
|---|---|
green' |
= 0 * red + 1 * green + 0 * blue |
blue' |
= 0 * red + 0 * green + 1 * blue |
この特定の場合、画像に変更は加えられません。このマトリックスは 'identity matrix'(単位行列)として知られる特別な配列を形成します。行を混ぜることで、さまざまなチャンネルを入れ替えるために使えます。例えば、ここでは赤チャンネルと青チャンネルの値を入れ替えます。 |
magick rose: -color-matrix ' 0 0 1
0 1 0
1 0 0 ' matrix_red_blue_swap.png
![[IM 出力]](../static/img/color_mods/matrix_red_blue_swap.png)
あるいは、単に赤チャンネルを他の 2 つのチャンネルにコピーして、'赤チャンネル' を抽出または分離します(チャンネル画像の分離も参照)... |
magick rose: -color-matrix ' 1 0 0
1 0 0
1 0 0 ' matrix_red_channel.png
![[IM 出力]](../static/img/color_mods/matrix_red_channel.png)
あるいは、2/5/3 のグレースケール比を使って画像をグレースケール画像に変換します(カラーからグレースケールへの変換を参照)... |
magick rose: -color-matrix ' .2 .5 .3
.2 .5 .3
.2 .5 .3 ' matrix_grayscale.png
最大 6 行 6 列のセットからなる、より大きなマトリックスを使えます。これらはチャンネル 'Red'、'Green'、'Blue'、'Black'(設定されている場合)、'Alpha'(設定されている場合)、および定数に対応します。なお、チャンネル 'Black' と 'Alpha' は、その値自体が存在しなかったり使われなかったりしても、マトリックスがその大きさなら提供しなければなりません。最後の定数列は、式への単純な加算(負の場合は減算)にすぎません。6 行目(与えられた場合)は単に無視され、使われません。 デフォルトでは、'matrix' の定義はユーザー定義のモルフォロジー/コンボリューションカーネルと同じ構造に従い、サイズのジオメトリが指定されない場合は '正方形' カーネルとして扱われます。カーネルのオフセットは現在使われません。与えられた '値の配列' は、画像に適用される前に、より大きな '6x6 単位行列'(1 の対角線)の上に重ねられます。 この内部的な扱いは、マトリックスの値を、すべてではなく、ほんの数行の数値だけで実際に単純化できることを意味します。これは、色の計算に '定数' を含める必要がある場合や、1 つのチャンネルだけを変更したい場合に特に役立ちます。例えば、画像を反転(negate)します。 |
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 出力]](../static/img/color_mods/matrix_negate.png)
すべての赤チャンネル値を('定数' を使って)最大値に設定します... |
magick rose: -color-matrix '6x1: 0,0,0,0,0,1' matrix_red_max.png
![[IM 出力]](../static/img/color_mods/matrix_red_max.png)
単位行列への重ね合わせのために、他のチャンネル値はどれも影響を受けません。ただし、内部的には再計算されています。 | IM v6.6.1-0 以前は、"[-color-matrix](https://imagemagick.org/command-line-options/#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 出力]](../static/img/color_mods/matrix_sepia.png)
鮮やかな色、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 出力]](../static/img/color_mods/matrix_vivid.png)
このマトリックスは、各色チャンネルを明るくしつつ、他のチャンネルから色を減算し、RGB 画像中の色をより鮮やかにします。これは、Modulate を使って画像の色の彩度を 20% 増やすのとまったく同じではありませんが、それに似ています。Polaroid 色... |
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 出力]](../static/img/color_mods/matrix_polaroid.png)
将来: カラーマトリックスを使った色相回転...
Grafica Obscura のウェブページで説明されているようなもの。
カラーマトリックスの使用についての詳しい情報は...
- Color Matrix Filter Adobe Flash Tutorial
- Color Transformations and the Color Matrix
- ColorMatrix Unleased
- Grafica Obscura - Matrix Operations for Image Processing
- SWF Color Matrix Filter (輝度を保持した色相回転用)
ただし、これらの実装のほとんどは、行ではなく列が式を形成する対角転置形式のマトリックスを使っていることに注意してください。あるいは、より少ないチャンネル(より少ない行/列数)が関わります。
ソラリゼーション着色
画像を "[-solarize](https://imagemagick.org/command-line-options/#solarize)" することは、基本的に最も明るい色を黒に '焼く' ことです。色が明るいほど、ソラリゼーションされた色は暗くなります。これは写真で、化学フィルムが露出オーバーになったときに起こります。 |
magick rose: -solarize 90% solarize.jpg
![[IM 出力]](../static/img/color_mods/solarize.jpg)
基本的に、与えられたグレースケールレベルを超えるものはすべて反転されます。そのため、引数 '0%' を与えると、基本的に貧者の反転(Negate)演算子になります。例えば、ここに "[-fx](https://imagemagick.org/command-line-options/#fx)" の数式を使った偽の "[-solarize](https://imagemagick.org/command-line-options/#solarize)" があります。 |
magick rose: -fx '.9>u ? u : 1-u' solarize_fx.jpg
![[IM 出力]](../static/img/color_mods/solarize_fx.jpg)
この演算子は、画像から中間調のグレー色を抽出するのに特に適しています。例えば、ここでは非常に強いシグモイドコントラスト演算を使って、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 Examples の Scripts ディレクトリにある "[im_profile](../static/img/scripts/im_profile)" を使って生成されました。白いものが黒になる一方、中央のスパイクの周りの中間調のグレーが保持されることに注目してください。スパイクのぼやけ具合と配置は "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)" 演算子によって決まります。私はこれを 'フィラメント' と呼びます。典型的に結果が、白熱した電気フィラメントや雷の放電に著しく似ているからです。この効果の別の例については、Random Flux を参照してください。 この中間調のグレーの抽出は、ビットマップ形状からのエッジ輪郭の生成や、2 つのバイアスされたグラデーションの乗算の技法でもうまく活用されています。 この演算のもう一つの斬新な用途は、画像が(陰影のあるグレースケールやカラー画像ではなく)基本的に純粋な白黒のスケッチや図面(本などから)であるかどうかを判定することです。画像が次のいずれかであるかの判定: 純粋な白黒、またはグレースケールを参照してください。
ルックアップテーブルによる画像の再着色
上で示したさまざまなヒストグラム色調整を使って画像を再着色できますが、画像を再着色するもう一つの技法があります。それは、あらかじめ準備された色のグラデーション、つまり "カラールックアップテーブル"(Color LUT, または CLUT)から、変更された値を 'ルックアップ' するだけのものです。 カラー LUT には 2 種類あります。単純な 1 次元、つまり 'チャンネルごと' の LUT と、3D カラー LUT です。チャンネル LUT には 3 つの独立したルックアップテーブルがあります。R・G・B の各チャンネルに 1 つずつです。チャンネル LUT の各エントリは、入力チャンネル値を出力チャンネル値にマッピングします。出力画像の赤チャンネルは、入力画像の元の赤値だけによって影響を受けます。 しかし、3D カラー LUT は、色全体を入力色全体の関数として置き換えられます。つまり、赤チャンネルの出力値は、入力の赤・緑・青の値のいずれかまたはすべてに依存できます。これは 'チャンネルクロストーク' と呼ばれることがあります。
カラー(チャンネル)ルックアップテーブル
画像処理ツールの一般的な要件は、あらかじめ準備された色のテーブルから、色の全範囲を置き換える能力です。これにより、特定の色のセット(一般にグレースケール)の画像を、特別な画像から置換色をルックアップするだけで、まったく異なる色のセットに変換できます。 もちろん、置換色を読み取るための 'ルックアップテーブル' 画像が必要です。最初のこれらいくつかの例では、IM の "[gradient:](canvas.html#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
"[-clut](https://imagemagick.org/command-line-options/#clut)" 演算子は 2 つの画像を取ります。最初は色値を置き換える対象の画像で、2 番目は単一の行または単一の列のいずれかであるグラデーション画像です。 |
"[-clut](https://imagemagick.org/command-line-options/#clut)" 演算子は IM v6.3.5-8 で追加されました。 |
|---|---|
お使いの IM が古すぎて "[-clut](https://imagemagick.org/command-line-options/#clut)" 演算子を理解できない場合や、2 次元のカラールックアップテーブルのような通常と異なることをしたい場合は、汎用 DIY 演算子 FXを使って独自に作成できます。例えば、これは上記と同等の遅いコマンドです。 |
magick gray_image.jpg gradient_ice-sea.png \
-fx 'v.p{0,u*v.h}' gray_recolored_fx.jpg
![[IM 出力]](../static/img/color_mods/gray_recolored_fx.jpg)
問題は、上記のような単純なプロセスでさえ、"[-fx](https://imagemagick.org/command-line-options/#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
上のウェブページ表示用にグラデーション画像を拡大しました。さもなければ小さすぎて適切に見えないからです。LUT は実際にはわずか 6 ピクセルの大きさです。しかし、結果を見ると、カラールックアップ演算子がそれら 6 色を滑らかなグラデーションに均していることがわかります。 起こっているのは、IM が LUT 画像の補間ルックアップを行っていることです。つまり、見つかった色を単に選ぶのではなく、LUT をよりよく表すために近くのすべての色の重み付け平均を行います。この特定の場合、各色付きピクセルを線形の線分で結ぶだけのデフォルトの '[Bilinear](misc.html#bilinear)' 設定が使われました。 非常に小さいカラー LUT を使うとき、異なる "[-interpolate](https://imagemagick.org/command-line-options/#interpolate)" 設定は、色の異なるレベルの均しを生成します。例えば、ここでは 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 出力]](../static/img/color_mods/gray_levels_integer.jpg)
Integer | ![[IM 出力]](../static/img/color_mods/gray_levels_nearest.jpg)
Nearest | ![[IM 出力]](../static/img/color_mods/gray_levels_average.jpg)
Average | ![[IM 出力]](../static/img/color_mods/gray_levels_blend.jpg)
Blend | ![[IM 出力]](../static/img/color_mods/gray_levels_bilinear.jpg)
BiLinear | ![[IM 出力]](../static/img/color_mods/gray_levels_catrom.jpg)
Catrom | ![[IM 出力]](../static/img/color_mods/gray_levels_spline.jpg)
Spline
---|---|---|---|---|---|---
'[Integer](misc.html#integer)' と '[Nearest](misc.html#nearest)' の設定は、色をまったく均さないという点で特別です。つまり、新しい '混合色' は追加されず、グレースケール画像を着色するために存在する正確な色値 だけ が使われます。ただし、2 つの間で色のルックアップがどう異なるかに注目してください。微妙な違いですが、非常に重要なことがあります。 一方、'[Average](misc.html#average)' 設定も色の帯を生成しますが、色の混合だけを使い、結果としてカラールックアップテーブル画像のサイズより 1 つ少ない色になります。しかし、'[Blend](misc.html#blend)' は '[Average](misc.html#average)' と '[Nearest](misc.html#nearest)' を混ぜて、より多くのピクセルを追加します。 この種の色の 'バンディング'(またはブロックアーティファクト)は、実は地理的な地図や温度グラフではかなり一般的です。地図の正確な形状をよりよく表現できるからです。鋭い境界の縁は等高線(iso-lines)として知られています。最終画像にわずか 1 ピクセルのぼかしを加えると、色のバンディングを壊すことなく、それらの縁の見た目を改善し、少し滑らかに見せられます。 '[BiLinear](misc.html#bilinear)' 設定もバンディングを生成しますが、色が鋭く変化するとき(この例ではない)に、鋭いグラデーション変化の形でのみ生成します。一方、'[Catrom](misc.html#catrom)' は色の変化を均します。最後に、'[Spline](misc.html#spline)' は色をぼかし、与えられた CLUT 中の色のどれも生成しないかもしれません。 補間の問題を避けるため、または色のグラデーションをよりよく定義するために、最良のアイデアははるかに長い LUT を使うことです。理想的には、これは可能な強度値の全範囲をカバーすべきです。ImageMagick Q16(16 ビット品質でコンパイル)では、LUT の高さが 65536 ピクセルである必要があります。しかし、ピクセル補間により、ほとんどの画像再着色タスクに適した、より妥当な 500 ピクセルの LUT グラデーション画像が使えます。 上記の例で使った垂直グラデーション LUT は、黒つまり '0' のインデックスが画像の上部にあるため、私たちの目には上下逆さまに見えることに注意してください。通常、私たち人間は(進化の過去のおかげで)黒のレベルが下部にあるグラデーションを見るのを好みます。グラデーション画像を '正しい向き' で保存したい場合は、読み込む際に画像を "[-flip](https://imagemagick.org/command-line-options/#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
ご覧のとおり、垂直グラデーションでは、使う前に反転することは大いに理にかなっています。グラデーションの生成についての他の例は、色のグラデーションを参照してください。各グレーレベルに画像を使ってグレースケール画像をタイル化する方法にも興味があるかもしれません。これはさらに良い '地図' のような画像を生成できます。パターンによるディザリングを参照してください。
関数からカラー LUT への変換
これらのあらかじめ準備された "ルックアップテーブル画像"(つまり LUT)は、非常に複雑でそのため遅い "[-fx](https://imagemagick.org/command-line-options/#fx)" 演算の速度を大幅に向上させるためにも使えます。IM が関数の文字列をピクセルごとに 3 回や 4 回解釈する代わりに、置換色のはるかに高速なルックアップを行えるからです。これを行う手順はかなり率直です。関数を変更されていない線形グラデーションに適用するか、関数中の 'u' を値 '(i/w)' または '(j/h)' に置き換えて、位置に基づいて置換値を計算します。 例えば、上級編の'Aqua' 効果の例で、私は Shade 演算子のグレースケール出力を調整するために複雑な "[-fx](https://imagemagick.org/command-line-options/#fx)" 関数を使いました。また、このグレースケール調整は 'DodgerBlue' の形状にオーバーレイされるので、これら両方の演算子の結果を単一のグラデーションルックアップテーブルに結合できない理由はありません。つまり、"[-fx](https://imagemagick.org/command-line-options/#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
| 上記の多項式 "[-fx](https://imagemagick.org/command-line-options/#fx)" は、多項式関数を使ってより直接的かつ高速に生成できるようになりました。例えば
_"[-function](https://imagemagick.org/command-line-options/#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
ご覧のとおり、結果は非常に効果的で、いったん適切な LUT グラデーションが生成されれば、同じグラデーションを何度でも好きなだけ再利用できます。
CLUT と透明度の扱い
"[-clut](https://imagemagick.org/command-line-options/#clut)" 演算子は "[-channel](https://imagemagick.org/command-line-options/#channel)" 設定によって制御されますが、実際には、画像内の個々のチャンネル値だけを置き換えます。つまり、通常はソース画像の各個別チャンネルが、カラールックアップテーブルからそのチャンネルだけの置換値を 'ルックアップ' するために使われます。これにはアルファチャンネルが含まれ、これは通常非常に不便で適用が難しいです。 典型的に、"[-clut](https://imagemagick.org/command-line-options/#clut)" 演算子は、グレースケールのソース画像を着色する(前の例を参照)か、グレースケールの CLUT(カラールックアップテーブル)を使ってカラー画像のヒストグラム調整を行うために使われます。言い換えれば、通常、画像の一方は典型的にグレースケールになります。 IM v6.4.9-8 以降、"[-channel](https://imagemagick.org/command-line-options/#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
上記は、グレースケール画像にアルファチャンネルがなく("[-alpha](https://imagemagick.org/command-line-options/#alpha) off" または "[-alpha off](https://imagemagick.org/command-line-options/#matte)" のいずれかを使って無効化)、かつアルファチャンネル値もルックアップしたいことを("[-channel](https://imagemagick.org/command-line-options/#channel) RGBA" を使って)指定した場合にのみ、期待どおりに機能することを忘れないでください。 そしてこれは、(アルファチャンネルが有効でない)グレースケールのヒストグラム調整グラデーションを使って調整する必要がある、透明度(とアルファチャンネル)を持つ画像のもう一つの特別な場合です。
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
上記は典型的な画像のフェザリングの問題です。中間画像の '黒' のハロは、"[-blur](https://imagemagick.org/command-line-options/#blur)" 演算が三角形を取り囲む完全に透明な領域を見えるようにすることで生じます。完全に透明な部分は色が未定義なので、IM はデフォルトで黒にします。CLUT 画像自体は、50% 未満の透明度のピクセルがすべて完全に透明になるように設計されており、画像の以前は完全に透明だった部分を実質的に再び透明にします。 この例では、最初の 'ぼかし' を過剰に行い、次にアルファチャンネル調整を過剰に補正します。結果として、三角形の頂点が激しく丸まります。通常の画像フェザリングでは、典型的に "[-blur](https://imagemagick.org/command-line-options/#blur)" と "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)" アルファ調整の両方にはるかに小さい値を使います。 Fred Weinhaus 氏は、ぼかしによるフェザリング技法を彼の "feather" スクリプトに実装し、使いやすくしました。
Hald 3D カラールックアップテーブル
IM v6.5.3-4 以降では、複数の画像のすべての色を直接置き換えるために使える、完全な 3D カラールックアップテーブルも使えるようになりました。つまり、(上記の CLUT のように)各色チャンネルの値を別個の実体として単にルックアップするのではなく、色全体を使って新しい色をルックアップします。 しかし、3D カラーテーブルは通常、色値の 3D 配列を正しく保存するために特別なファイル形式を必要とします。しかし、色値の特別な配置を使うことで、3D テーブルを Hald Color LUT として知られる 2D 画像に保存できます。これは単なる通常の画像なので、Hald 3D Color LUT を保存するには、優れた画像ファイル形式なら何でも使えます。HALD 画像の詳細と例については、公式ウェブサイト Hald Images, Clut Technology を参照してください。 Hald 3D カラーテーブルを生成するには、'HALD:{_level_}' 画像ジェネレータを使います。例えば、ここに個々のピクセルが見えるように拡大した小さなものがあります...
magick hald:3 hald_3.png
このテーブルは、辺が '{_level_}2' 色、つまり 9 色のカラーキューブを保持します。完全なカラーキューブには '9 × 9 × 9' 色が含まれ、合計 729 色になり、その数の平方根、つまり 27x27 ピクセルの画像に保存されます。色は、最初の 9 色(左上角)が 'pure-black' から 'pure-red' へのグラデーションを形成するように保存されます。9 色ごとに '緑' のグラデーションを形成し、81 色ごとに '青' のグラデーションを形成します。右下角の最後の色は 'pure-white' です。イメージしやすいなら、画像を、3D カラーキューブとして参照されるさらに単純な 1D ピクセル配列と考えてもよいです。 さて、これは小さい HALD CLUT 画像にすぎません。より典型的には、少なくとも level 8 の Hald(デフォルト)を使います。これは辺あたり 64 色、つまり 64^3 = 262144 色のカラーキューブを保持し、512x512 ピクセルの大きさの画像を生成し、約 10K バイトの PNG 画像に保存されます。これはすべての 8 ビット色ではありませんが、かなり良いです。すべての 8 ビット色を持つ HALD 画像のためには、level 16 版が必要で、4096x4096 の画像を生成します。これは、通常のデジタルカメラ画像でさえ、一般にすべての可能な 8 ビット色を保持できないことを証明しているにすぎません。 しかし、より小さい Hald 画像も使えます。IM が Hald から隣接する 8 色を補間して、ルックアップ置換の最終的な色を計算するからです。単に、より大きな版ほど良い表現にならないだけです。8 より大きい Hald 画像はお勧めせず、それを保持するには、少なくとも値あたり 16 ビットの深度の非常に大きな画像が必要になります。さて、これらの生成された hald 画像は 'identity' つまり 'no-op' の CLUT 画像です。つまり、3D カラーキューブを形成する通常の色値であり、そのため画像に変更を加えません。例えば、"[-hald-clut](https://imagemagick.org/command-line-options/#hald-clut)" 演算子を使って 'no-op' の Hald 画像を適用してみましょう...
magick rose: hald_3.png -hald-clut rose_hald_noop.png
この画像は元画像とまったく同じで、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
もちろん、特定の色変更を 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 線形補間ルックアップではなく、'nearest-neighbour' の Hald ルックアップ設定(例えば -interpolate を使用)が必要かもしれません。また、Hald 中の特定の色(nearest-neighbour、または 8 つの隣接)を見つける何らかの簡単な方法があれば、これがずっと簡単になります。 アイデア、提案、あるいはさらに良いことに小さな例があれば、私や IM 議論フォーラムにメールして貢献してください もう一つのアイデアは、2 つの画像、元のものと変換されたものがあれば、2 つの画像の比較から Hald CLUT 画像を埋められるはずだということです。直接の色が埋められたら、カラーキューブの残りは、存在する色を曲線フィッティングすることで、少なくともおおまかに導出できるはずです。つまり、発見された色の変化から 4-D カラー曲面を作ります。完成したら、その Hald CLUT を他の任意の画像に適用して、他の任意の画像に対して同じ色変換を(どちらの方向にも)行えます。
カラーマップ全体の置換
将来: あるカラーマップ中のすべての色を、別のカラーマップ中の色で置き換える。これを最もよく行う方法についての提案を歓迎します。あるいは、何らかの画像カラーマップ関数を実装するプログラマーを歓迎します。一つの方法は、シンボルによるディザリングで提示されたアイデアを使うことかもしれません。 現在知られている最良の解決策(決して理想的ではありませんが)は、Fred Weinhaus 氏の "[mapcolors](http://www.fmwconcepts.com/imagemagick/mapcolors/index.php)" スクリプトで提供されています。このスクリプトは本質的に、関係するピクセルを 1 つの画像から、最初は空白の新しい画像にマスクしながら、各色を一度に 1 つずつマッピングします。 もう一つのアイデアは、何らかの方法で 3 次元の色置換を HALD カラーテーブルにマッピングすることです。これは指定された色だけをマッピングするのではなく、指定された色の間の色も論理的な方法で再マッピングします。HALD ジェネレータを募集中。
作成中
まだ詳しく見ていないさらなる色オプション...
-contrast
-brightness-contrast
色のサイクリング?
-cycle カラーマップをシフトする(フラクタルのアニメーション用???)
色度の色点???
–white-point x,y
–red-primary x,y
–green-primary x,y
–blue-primary x,y
しきい値処理 (反転後)
具体的には -white-threshold と -black-threshold
![[IM 出力]](../static/img/color_mods/gray_colorspace.png)
![[IM 出力]](../static/img/color_mods/gray_intensity.png)
| ![[IM 出力]](../static/img/color_mods/test_negate.png)
![[IM 出力]](../static/img/color_mods/rose_negate.gif)
![[IM 出力]](../static/img/color_mods/negate_rgba.png)
![[IM 出力]](../static/img/color_mods/negate_green.png)
![[IM 出力]](../static/img/color_mods/negate_restore.png)
| ![[IM 出力]](../static/img/color_mods/test_level.png)
![[IM 出力]](../static/img/color_mods/rose_level.gif)
![[IM 出力]](../static/img/color_mods/rose_level_light.gif)
![[IM 出力]](../static/img/color_mods/rose_level_dark.gif)
![[IM 出力]](../static/img/color_mods/rose_decontrast.gif)
![[IM 出力]](../static/img/color_mods/rose_level_neg.gif)
![[IM 出力]](../static/img/color_mods/rose_level_thres.gif)
| ![[IM 出力]](../static/img/color_mods/test_level_plus.png)
![[IM 出力]](../static/img/color_mods/rose_level_plus.gif)
![[IM 出力]](../static/img/color_mods/test_level_undo.png)
![[IM 出力]](../static/img/color_mods/test_level_const.png)
![[IM 出力]](../static/img/color_mods/rose_level_gamma_light.gif)
![[IM 出力]](../static/img/color_mods/rose_level_gamma_dark.gif)
![[IM 出力]](../static/img/color_mods/test_blue_tint.png)
![[IM 出力]](../static/img/color_mods/levelc_grn-gold.png)
![[IM 出力]](../static/img/color_mods/levelc_dodger.png)
![[IM 出力]](../static/img/color_mods/levelc_gold.png)
![[IM 出力]](../static/img/color_mods/levelc_lime.png)
![[IM 出力]](../static/img/color_mods/levelc_red.png)
![[IM 出力]](../static/img/color_mods/levelc_navy.png)
![[IM 出力]](../static/img/color_mods/levelc_darkgreen.png)
![[IM 出力]](../static/img/color_mods/levelc_firebrick.png)
![[IM 出力]](../static/img/images/cow.gif)
![[IM 出力]](../static/img/color_mods/cow_red.gif)
![[IM 出力]](../static/img/color_mods/levelc_faded.gif)
![[IM 出力]](../static/img/color_mods/levelc_fire.gif)
![[IM 出力]](../static/img/color_mods/levelc_tan.gif)
![[IM 出力]](../static/img/color_mods/sigmoidal.png)
![[IM 出力]](../static/img/color_mods/test_sigmoidal_inv.png)
![[IM 出力]](../static/img/img_photos/chinese_chess.jpg)
![[IM 出力]](../static/img/color_mods/chinese_contrast.png)
![[IM 出力]](../static/img/color_mods/chinese_chess_hist.gif)
![[IM 出力]](../static/img/color_mods/chinese_contrast_hist.gif)
![[IM 出力]](../static/img/color_mods/gray_range.jpg)
![[IM 出力]](../static/img/color_mods/normalize_gray.jpg)
![[IM 出力]](../static/img/color_mods/color_range.jpg)
![[IM 出力]](../static/img/color_mods/normalize.jpg)
![[IM 出力]](../static/img/color_mods/stretch_gray.jpg)
![[IM テキスト]](../static/img/color_mods/grad_hist_mod.txt.gif)
![[IM テキスト]](../static/img/color_mods/grad_cs_hist_mod.txt.gif)
![[IM テキスト]](../static/img/color_mods/grad_ls_hist_mod.txt.gif)
![[IM テキスト]](../static/img/color_mods/grad_lv_hist_mod.txt.gif)
![[IM テキスト]](../static/img/color_mods/grad_cs0_hist_mod.txt.gif)
![[IM テキスト]](../static/img/color_mods/grad_ls0_hist_mod.txt.gif)
![[IM テキスト]](../static/img/color_mods/info_port_mod.txt.gif)
![[IM 出力]](../static/img/img_photos/port.png)
![[IM 出力]](../static/img/color_mods/port_hist.gif)
![[IM 出力]](../static/img/color_mods/port_cs1.png)
![[IM 出力]](../static/img/color_mods/port_cs1_hist.gif)
![[IM 出力]](../static/img/color_mods/port_cs1rgb.png)
![[IM 出力]](../static/img/color_mods/port_cs1rgb_hist.gif)
![[IM 出力]](../static/img/color_mods/port_ls1.png)
![[IM 出力]](../static/img/color_mods/port_ls1_hist.gif)
![[IM 出力]](../static/img/color_mods/port_ls1rgb.png)
![[IM 出力]](../static/img/color_mods/port_ls1rgb_hist.gif)
![[IM 出力]](../static/img/img_photos/zelda.png)
![[IM 出力]](../static/img/color_mods/zelda_equal.png)
![[IM 出力]](../static/img/color_mods/zelda_hist.gif)
![[IM 出力]](../static/img/color_mods/zelda_equal_hist.gif)
![[IM 出力]](../static/img/color_mods/zelda_ghist.gif)
![[IM 出力]](../static/img/color_mods/zelda_equal_ghist.gif)
![[IM 出力]](../static/img/color_mods/zelda_uniform.png)
![[IM 出力]](../static/img/color_mods/zelda_uniform_hist.gif)
![[IM 出力]](../static/img/color_mods/zelda_uniform_ghist.gif)
![[IM 出力]](../static/img/color_mods/zelda_gaussian.png)
![[IM 出力]](../static/img/color_mods/zelda_gaussian_ghist.gif)
![[IM 出力]](../static/img/color_mods/zelda_hist_graph.gif)
![[IM 出力]](../static/img/color_mods/gaussian_hist_graph.gif)
![[IM 出力]](../static/img/color_mods/zelda_redist.png)
![[IM 出力]](../static/img/color_mods/zelda_redist_graph.gif)
![[IM 出力]](../static/img/color_mods/zelda_gaussian_redist.png)
![[IM 出力]](../static/img/color_mods/fx_linear_white.png)
![[IM 出力]](../static/img/color_mods/fx_linear_black_plot.gif)
![[IM 出力]](../static/img/color_mods/fx_linear_black.png)
![[IM 出力]](../static/img/color_mods/fx_linear_color_plot.gif)
![[IM 出力]](../static/img/color_mods/fx_linear_color.png)
![[IM 出力]](../static/img/color_mods/fx_linear.png)
![[IM 出力]](../static/img/color_mods/fx_non-linear_plot.gif)
![[IM 出力]](../static/img/color_mods/fx_non-linear.png)
![[IM 出力]](../static/img/color_mods/fx_quadratic_plot.gif)
![[IM 出力]](../static/img/color_mods/fx_quadratic.png)
![[IM 出力]](../static/img/color_mods/fx_expotential_plot.gif)
![[IM 出力]](../static/img/color_mods/fx_expotential.png)
![[Gnuplot]](../static/img/color_mods/fx_funct_plot.gif)
![[Gnuplot]](../static/img/color_mods/fx_funct.txt.gif)
![[IM 出力]](../static/img/color_mods/colorize_lighten.png)
![[IM 出力]](../static/img/color_mods/colorize_darken.png)
![[IM 出力]](../static/img/color_mods/colorize_grayer.png)
![[IM 出力]](../static/img/color_mods/tint_red.png)
![[IM 出力]](../static/img/color_mods/tint_lighter.png)
![[IM 出力]](../static/img/color_mods/tint_darker.png)
![[IM 出力]](../static/img/color_mods/rose_grey.jpg)
![[IM 出力]](../static/img/color_mods/sepia_goldenrod.jpg)
![[IM 出力]](../static/img/color_mods/sepia_gold.jpg)
![[IM 出力]](../static/img/color_mods/sepia_khaki.jpg)
![[IM 出力]](../static/img/color_mods/sepia_wheat.jpg)
![[IM 出力]](../static/img/color_mods/duotone_blue.jpg)
![[IM 出力]](../static/img/color_mods/duotone_darkcyan.jpg)
![[IM 出力]](../static/img/color_mods/duotone_goldenrod.jpg)
![[IM 出力]](../static/img/color_mods/duotone_firebrick.jpg)
![[IM 出力]](../static/img/color_mods/duotone_clut.gif)
![[IM 出力]](../static/img/color_mods/duotone_gradient.gif)
![[IM 出力]](../static/img/color_mods/rose_duotone.jpg)
![[IM 出力]](../static/img/color_mods/mod_bright_0.gif)
![[IM 出力]](../static/img/color_mods/mod_bright_50.gif)
![[IM 出力]](../static/img/color_mods/mod_bright_80.gif)
![[IM 出力]](../static/img/color_mods/mod_bright_100.gif)
![[IM 出力]](../static/img/color_mods/mod_bright_150.gif)
![[IM 出力]](../static/img/color_mods/mod_bright_200.gif)
![[IM 出力]](../static/img/color_mods/mod_sat_0.gif)
![[IM 出力]](../static/img/color_mods/mod_sat_20.gif)
![[IM 出力]](../static/img/color_mods/mod_sat_70.gif)
![[IM 出力]](../static/img/color_mods/mod_sat_100.gif)
![[IM 出力]](../static/img/color_mods/mod_sat_150.gif)
![[IM 出力]](../static/img/color_mods/mod_sat_200.gif)
![[IM 出力]](../static/img/color_mods/modulate_channel.png)
![[IM 出力]](../static/img/img_photos/wedding_party_sm.jpg)
![[IM 出力]](../static/img/color_mods/modulate_off-white.png)
![[IM 出力]](../static/img/color_mods/mod_bright_HSL.gif)
![[IM 出力]](../static/img/color_mods/mod_bright_HSB.gif)
![[IM 出力]](../static/img/color_mods/matrix_noop.png)
![[IM 出力]](../static/img/color_mods/matrix_grayscale.png)
![[IM 出力]](../static/img/color_mods/fuzzy_thres_pf.gif)
![[IM 出力]](../static/img/color_mods/fuzzy_spike_pf.gif)
![[IM 出力]](../static/img/color_mods/filament_pf.gif)
![[IM 出力]](../static/img/color_mods/gray_image.jpg)
![[IM 出力]](../static/img/color_mods/gradient_ice-sea.png)
![[IM 出力]](../static/img/color_mods/gray_recolored.jpg)
![[IM 出力]](../static/img/color_mods/gradient_levels_mag.png)
![[IM 出力]](../static/img/color_mods/gray_levels.jpg)
![[IM 出力]](../static/img/color_mods/gradient_planet.png)
![[IM 出力]](../static/img/color_mods/gray_planet.jpg)
![[IM 出力]](../static/img/color_mods/aqua_gradient.png)
![[IM 出力]](../static/img/color_mods/aqua_mask.png)
![[IM 出力]](../static/img/color_mods/aqua_shade.png)
![[IM 出力]](../static/img/color_mods/aqua_font.png)
![[IM 出力]](../static/img/color_mods/blurred_shape.jpg)
![[IM 出力]](../static/img/color_mods/gradient_border.png)
![[IM 出力]](../static/img/color_mods/clut_shape.png)
![[IM 出力]](../static/img/color_mods/shape_triangle.gif)
![[IM 出力]](../static/img/color_mods/shape_blurred.png)
![[IM 出力]](../static/img/color_mods/feather_histogram.jpg)
![[IM 出力]](../static/img/color_mods/shape_feathered.png)
![[IM 出力]](../static/img/color_mods/hald_3_lg.png)
![[IM 出力]](../static/img/color_mods/hald_3.png)
![[IM 出力]](../static/img/color_mods/rose_hald_noop.png)
![[IM 出力]](../static/img/color_mods/hald_sepia.png)
![[IM 出力]](../static/img/color_mods/rose_hald_sepia.png)