饱和度调整
RGB 和 HSV、HSL 转换中:
1. 饱和度 S 的计算方式:\((max-min) / max\)
2. HSL 中表示亮度的 L 的计算方式为:\((max+min) / 2\)
3. HSV 中表示亮度的 V 的计算方式为:\(max\)
普通调整
RGB 调整
这里的 k 就是调整强度,范围是 0 到 1;其中如果是 1 的话,最后就成了灰度图。这里的 avg
也可以用 YUV 中 Y 来替代,感觉更好,因为这里选哪一个决定了灰度图最后的情况,显然 Y 比 avg 更好。
我们计算这种调整方式下 HSL 的变换情况,由于是线性变换,所以 RGB 大小顺序不会变。我们假定 R 最大,B 最小。
可以看到,这种调整方式,色调 H 没有变化,亮度 L 发生变化并且非线性,不符合只调整饱和度的期望;而饱和度 S 虽然变化了,但也是非线性的变化,也不好。
HSL 空间调整
Photoshop 中的调整就是在 HSL 中做的,因此改变饱和度不会改变其他两项:
自然饱和度调整
RGB 直接调
第一步的 k 的取值范围是 [0, 1.338](取 0 是 RGB 都为 0,取最大是 RGB 只有一个是 255 另外两个是 0)
第二步的 vibrance 是输入的参数强度,最好要保证 1 - k * vibrance 大于 0。因为 k 的范围每张图片不一样,所以这里的强度限制也不同,但前提都是要保证 1 - k * vibrance 大于 0。
再来看第三步,我们算一下变换后的饱和度变换:
亮度变化:
色调变化,如果 1 - k 大于 0,则 RGB 大小的顺序不会发生变化,因此我们假定 max = r 和 g > b 时:
所以这样调整,只有 S 发生了 \((1-k)\) 的缩放变化。这也说明了为什么第二步中要保证 \(1-k\) 大于 0,否则 色调会发生变化。而且这里的 \(k\) 是根据每个像素自己算出来的,也就是每个像素不一样,如果一个像素饱和度过大,那么 \(k\) 也就大,这样缩放的程度就会小,因此也不会类似普通的调整那么夸张。
另一种方式
这个就不分析了,和上面也都类似。
Lch 空间调整
HSL 可能不太能完全反应颜色的情况,因此处理后可能偏色,所以 GIMP 用的是 Lch 空间,具体调整请看链接一的文章,也是很简单的调整方式,用到的时候再去细细看吧。
参考链接
1. https://www.rtcdeveloper.cn/cn/community/blog/23855