图像处理 - 亮度和对比度

时间:2013-04-22 08:13:14

标签: c colors sdl rgb

我正在尝试调整图像的亮度和对比度。我查看了wiki article转换RGB到HSL / HSV,然后进行调整和转换,但这会产生非常奇怪的输出。所以现在我正在看other examples它似乎工作正常..唯一的问题是如何同时调整亮度和对比度?

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

有人有什么想法吗?

P.S - 这是在C中使用SDL和原始RGB值。

2 个答案:

答案 0 :(得分:0)

不确定这会回答你的问题,但你使用的是8位彩色图片,通常使用* n *位颜色的调色板或将8位分成3个红色,3个绿色和2个蓝色。< / p>

假设您正在使用调色板,则可能需要调用SDL_SetPalette,因为您的操作会更改颜色。

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

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

答案 1 :(得分:0)

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

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

Y = 0.2126 R + 0.7152 G + 0.0722 B

我不确定最好使用什么:V,Y或Y'。维基说:“亮度或价值维度的定义不太明显:取决于表示的目的和目标,有几种可能性。” 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]。