Skip to content

饱和度调整

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

普通调整

RGB 调整

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

我们计算这种调整方式下 HSL 的变换情况,由于是线性变换,所以 RGB 大小顺序不会变。我们假定 R 最大,B 最小。
L=newmax=(1k)oldmax+avgk

S=newmaxnewminnewmax=newrnewbnewr=(1k)(oldroldb)(1k)oldr+kavg
H=newgnewbnewmaxnewmin60=(1k)(oldgnewb)(1k)(oldmaxoldmin)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(maxavg)/0.5)$$$$k=kvibrance$$$$r=(maxr)k+r=(1k)r+kmax

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

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

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

S=(newmaxnewmin)newmax
S=(1k)(oldmax+oldmin)(1k)oldmax+koldmax
S=(1k)(oldmax+oldmin)oldmax=(1k)oldS

亮度变化:

L=(1k)oldmax+koldmax=oldmax=oldL

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

H=newgnewbnewmaxnewmin60=(1k)(oldgnewb)(1k)(oldmaxoldg)60=oldH

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

另一种方式

Y=0.2125r+0.7152g+0.0722b$$$$S=maxmin$$$$k=1+(1S)vibrance$$$$r=(1k)Y+kr

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

Lch 空间调整

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

参考链接

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

Was this page helpful?

Comments