我需要在图像上执行色调调整功能。 由于它涉及UI中的Slider功能,因此算法需要更快。
我已经使用定点优化等实现了RGB-> HSV-> H adjust-> RGB, 但算法的速度仍然是一个问题。
我尝试了以下链接中提到的方法 Shift hue of an RGB Color
-
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的转换。速度有所改善,但问题是色调,饱和度和价值也在变化。
我想保持当前像素的相同饱和度和值,但只修改色调组件,我该如何实现它......我们非常感谢您的帮助......
答案 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);
测试代码:
输入:
输出:
显然,感知更正确的色彩空间可以提供更好的效果但速度更慢。
我测试了你在问题中给出的公式,但它不起作用。