C 图像处理.亮度和对比度

C 图像处理.亮度和对比度,c,colors,sdl,rgb,C,Colors,Sdl,Rgb,我试图调整图像的亮度和对比度。我看了一下RGB到HSL/HSV的转换,然后调整并转换回来,但这会产生非常奇怪的输出。所以现在我在看,它似乎工作得很好。。唯一的问题是如何同时调整亮度和对比度 假设我的RGB为100,那么我想把亮度调整为两倍,对比度调整为一半。。。2和0.5。我该怎么做呢?根据第二个链接,我将为亮度的所有RGB值添加100,然后将这些新的RGB值插入对比度公式 有人有什么想法吗 注-这是在C语言中处理SDL和原始RGB值。不确定这是否回答了您的问题,但您使用的是8位彩色图片,通常使

我试图调整图像的亮度和对比度。我看了一下RGB到HSL/HSV的转换,然后调整并转换回来,但这会产生非常奇怪的输出。所以现在我在看,它似乎工作得很好。。唯一的问题是如何同时调整亮度和对比度

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

有人有什么想法吗


注-这是在C语言中处理SDL和原始RGB值。

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

假设您使用的是选项板,您可能需要调用,因为您的操作将更改颜色

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


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

我认为您希望在HSV这样的空间中工作。尤其是你对价值(V)感兴趣。有关从RGB转换为HSV/HSL和从vica转换为HSV/HSL的公式,请参见此链接。代码是javascript,但它是转换为C的基础。

另一件需要考虑的是卢敏安策(Y)和Luma(Y)。 我通常使用以下公式计算亮度。

我不确定最好用什么:V,Y,还是Y。Wiki说“轻量级或价值维度的定义不太明显:根据表示的目的和目标,有几种可能性。”

我一直在使用Y。Y和Y'之间的差异是由于伽马校正。只要你能正确解释,我想你可以用任何一种。但也许你可以简单地用V表示对比度和亮度

<>最后,要仔细考虑伽马校正。

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

  • 将颜色组件转换为浮动
  • 如果颜色为sRGB(非线性),则转换为RGB(线性)
  • 将RGB转换为HSV
  • 缩放值(V)以更改亮度。改变饱和度以及对比度
  • 转换回RGB
  • 如有必要,将RGB转换为sRGB
  • 将颜色组件转换回范围[0255]
    奇怪的输出是什么意思?由于某种原因,颜色真的不好,可能是因为我使用的是8位颜色(Uint8)。这应该是正常的,但我想对于转换,你应该使用浮点,因为其中有一些计算,我希望会有一些分割,对吗?是的,我在转换时使用双倍,然后返回RGB时返回。然后应该可以,但维基百科说,在这个模型中存在一些问题,比如改变颜色可以使图像看起来更亮或更暗。。。
    Y = 0.2126 R + 0.7152 G + 0.0722 B