1

我正在尝试调整图像的亮度和对比度。我查看了关于将 RGB 转换为 HSL/HSV 然后调整和转换回来的wiki 文章,但这会产生非常奇怪的输出。所以现在我正在查看其他示例,它似乎工作正常。唯一的问题是如何同时调整亮度和对比度?

所以说我有 100 100 100 的 RGB,然后我想将亮度调整为两倍,对比度为一半...... 2 和 0.5。我该怎么做呢?根据第二个链接,我会将 100 添加到所有 RGB 值的亮度,然后将这些新的 RGB 值插入到对比度公式中?

有人有想法么?

PS - 这是在 C 中使用 SDL 和原始 RGB 值。

4

2 回答 2

0

我认为您想在诸如 HSV 之类的空间中工作。特别是您对价值 (V) 感兴趣。有关从 RGB 转换为 HSV/HSL 的公式,请参阅此链接,反之亦然。该代码是javascript,但转换为C是基本的。 http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c

要考虑的另一件事是亮度 (Y) 和亮度 (Y') 我通常使用以下公式计算亮度。 http://en.wikipedia.org/wiki/Luminance_%28relative%29

Y = 0.2126 R + 0.7152 G + 0.0722 B

我不确定最好使用什么:V、Y 或 Y'。Wiki 说“亮度或价值维度的定义不太明显:根据表示的目的和目标,有几种可能性。” http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness

我一直在使用 Y。Y 和 Y' 之间的差异是由于伽马校正。只要您正确考虑它,我认为您可以使用其中任何一个。但也许你可以简单地使用 V 作为对比度和亮度。

最后,要小心考虑伽马校正。

编辑:让我概述一下我认为该过程将如何进行。

  1. 将颜色分量转换为浮点数
  2. 如果颜色在 sRGB(非线性)中,则转换为 RGB(线性)
  3. 将 RGB 转换为 HSV
  4. 缩放值 (V) 以更改亮度。更改饱和度 (S) 以及对比度。
  5. 转换回 RGB
  6. 如有必要,将 RGB 转换为 sRGB。
  7. 将颜色分量转换回范围 [0,255]。
于 2013-04-23T08:50:34.080 回答
0

不确定这是否回答了您的问题,但您使用的是 8 位彩色图片,通常使用 *n*位颜色的调色板或将 8 位分成 3 个红色、3 个绿色和 2 个蓝色。

假设您正在使用调色板,您可能必须调用SDL_SetPalette,因为您的操作会改变颜色。

如果您要拆分为 3/3/2 位,请记住,这意味着红色只有 8 个离散值,绿色只有 8 个离散值,蓝色只有 4 个离散值。在这种情况下,颜色的变化可能看起来很奇怪。

如果只有源是 8 位,我建议在加载后将其转换为 24/32 位。

于 2013-04-22T23:40:14.850 回答