ImageMagick で -color-matrix を使う

ImageMagick で -color-matrix を使う時のメモです。
元々は -recolor オプションでした。

正直、わかりにくいですが、わかれば大丈夫。

色行列(Color Matrix)そのものは以下の解説を参考にして下さい。

- 色変換行列のうんちく
  - https://qiita.com/yoya/items/95bfb8659f37ea8a2800

# マニュアルの説明

- -color-matrix matrix
  - https://www.imagemagick.org/script/command-line-options.php#color-matrix

> This option permits saturation changes, hue rotation, luminance to alpha, and various other effects. Although variable-sized transformation matrices can be used, typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA (or RGBA with offsets). The matrix is similar to those used by Adobe Flash except offsets are in column 6 rather than 5 (in support of CMYKA images) and offsets are normalized (divide Flash offset by 255).

> 意訳： 色相回転や輝度to透明度といった様々な効果をもたらすオプション、変換行列のサイズは可変で、RGBA は 5x5, CMYKA(あと RGBA+オフセット)は 6x6 行列を使う。なお オフセットは5列でなく6列にある(CMYKA 対応)。あとオフセットは正規化してあり、Adobe Flash の値を 255 で割ったもの相当。

正直、この説明はざっくりし過ぎで、実際には以下のように使い分けが出来ます。

| 行列サイズ | 色コンポーネントとオフセット対応 |
|---|---|
| 3x3 | RGB の乗算処理 (オフセット無し) |
| 4x4 | CMYK の乗算処理 (オフセット無し) |
| 5x5 | RGBA 又は CMYKA の乗算処理 (オフセット無し) |
| 6x6 | RGB(A) 又は CMYK(A) の乗算+加算処理 (オフセット有り) |

以下に詳しく説明します。

# 行列の形

まず、RGBA で乗算加算対応(加算はオフセット付きの事) の完全な行列形式は以下のようになります。尚、x は未使用です。あと輝度maxを1としてます。具体的には　8bit深度 だと {R,G,B,x,A,1} は {R,G,B,x,A,255} になります。ImageMagick は大抵 Q16 なので {R,G,B,x,A,65535} が多そうですね。

```math
\begin{pmatrix}
R' \\
G' \\
B' \\
x' \\
A' \\
1
\end{pmatrix}
=
\begin{pmatrix}
m_{11} & m_{21} & m_{31} & m_{41} & m_{51} & m_{61} \\
m_{12} & m_{22} & m_{32} & m_{41} & m_{52} & m_{61} \\
m_{13} & m_{23} & m_{33} & m_{43} & m_{53} & m_{61} \\
m_{14} & m_{24} & m_{34} & m_{44} & m_{54} & m_{61} \\
m_{15} & m_{25} & m_{35} & m_{45} & m_{55} & m_{61} \\
0 & 0 & 0 & 0 & 0 & 1
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
x\\
A \\
1
\end{pmatrix}
```

何も変換しない行列は以下のように斜めに1が並び、残りが 0 となります。いわゆる単位行列(Identity Matrix)です。

```math
\begin{pmatrix}
1 & 0 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 \\
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
x\\
A \\
1
\end{pmatrix}
=
\begin{pmatrix}
R \\
G \\
B \\
x\\
A \\
1
\end{pmatrix}
```

## 何故歪つ？

RGB と A の間に未使用の値(x)がありますが、これは CMYK+A 対応した時の影響のようです。CMYKA だと A が 5つ目になるので、RGBA の A も同じ列にしたようです。。正直、使い勝手を考えると RGB(A) と CMYK(A) で行列の形を使い分けて欲しいですが、A の列を固定にするのが仕様です！！

```math
\begin{pmatrix}
C' \\
M' \\
Y' \\
K' \\
A' \\
1
\end{pmatrix}
=
\begin{pmatrix}
m_{11} & m_{21} & m_{31} & m_{41} & m_{51} & m_{61} \\
m_{12} & m_{22} & m_{32} & m_{41} & m_{52} & m_{61} \\
m_{13} & m_{23} & m_{33} & m_{43} & m_{53} & m_{61} \\
m_{14} & m_{24} & m_{34} & m_{44} & m_{54} & m_{61} \\
m_{15} & m_{25} & m_{35} & m_{45} & m_{55} & m_{61} \\
0 & 0 & 0 & 0 & 0 & 1
\end{pmatrix}
\begin{pmatrix}
C \\
M \\
Y \\
K \\
A \\
1 
\end{pmatrix}
```

# マトリックス省略記法

実際に 6x6 全部書くのは面倒なので、省略記法があります。

## n^2 形式

行列パラメータを $n^{2}$ 個(具体的には 1,4,9,16,25)で指定すれば、行列を左上から正方形で詰めて行って残りは単位行列(identiy matrix)で補完します。例えば、乗算効果だけ狙いたい場合は、以下のように使えます。

