【问题标题】:Image processing - Brightness and Contrast图像处理 - 亮度和对比度
【发布时间】:2013-04-22 08:13:13
【问题描述】:

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

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

有人有什么想法吗?

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

【问题讨论】:

  • 奇怪的输出是什么意思?
  • 由于某种原因,颜色确实不正常,可能是因为我使用的是 8 位颜色 (Uint8)。
  • 这应该是正常的,但我想你应该使用浮点数进行转换,因为那里有一些计算,我希望有一些除法吧?
  • 是的,我在转换时使用双精度,然后在返回 RGB 时返回。
  • 那么应该没问题,但是维基百科说在这个模型中存在问题,比如改变颜色会使图像看起来更亮或更暗......

标签: c colors sdl rgb


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我认为您想在 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]。

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多