ImageMagick で -color-matrix を使う時のメモです。
元々は -recolor オプションでした。
正直、わかりにくいですが、わかれば大丈夫。
色行列(Color Matrix)そのものは以下の解説を参考にして下さい。
マニュアルの説明
- -color-matrix 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} が多そうですね。
\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)です。
\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 の列を固定にするのが仕様です!!
\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)で補完します。例えば、乗算効果だけ狙いたい場合は、以下のように使えます。
% convert in.jpg \
-color-matrix "1.4 0 0 0 1 0 0 0 1" \
out.jpg
\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 |
---|---|
ちなみに、内部ではこんな行列に補完されています。
\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列だけ指定したくなりますね。以下のようにできます。
% 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
\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 |
---|---|
こちらは、内部でこんな行列に補完されます。
\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}
応用例
こちらの実例と同じ事をします。
色味強調は上の方で示しましたし、グレースケールは -type grayscale で、ネガポジ反転は -negate でできるので、それ以外で。幸い 3x3 で済む簡単な指定ですし。
コントラスト強調
% convert in.png \
-color-matrix "1.5 0 0 0 1.5 0 0 0 1.5" \
out.jpg
\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 |
---|---|
R,G,B 入れ替え
R と B を 入れ替えます。
% convert in.png \
-color-matrix "0 0 1 0 1 0 1 0 0" \
out.jpg
\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 |
---|---|