カラーマネジメント
インターネット上での sRGB の標準化により、ほとんどの画像フォーマットは作業用色空間の既定として sRGB を使います。画像の色空間が不明で、8〜16 ビットの画像フォーマットであれば、sRGB 色空間であると仮定するのが安全な選択です。これはグレースケールにも当てはまり、非線形グレースケールと仮定します。これらの仮定は、特定の画像フォーマットが色空間やガンマのメタデータを含む場合には上書きされます。ImageMagick は、色空間が sRGB ではなく RGB の場合、線形色(リニアカラー)と仮定します。既定の色空間の仮定は、カラープロファイルや -set オプションでも上書きできます。
ImageMagick はカラープロファイルをサポートしますが、プロファイルや色空間の宣言がない画像については、非線形 sRGB と仮定します。ほとんどの画像処理アルゴリズムは線形色空間を前提とするため、特定の画像処理アルゴリズムを適用する前に、線形色へ変換するかガンマ関数を取り除くのが賢明な場合があります。例:
magick myimage.jpg -colorspace RGB -resize 200% -colorspace sRGB mybigimage.jpg
画像を sRGB ではなく線形 RGB であると宣言するには、set オプションを使います:
magick myimage.png -set colorspace RGB myRGBimage.png
画像を線形と宣言することは、画像を線形に変換することとは異なる点に注意してください。線形と宣言するのはメタデータを設定するだけで、ピクセルデータは変更しません。一方、線形へ変換すると、以下で詳しく説明するとおり実際にピクセルデータが変わります。
その後、出力ファイルの verbose 情報では色空間が RGB と表示されます。これは、PNG や GIF のように線形 RGB と非線形 sRGB を区別するメタデータを含む画像タイプでのみ機能します。したがって、上記コマンドを JPG や TIF の出力形式で実行すると、色空間の verbose 情報は依然として sRGB を示します。JPG 出力に線形 RGB であることを正しく認識させるには、適切なカラープロファイルを含めてください。
既定では、カラー画像をグレースケールに変換すると非線形グレーが返されます。代わりに線形グレーへ変換するには、-set、-intensity、-grayscale のいずれかのオプションを使います:
convert myimage.png -colorspace LinearGray myRGBimage.png
convert myimage.png -colorspace RGB -colorspace Gray myRGBimage.png
convert myimage.png -intensity Rec709luminance -colorspace gray myRGBimage.png
convert myimage.png -grayscale Rec709luminance myRGBimage.png
なお、LinearGray は ImageMagick 6.9.9-29 および 7.0.7-17 以降の新機能です。
チャンネルを分離する際にも同じ考え方が必要です。通常、sRGB カラー画像の各チャンネルを分離する変換は、別々の非線形グレースケール画像を生成します。しかし、分離したチャンネルを線形グレースケールとして保ちたい場合は、同じ考え方を適用できます。たとえば、次は線形グレースケールチャンネルを生成します。
magick myimage.png -colorspace RGB -separate myimage_channels_%d.png
チャンネルを分離して(途中で処理を挟む可能性もある)再結合する場合、特に再結合時に使用する色空間を識別することが重要です。例:
magick myimage.png -separate myimage_channels_%d.png
magick myimage_channels_*.png -combine myimage2.png
上の例では、分離されたチャンネルは非線形で、-combine の既定も非線形チャンネルを仮定します。そのため結果は入力と同じになります。
線形グレースケールチャンネルへ分離し、(おそらく何らかの処理の後で)あとで非線形カラーへ再結合したい場合は、線形グレースケールを維持するために上記と同じ考え方を使います:
magick myimage.png -set colorspace RGB -separate myimage_channels_%d.png
magick myimage_channels_*.png -set colorspace RGB -combine -colorspace sRGB myimage2.png
sRGB と HSL の間のように別の色空間へ変換して戻す場合、次の 2 つのコマンドは、1 つ目が非線形チャンネルの場合、2 つ目が線形チャンネルの場合を扱います:
magick myimage.png -colorspace HSL -separate myimage_channels_%d.png
magick myimage_channels_*.png -set colorspace HSL -combine -colorspace sRGB myimage2.png
magick myimage.png -set colorspace RGB -colorspace HSL -separate myimage_channels_%d.png
magick myimage_channels_*.png -set colorspace HSL -combine -colorspace RGB -set colorspace sRGB myimage2.png
大多数の画像フォーマットは sRGB 色空間を仮定します(JPEG、PNG など)。一部は線形 RGB のみ(EXR、DPX、CIN、HDR など)、または線形 GRAY のみをサポートします。一部のフォーマットは CMYK をサポートします。たとえば JPG はサポートしますが、PNG はサポートしません。また、まれに LAB(CIELAB)もサポートするフォーマットがあります(TIFF、PSD、JPG、JP2 など)。詳細は Colorspace と 対応フォーマット のページを参照してください。
個々の色を rgb(...) や 16 進数で指定した場合、これらの色は依然として非線形、つまり sRGB 色として解釈されます。一方、線形色を作りたい場合は icc-color(rgb,r,g,b) を使います(r, g, b は 0〜1 の範囲)。Color ページを参照してください。