1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ImageMagick で -color-matrix を使う

Last updated at Posted at 2021-10-31

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

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

色行列(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} が多そうですね。

\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
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
in.jpg out2.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
640.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
4x4-256x256.png out.jpg

参考

1
2
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
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?