4

例如,我有一个具有这些值的像素:

CGFloat red = 34 // 0 - 255
CGFloat green = 128
CGFloat blue = 190

我想增加亮度,使蓝色为 255。注意:“亮度”是指 LAB 颜色空间中 Photoshop 的 L 分量。看图片!

必须有一个特殊的公式来计算增加亮度的 RGB 值,因为 RGB 值是以非线性方式修改的!

证明:我在 Photoshop 中做了一个测试并创建了相同的颜色,然后打开颜色选择器进行检查:

原色

然后我激活了控制亮度的 LAB 颜色空间的 L 分量(至少这就是我所说的 - 我的意思是由 L 分量控制的亮度。猜猜那是亮度)。

因此,激活 L 后,我向上拖动左侧的滑块,直到 B 达到 255: 修改颜色

现在读取生成的 RGB 值:

CGFloat newRed = 112 // 0 - 255
CGFloat newGreen = 188
CGFloat newBlue = 255

它们之间的区别是:

newRed - red = +78
newGreen - green = +60
newBlue - blue = +65

百分比是:

red shift: +38.42%
green shift: +29.55%
blue shift: +32.01%

这与用于计算 RGB 亮度的已知公式不对应,该公式接近luminance = (red * 0.3) + (green * 0.6) + (blue * 0.1).

显然,它们已经以非线性方式移动。

有没有一种已知的方法可以用 Photoshop 的类似方式从红色、绿色、蓝色中计算出 newRed、newGreen、newBlue?

4

1 回答 1

4

所以你想把一个 RGB 颜色转换成 Lab 颜色空间?当然,这是可能的。

但是有很多不同的标准都被统称为“Lab”颜色。在编写算法时,您需要选择一个使用。Photoshop 尤其使用CIELAB D50 标准,因此如果您需要准确模拟其处理过程,您可能需要使用该标准。

您必须记住的另一件事是 RGB 模型是设备相关的,这意味着为了从 RGB 转换为 Lab,您首先需要从 RGB 转换为与设备无关的绝对色彩空间。Adobe 使用其“Adobe RGB”格式执行此操作,但您可以使用 sRGB 之类的标准。调整过程考虑了 RGB 颜色的设备依赖性,但将颜色转换为与设备无关的颜色。完成后,您可以进行最后一步,将颜色转换为 Lab 颜色空间。

Wikipedia 文章在编写转换算法时提供了一些背景信息和有用的公式。这里有人已经写过这样的转换算法。还有一个用于 MATLAB,您可能可以转换。

根据您的认真程度(可能不是),您还可以下载GIMP的源代码,看看他们是如何实现转换算法的。他们的软件声称支持实验室空间。

但是,在转换回RGB时要小心。Lab 颜色空间可以表示远远超出 sRGB 范围的颜色。即使在 Photoshop 中,一旦将图像转换回 RGB(或 CMYK),您在 Lab 模式下看到的大部分内容都会被丢弃。


编辑:同样值得考虑的是,如果您的唯一目标是在比 RGB 更接近人类颜色感知的颜色空间中调亮颜色,那么您可能根本不需要对 Lab 大惊小怪。许多应用程序通过转换为HSL 或 HSV 颜色空间来做到这一点。(Photoshop 称为 HSV、HSB)。

优点是您可以简单地调整“Lightness”或“Value”值来改变颜色的强度(就像您在 Lab 颜色空间中调整“Luminance”值一样),但转换算法要简单得多(并且通常内置在您选择的语言的标准库中)。

例如,请参阅我对这个问题的回答,了解用 .NET 语言编写的转换算法。

于 2011-06-25T14:25:51.533 回答