Skip to content

饱和度调整

RGB 和 HSV、HSL 转换中:
1. 饱和度 S 的计算方式:\((max-min) / max\)
2. HSL 中表示亮度的 L 的计算方式为:\((max+min) / 2\)
3. HSV 中表示亮度的 V 的计算方式为:\(max\)

普通调整

RGB 调整

\[ r = r + (avg - r) * k \]

这里的 k 就是调整强度,范围是 0 到 1;其中如果是 1 的话,最后就成了灰度图。这里的 avg 也可以用 YUV 中 Y 来替代,感觉更好,因为这里选哪一个决定了灰度图最后的情况,显然 Y 比 avg 更好。

我们计算这种调整方式下 HSL 的变换情况,由于是线性变换,所以 RGB 大小顺序不会变。我们假定 R 最大,B 最小。

\[ L = newmax = (1 - k) * oldmax + avg * k \]
\[ S = \frac{newmax - newmin}{newmax} = \frac{newr - newb}{newr} = \frac{(1-k)*(oldr - oldb)}{(1-k)*oldr + k*avg} \]
\[ H = \frac{newg - newb}{newmax - newmin} * 60 = \frac{(1 - k) * (oldg - newb)}{(1 - k) * (oldmax - oldmin)} * 60 = oldH \]

可以看到,这种调整方式,色调 H 没有变化,亮度 L 发生变化并且非线性,不符合只调整饱和度的期望;而饱和度 S 虽然变化了,但也是非线性的变化,也不好。

HSL 空间调整

Photoshop 中的调整就是在 HSL 中做的,因此改变饱和度不会改变其他两项:

\[ newS=\left\{ \begin{array}{c} 1 / (1-addS)\,\,* srcS\,\, if\,\,addS\geqslant 0\\ \left( 1+addS \right) \,\,* srcS\,\, if\,\,addS<0\\ \end{array} \right. \]

自然饱和度调整

RGB 直接调

\[ k = (abs(max - avg) / 0.5) \\ \]
\[ k = k * vibrance \\ \]
\[ r = (max - r) * k + r = (1 - k) * r + k * max \]

第一步的 k 的取值范围是 [0, 1.338](取 0 是 RGB 都为 0,取最大是 RGB 只有一个是 255 另外两个是 0)

第二步的 vibrance 是输入的参数强度,最好要保证 1 - k * vibrance 大于 0。因为 k 的范围每张图片不一样,所以这里的强度限制也不同,但前提都是要保证 1 - k * vibrance 大于 0。

再来看第三步,我们算一下变换后的饱和度变换:

\[ S = \frac{(newmax - newmin)}{newmax} \]
\[ S = \frac{(1 - k) * (oldmax + oldmin)}{(1 - k) * oldmax + k * oldmax} \]
\[ S = \frac{(1 - k) * (oldmax + oldmin)}{oldmax} = (1-k) * oldS \]

亮度变化:

\[ L = (1 - k) * oldmax + k * oldmax = oldmax = oldL \]

色调变化,如果 1 - k 大于 0,则 RGB 大小的顺序不会发生变化,因此我们假定 max = r 和 g > b 时:

\[ H = \frac{newg - newb}{newmax - newmin} * 60 = \frac{(1 - k) * (oldg - newb)}{(1 - k) * (oldmax - oldg)} * 60 = oldH \]

所以这样调整,只有 S 发生了 \((1-k)\) 的缩放变化。这也说明了为什么第二步中要保证 \(1-k\) 大于 0,否则 色调会发生变化。而且这里的 \(k\) 是根据每个像素自己算出来的,也就是每个像素不一样,如果一个像素饱和度过大,那么 \(k\) 也就大,这样缩放的程度就会小,因此也不会类似普通的调整那么夸张。

另一种方式

\[ Y = 0.2125 * r + 0.7152 * g + 0.0722 * b \]
\[ S = max - min \]
\[ k = 1 + (1 - S) * vibrance \]
\[ r = (1 - k) * Y + k * r \]

这个就不分析了,和上面也都类似。

Lch 空间调整

HSL 可能不太能完全反应颜色的情况,因此处理后可能偏色,所以 GIMP 用的是 Lch 空间,具体调整请看链接一的文章,也是很简单的调整方式,用到的时候再去细细看吧。

参考链接

1. https://www.rtcdeveloper.cn/cn/community/blog/23855

Comments