```shell
% convert in.jpg \
         -color-matrix "1.4 0 0  0 1 0  0 0 1" \
          out.jpg
```

```math
\begin{pmatrix}
R' \\
G' \\
B' \\
\end{pmatrix}
=
\begin{pmatrix}
1.4 & 0 & 0 \\
0 & 1 & 0 \\
0 & 0 & 1 \\
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
\end{pmatrix}
=
\begin{pmatrix}
1.4R \\
G \\
B
\end{pmatrix}
```

|in.jpg|out.jpg|
|---|---|
|![in.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/dcc49b37-ca2a-7c84-ad4b-bafc186fc9c4.jpeg) | ![out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/2788110f-f7af-32a3-effa-e8ab4eb1a3d2.jpeg) |

ちなみに、内部ではこんな行列に補完されています。

```math
\begin{pmatrix}
R' \\
G' \\
B' \\
x' \\
A' \\
1
\end{pmatrix}
=
\begin{pmatrix}
1.4 & 0 & 0 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 \\
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
x\\
A \\
1 
\end{pmatrix}
```

## < m >x< n >: 記法

RGB に対して加算を行いたい場合は、6x6 行列が必要ですが、上の3列だけ指定したくなりますね。以下のようにできます。

```shell
% convert in.jpg \
     -color-matrix "6x3: 1 0 0 0 0 0.4  0 1 0 0 0 0  0 0 1 0 0 0" \
      out.jpg
```

```math
\begin{pmatrix}
R' \\
G' \\
B' \\
\end{pmatrix}
=
\begin{pmatrix}
1 & 0 & 0 & 0 & 0 & 0.4 \\
0 & 1 & 0 & 0 & 0 & 0 \\
0 & 0 & 1& 0 & 0 & 0 \\
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
x \\
A \\
1
\end{pmatrix}
=
\begin{pmatrix}
R + 0.4 \\
G \\
B
\end{pmatrix}
```

|in.jpg|out.jpg|
|---|---|
|![in.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/dcc49b37-ca2a-7c84-ad4b-bafc186fc9c4.jpeg) | ![out2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/0be003fc-9dae-05aa-0748-6d57c1da82f4.jpeg) |

こちらは、内部でこんな行列に補完されます。

```math
\begin{pmatrix}
R' \\
G' \\
B' \\
x' \\
A' \\
1
\end{pmatrix}
=
\begin{pmatrix}
1 & 0 & 0 & 0 & 0 & 0.4 \\
0 & 1 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 \\
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
x \\
A \\
1 
\end{pmatrix}
```

# 応用例

- 色変換行列のうんちく
  - https://qiita.com/yoya/items/95bfb8659f37ea8a2800

こちらの実例と同じ事をします。
色味強調は上の方で示しましたし、グレースケールは -type grayscale で、ネガポジ反転は -negate でできるので、それ以外で。幸い 3x3 で済む簡単な指定ですし。

## コントラスト強調

```shell:
% convert in.png \
         -color-matrix "1.5 0 0  0 1.5 0  0 0 1.5" \
          out.jpg
```

```math
\begin{pmatrix}
R' \\
G' \\
B' \\
\end{pmatrix}
=
\begin{pmatrix}
1.5 & 0 & 0 \\
0 & 1.5 & 0 \\
0 & 0 & 1.5 \\
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
\end{pmatrix}
=
\begin{pmatrix}
1.5 R \\
1.5 G \\
1.5 B
\end{pmatrix}
```

|in.png|out.jpg|
|---|---|
|![640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/f1583cd2-74c2-0853-0f95-e0795ba6fa3e.png) | ![out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/ef9311b5-e4ac-8ceb-605c-46f784f3dba8.jpeg)|



## R,G,B 入れ替え

R と B を 入れ替えます。

```shell:
% convert in.png \
         -color-matrix "0 0 1  0 1 0  1 0 0" \
          out.jpg
```

```math
\begin{pmatrix}
R' \\
G' \\
B' \\
\end{pmatrix}
=
\begin{pmatrix}
0 & 0 & 1 \\
0 & 1 & 0 \\
1 & 0 & 0 \\
\end{pmatrix}
\begin{pmatrix}
R \\
G \\
B \\
\end{pmatrix}
=
\begin{pmatrix}
B \\
G \\
R
\end{pmatrix}
```


|in.png|out.jpg|
|---|---|
|![4x4-256x256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/b479a738-7759-da84-4525-6aca480e8c57.png) | ![out.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/a9f2e0f0-0d71-817f-fa74-39f7ccbfaec5.jpeg) |

# 参考

- -color-matrix matrix
  - https://www.imagemagick.org/script/command-line-options.php#color-matrix
- color-matrix
  - https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=33530
- 色変換行列のうんちく
  - https://qiita.com/yoya/items/95bfb8659f37ea8a2800