質問: 「自然な彩度」について調べているのですが、スケール対数曲線による自然な彩度補正に掲載されている内容が良く分かりません --- **線形補正について** -evaluate multiply の値を変えるだけですか? 線形補正1.2 ``` $ convert 前.jpg -colorspace hsl -channel g -evaluate multiply 1.2 +channel -colorspace srgb 後.jpg ``` 線形補正2 ``` $ convert 前.jpg -colorspace hsl -channel g -evaluate multiply 2 +channel -colorspace srgb 後.jpg ``` --- **スケール対数補正1.3について** 下記何れですか? ``` $ convert 前.jpg -colorspace hsl -channel g -evaluate log 1 +channel -colorspace srgb 後.jpg $ convert 前.jpg -colorspace hsl -channel g -evaluate log 1.3 +channel -colorspace srgb 後.jpg ``` ・「-evaluate log 1」と書くだけで、自動的に「log(1+1.3*0.5)/log(1+1.3)」計算を行うのですか? ・「0.5」はオリジナルの画像彩度の比率? --- **ガンマ補正1.36について** ``` $ convert 前.jpg -colorspace rgb -gamma 1.36 g -evaluate log 1.3 +channel -colorspace srgb 後.jpg ``` ・上記のように書いたら、「0.5 ^ (1/1.36)」計算を行う、ということですか? ・「0.5」はオリジナルの画像彩度の比率? --- < 追記 > **Q1.-evaluate log について** ``` -evaluate log value ``` と書くと、内部で下記が処理が行われる、ということですか? ここでのuは「-evaluate」より前に書かれた内容から取得した、正規化された値を指す? ``` log(value × u + 1) / log(value + 1) ``` **Q2.正規化されたピクセル値の意味について** ある特徴に基づいて集めた画像ピクセル値のことですか? **Q3.ガンマ補正1.36について** 下記何れでも良い? ``` -gamma 1.36 -evaluate pow 1/1.36 ```
回答: imagemagick 公式ページのマニュアル に全部解説されていますが読みました? 各ピクセルに対して「値」を正規化した上で 事前に `-channel` 等で対象を限定した後 `-evaluate` で対象ピクセルの値 `u` と、計算式に指定した値 `value` で演算します とあります。リンク先ページは `saturation` 彩度の変更を扱っているので、彩度を選択するには `-colorspace hsl -channel g` を指定するとよいと主張しています。そうすると先に書いた `-evaluate` の `u` の値は彩度になります。 `multiply` は明示されてませんが `u * value` `log` は `log(value * u + 1) / log(value + 1)` `pow` は `u ^ value` `gamma` は指定した値の逆数で `pow` するので `u ^ (1/value)` だそうです。 > > ・「0.5」はオリジナルの画像彩度の比率? > > > まあそうですね。リンク先は彩度 0.5 を 0.6 に変換したい案件があるとき、つまり、上記の各種式で入力 `u=0.5` を与えると出力 `0.6` を出すような式と `value` のセットを求めたうえで、当該式と value をほかの色に適用するとどのように変換されるかを検討しているわけで。飽和してしまうと「不自然」になるから、飽和しないほうが「自然」なはず、そういう式はどれだ?ってことっす。 編集後の質問に対して Q2. 注目中の1点の色(の表現)のことです。複素数を表現するのに直交座標表示と極座標表示があるように、色を表現するにも複数の方法があります。 * RGB 表示 : Red/Green/Blue の三原色で色表示します 各成分に [0, 256) の値を与えることが多いようです * HSV 表示 : Hue/Saturation/Value で色表示します H [0.0, 360) 、 S [0.0, 1.0] 、 V [0.0, 1.0] と定義します。 * HSL 表示 : Hue/Saturation/Lightness で色表示します L として、純色を 0.5 黒を 0.0 白を 1.0 と定義し [0.0, 1.0] の値を与えます。 * CYM 表示 : プリンタ出力用の色表記です(黒に専用インクを使わない場合:詳細略) * CYMK 表示 : 同上(黒に専用インクを使う場合:詳細略) 正規化とは表現方法に適する範囲に収めるということです。 RGB 表現においては 0 以上 255 以下しか扱えない・扱わないという約束なので 256 以上の値は 255 に、 0 未満の値は 0 に、制約しなければなりません。 HSV / HSL も同様。 「赤を強くしたい」とき RGB=[10, 20, 30] な色に対して `Rnew=Rold*2` な演算を加えて RGB=[20, 20, 30] にすると楽です。これができるためには「赤を選ぶ」必要がありますよね。そしてこの演算式だと RGB=[200, 20, 30] な点も RGB=[150, 20, 30] な点も、変換後は同じ色 RGB=[255, 20, 30] になってしまいます(=色つぶれ、不自然) 明るくしたいなら V を大きく、鮮やかにするなら S を大きくすればよいですが、表現方法の約束上 1.0 を超えられません。 1.0 を超えたらすべて 1.0 になるしかない=色つぶれします。 リンク先記事は「自然な」という文言を「色つぶれしない」と定義し、それはつまり、変換前後で各成分値が正規化した範囲を超えない変換式を模索しているわけです。 A1. 各点に対してそういう演算をします、で理解OKです。演算結果が範囲外になるときは当然範囲内に収めます。 A3. 「定数」に式が書けるかどうか未確認です。普通は書けないと考えるべきで `1/1.36` を事前に計算し `0.735294` と書けばOK