LoginSignup
1
3

ImageMagick のグレースケール変換

Last updated at Posted at 2022-07-30

ImageMagick で RGB 画像をグレースケール変換する方法について公式マニュアルを元に、少しばかり追加して解説します。

グレースケールそのものについては、以下のエントリをご参照下さい。

公式マニュアルの方法

公式マニュアルで紹介されている、-colorspace, -grayscale, -modulate, -fx, -compose, -evaluate, -evaluate-sequence, -color-mat(旧 -recolor ) について、一通り並べます。

サンプル画像

公式マニュアルのサンプル画像をそのまま使います。

test.png
test.png

-colorspace Gray

公式のお勧め (The best method) は -colorspace Gray です。(gray でも同じ。大文字小文字を区別せず)
色空間をグレースケールに変更する命令です。

%  magick test.png -colorspace Gray gray_colorspace.png
test.png gray_colorspace.png
test.png gray_colorspace.png

-grayscale

RGB を1つの輝度値にまとめる方法は色々とあって、-grayscale オプションはそれを指示します。
-list Intensity で一覧が出せます。

% magick -list Intensity
Average
Brightness
Lightness
Mean
MS
Rec601Luma
Rec601Luminance
Rec709Luma
Rec709Luminance
RMS

なお、冒頭で紹介した -colorspace Gray は -grayscale Rec709Luma 相当です。

% magick test.png  -grayscale rec709luma gray_grayscale.png
gray_grayscale.png
gray_grayscale.png

全ての Intensity で処理して montage で並べてみます。

% for i in `magick -list intensity` ;  \
    do magick ../test.png -grayscale $i  $i.png ; \
    done
 % magick montage  -background lightgray \
        -label %f *.png gray-intensity.png
gray-intensity.png
gray-intensity.png

-modulate

-modulate は HSL 色空間の明るさ、彩度、色相に手を加えるオプションです。

2番目のパラメータが彩度で、0 にするとグレースケール化します。

% magick test.png -modulate 100,0 gray_modulate.png
gray_modulate.png
gray_modulate.png

-define modulate:colorspace を使うと HSL 以外でも modulete 操作が可能です。

% for cs in HCL HCLp HSB HSI HSL HSV ;  \
    do magick ../test.png -define modulate:colorspace=$cs  \
            -modulate 100,0  $cs.png ; done
 % magick montage  -background lightgray \
        -label %f *.png gray-colorspace.png
gray-colorspace.png
gray-colorspace.png

-fx

任意の計算ができる -fx は、既存の機能で満足できるものがない時に便利です。

% magick test.png -fx '(r+g+b)/3' gray_fx_average.png
% magick gray_fx_average.png -alpha off alpha-off.png

透明度データも作られる為、分かりやすいよう alpha off した画像もつけます。

gray_fx_average.png alpha-off
gray_fx_average.png alpha-off.png

intensity (色の強さ)のキーワードを直接指定できます。

% magick test.png  -fx intensity  gray_intensity.png
% magick gray_intensity.png -alpha off alpha-off.png

gray_intensity.png alpha-off.png
gray_intensity.png alpha-off.png

-separate & -compose

R,G,B チャネルを3つのグレースケールとして分解したあと、それらを合成します。

% magick test.png -separate \
          -background black -compose plus -flatten   gray_added.png

この例だと plus で合成するので、真っ白になります。

-evaluate multiply

-evaluate を使って各チャネルに乗算するする方法です。

% magick test.png -channel R -evaluate multiply .2 \
                   -channel G -evaluate multiply .5 \
                   -channel B -evaluate multiply .3 \
                   +channel -separate -compose add -flatten gray_253.png
gray_253.png
gray_253.png

6系ではこれで良かったのですが、7系では alpha が合成でまざってしまい画像が崩れます。
これは実装の不具合ではなく、6 は RGB と A を区別してたのを 7 でやめたので、その一貫した挙動の一つだと思われます。
とはいえマニュアル的にまずいので公式の issue で指摘しておきました。

ImageMagick 7 では、以下の方法が提案されました。(マニュアルも書き変わってます)

% magick test.png -channel R -evaluate multiply .2 +channel \
                   -channel G -evaluate multiply .5 +channel \
                   -channel B -evaluate multiply .3 +channel \
                   -channel RGB -separate -compose add -flatten gray_253.png

