色调调整保持相同的饱和度和值

时间:2014-04-12 09:02:46

标签: c optimization image-processing

我需要在图像上执行色调调整功能。 由于它涉及UI中的Slider功能,因此算法需要更快。

  1. 我已经使用定点优化等实现了RGB-> HSV-> H adjust-> RGB, 但算法的速度仍然是一个问题。

  2. 我尝试了以下链接中提到的方法 Shift hue of an RGB Color

  3. -

    Color TransformH(
        const Color &in,  // color to transform
        float H
    )
    {
      float U = cos(H*M_PI/180);
      float W = sin(H*M_PI/180);
    
      Color ret;
      ret.r = (.701*U+.168*W)*in.r
        + (-.587*U+.330*W)*in.g
        + (-.114*U-.497*W)*in.b;
      ret.g = (-.299*U-.328*W)*in.r
        + (.413*U+.035*W)*in.g
        + (-.114*U+.292*W)*in.b;
      ret.b = (-.3*U+1.25*W)*in.r
        + (-.588*U-1.05*W)*in.g
        + (.886*U-.203*W)*in.b;
      return ret;
    }
    

    跳过RGB< - > HSV的转换。速度有所改善,但问题是色调,饱和度和价值也在变化。

    我想保持当前像素的相同饱和度和值,但只修改色调组件,我该如何实现它......我们非常感谢您的帮助......

1 个答案:

答案 0 :(得分:2)

我建议使用HSI色彩空间:

// input RGB values
R = ...;
G = ...;
B = ...;

// Transform to HSI color space
I = (R + G + B) / 3.0;
alpha = 1.5 * (R - I);
beta = sqrt(3.0) * 0.5 * (G - B);
H = atan2 (beta, alpha);
C = sqrt (alpha * alpha + beta * beta);


// modify Hue
H = ...;

// Transform back to RGB
beta = sin (H) * C;
alpha = cos (H) * C;

// update RGB values
R = I + (2.0 / 3.0) * alpha;
G = I - alpha / 3.0 + beta / sqrt(3.0);
B = I - alpha / 3.0 - beta / sqrt(3.0);

测试代码:

输入:

输出:

显然,感知更正确的色彩空间可以提供更好的效果但速度更慢。

我测试了你在问题中给出的公式,但它不起作用。