色弱シミュレーションのサンプル画像を作ってみる

色弱について書かれているサイトを閲覧している際に、色弱による見え方の違いを擬似体験できるようなサンプル画像をいくつか見かけました。同じようなものが自分で作れないか試してみました。
実際に使用した環境はUbuntu12 + ImageMagick 6.6.9-7 です。

##使用したアルゴリズム
色弱をシミュレーションするためのプログラムはインターネット上でいくつか公開されていますが、そのどれを使用するかによって結果が違ってきます。
今回は[Color-Blindness Simulators](http://lpetrich.org/Science/ColorBlindnessSim/ColorBlindnessSim.html) + RGBカラースペースを選択しましたが、それを選択した理由は私の好みよるところが大きいため、それが正しいという話ではありません。
他のアルゴリズムやカラースペースを試してみたり、数値を調整してみたりして「色」や「色の見え方」について考えるきっかけにしてみるのも良いのではないでしょうか。

##使用したサンプル画像
今回は[flickr](https://www.flickr.com/)で見つけた[Hat（Kodak Photo CD Sampler, 1995, PCD0992）](https://www.flickr.com/photos/glickr/7955089492/in/album-72157631465699206/)が[クリエイティブコモンズBY-NC-ND](https://creativecommons.org/licenses/by-nc-nd/2.0/)で公開されていて、いい感じでしたので使用させて頂きました。もちろん手元にサンプルがあれば無理に使う必要はないと思います。

実際のサンプル画像は以下のとおりです。
![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/0d9d0d7c-5a28-eb51-f9be-4d5dce97536c.jpeg)

##作成してみる
ImageMagickの`convert`コマンドと`montage`コマンドをを順番に実行していくだけのものです。`convert`コマンドで色変換を行って、最後に`montage`コマンドで画像を結合しています。

```console
$ convert sample.jpg -quality 100 -colorspace RGB -color-matrix '0.202 0.992 -0.194 0.164 0.793 0.044 0.009 -0.013 1.004' -fill white -undercolor '#00000080' -gravity South -annotate +0+5 ' Protanopia ' sample-p.jpg
$ convert sample.jpg -quality 100 -colorspace RGB -color-matrix '0.431 0.717 -0.148 0.337 0.574 0.089 -0.024 0.028 0.996' -fill white -undercolor '#00000080' -gravity South -annotate +0+5 ' Deuteranopia ' sample-d.jpg
$ convert sample.jpg -quality 100 -colorspace RGB -color-matrix '0.972 0.112 -0.084 0.022 0.818 0.160 -0.063 0.881 0.182' -fill white -undercolor '#00000080' -gravity South -annotate +0+5 ' Tritanopia ' sample-t.jpg
$ montage -tile 4x1 -quality 100 -geometry +2+2 sample.jpg sample-p.jpg sample-d.jpg sample-t.jpg sample-out.jpg
$ gpicview sample-out.jpg #確認用
```

実行結果は以下のとおりです。それっぽいサンプル画像になったように思います。
![sample-out.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/930ac71f-b0b4-d9cb-a5b3-da49a420617b.jpeg)


[Wikipedia - Visible spectrum](https://en.wikipedia.org/wiki/Visible_spectrum)のカラーサンプルでも試してみました。横長の画像なので最後の`montage`コマンドの`-tile`オプションの値を`4x1`から`1x4`に変更して縦に配置しています。
![sample-out.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/1bbd5c66-305b-d848-35c5-f7f5299e23d3.jpeg)

##自分好みにカスタマイズできます
自分で作ることのメリットというか醍醐味は気にいらなければ自分で直せるところです。今回はImageMagickのコマンドを順番に実行しているだけですので、比較的カスタマイズもしやすいと思います。
今回使用したコマンドの中で、`convert`コマンドの`-colorspace ...`と`-color-matrix '...'`、`montage`コマンドの`-tile ...`を紹介したいと思います。

###-colorspaceオプション
`-colorspace`オプションはカラースペース（色空間）を指定します。指定できる値は以下のコマンドで調べる事ができます。

```console
$ convert -list colorspace
CMY
CMYK
Gray
HSB
HSL
HWB
Lab
Log
（省略）
```

カラースペースで使える値は新しいバージョンの方が増えているようでImageMagick6.6.9-7とImageMagick 7.0.2-2 Q16を比較すると以下のカラースペースが増えています。

```text
CIELab
HCL
HCLp
HSI
HSV
LCH
LCHab
LCHuv
LMS
Luv
scRGB
xyY
YDbDr
```

###-color-matrixオプション
`-color-matrix`オプションには9つの数値を指定します。3つの数値が1セットで初めの3つが赤チャンネルのRGB、次が緑チャンネルのRGB、その次が青チャンネルのRGBとなっています。
こんなイメージで

```
#               R G B
-color-matrix ' 1 0 0  ← 赤チャネル
                0 1 0  ← 緑チャネル
                0 0 1' ← 青チャネル
```

以下のような計算が行われると思えばいいのかなと思います。…なんか余計に分かりくくなってしまったような…。

```
red'    = 1 * red + 0 * green + 0 * blue
green'  = 0 * red + 1 * green + 0 * blue
blue'   = 0 * red + 0 * green + 1 * blue
```

頭で考えながら指定する事もできますが、[GIMP](https://www.gimp.org/)のカラーミキサーを使うと画面で見ながら調整できます。カラーミキサーは`色` → `色要素` → `カラーミキサー`で起動します。
![gimp_colormixer.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/b0026350-214a-b1b1-2552-da8fc5465f3d.jpeg)

`-color-matrix`オプションの値を`0.202`なら`20.2`のように100倍した値をGIMP上に入力して、調整が終わったら値を1/100して`-color-matrix`オプションの値として入力…でも良いのですが`開く`ボタンと`保存`ボタンを使うともう少しわかりやすいと思うので、その方法を紹介いたします。

まず以下のテキストをコピー＆ペーストしてテキストファイルを作成します。

```text:mixer.txt
# Channel Mixer Configuration File
CHANNEL: RED
PREVIEW: TRUE
MONOCHROME: FALSE
PRESERVE_LUMINOSITY: FALSE
RED: 1.000 0.000 0.000
GREEN: 0.000 1.000 0.000
BLUE: 0.000 0.000 1.000
BLACK: 0.000 0.000 0.000
```

作成したファイルの`RED:` `GREEN:` `BLUE:`の箇所に`-color-matrix`オプションの値をそのまま貼り付けて保存します。`-color-matrix '0.202 0.992 -0.194 0.164 0.793 0.044 0.009 -0.013 1.004'`の場合なら以下のようになります。

```text:mixer.txt（例）
# Channel Mixer Configuration File
CHANNEL: RED
PREVIEW: TRUE
MONOCHROME: FALSE
PRESERVE_LUMINOSITY: FALSE
RED: 0.202 0.992 -0.194
GREEN: 0.164 0.793 0.044
BLUE: 0.009 -0.013 1.004
BLACK: 0.000 0.000 0.000
```

`開く`ボタンをクリックし作成したファイルを読み込みます。入力した値が100倍されて設定されていると思いますので、そのまま調整作業を行うことができます。
調整が終わったら`保存`ボタンをクリックして保存します。保存したファイルをテキストエディタで開き、`RED:` `GREEN:` `BLUE:`の値を`-color-matrix`オプションの値に入力します。

ちょっと面倒ですがGIMP上でリアルタムにプレビュー確認しながら調整できるあたりは便利と思います。

###-tileオプション
画像の並べ方を指定します。`4x1`は横4つ×縦1つ画像を並べるという意味ですので、`1x4`や`2x2`なども可能です。