+channel は念の為です。処理が終わったら戻すお行儀の良さ。
アルファデータが全部 0xff に変化しますが、元からそうです。(マニュアルの注意書きに追加されました)

-evaluate-sequence mean

% magick test.png -separate -evaluate-sequence mean  gray_average.png
gray_average.png
gray_average.png

こっちはうまく変換できます。

-color-matrix (旧 -recolor)

公式マニュアルは古い記述のままで -recolor は今は -color-matrix に改名されてます。

% magick test.png -recolor '.2 .5 .3
                            .2 .5 .3
                            .2 .5 .3'   gray_recolor.png
magick: option has been replaced '-recolor', use "-color-matrix" at CLI arg 2 @ warning/operation.c/CLISimpleOperatorImage/3187.
magick: unrecognized option `-recolor' at CLI arg 2 @ error/operation.c/CLISimpleOperatorImage/3285.

エラーが出ました。
気を取り直して、-color-matrix で実行。

% magick test.png -color-matrix '.2 .5 .3
                                 .2 .5 .3
                                 .2 .5 .3'   gray_colmat.png
gray_colmat.png
gray_colmat.png

マニュアル以外の方法

-type

type はファイルを入力する時、または出力する時に画像をどう扱うかを指定するフラグです。

この -type でグレースケール形式を指定する事により、グレースケールでない画像をグレースケール化して最終出力します。

-type Grayscale

 magick test.png  -type GrayScaleAlpha  gray_type.png
gray_type.png
gray_type.png

-type GrayScaleAlpha

透明度を残したい場合は、こちらをどうぞ。

 magick test.png  -type GrayScaleAlpha  gray_typealpha.png
gray_typealpha.png
gray_typealpha.png

-colorspace

冒頭で -colorspace gray を紹介しました。その gray 以外での方法です。
ちなみに、-modulate 100, 0 とやってる事はほぼ同じです。
ただし、こっちは ImageMagick が対応する任意の色空間を使えます。-modulate の対応空間はそのうち半分程度なので。

-colorspace OHTA

% magick test.png -colorspace OHTA -channel Red -separate +channel gray_OHTA.png
gray_OHTA.png
gray_OHTA.png

-colorspace HSI

% magick test.png -colorspace HSI -channel Blue -separate +channel gray_HSI.png
gray_HSI.png
gray_HSI.png

-channel G

RGB のうち RB に比べて G の輝度が圧倒的に高いので、G だけ取り出してグレースケールとしても、そこそこ良い結果になります。

% magick test.png -separate -delete 0,2,3  gray_G.png
gray_G.png
gray_G.png

あと、特殊用途でうが、輝度の極端に小さい B だけ残すと、見えなかったノイズが強調できる事もあるので、これはこれで有用です。モニタテスト等で。

% magick test.png -separate -delete 0,1,3  gray_B.png
gray_B.png
gray_B.png

-hald-clut

CLUT (Color LookUp Table) と -hald-clut オプションを使って変換する方法があります。
なお、擬似カラーを作るのに便利な -clut オプションの方は R,G,B を各々独立して変換する方式なので、グレースケール化には使えません。

% magick HALD:8 -colorspace Gray hald8gray.png
% magick test.png hald8gray.png -hald-clut gray_hald-clut.png

慣れてないと分かりにくいのですが。-hald-clut の後でなく前に CLUT画像ファイルを置きます。

hald8gray.png gray_hald-clut.png
hald8gray.png gray_hald-clut.png

これの利点は、単純なグレースケール変換であれば、任意の処理に対応する CLUT を指定するだけで、その処理を再現できる事です。

例えば、以下のサイトのように、処理系毎の CLUT ファイルを用意すれば、

% wget https://raw.githubusercontent.com/SzieberthAdam/cvd-palette/master/haldclut/gray/gray.skimage.png
% magick test.png gray.skimage.png -hald-clut gray_ski.png
gray_ski.png
gray_ski.png

このようにして、SKImage のグレースケールを再現する事ができます。(なお、これらの CLUT ファイルが正しいかの検証はしてません。ご利用は自己責任で)

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3