将RGB转换为HSL以获得更高分辨率的C ++

时间:2011-05-05 23:15:14

标签: c++ colors

我正在用c ++编写程序,程序是打开图像并在图像周围移动光标以读取光标下的温度。图像有14种不同的色块,我可以读取颜色并将其转换为温度。

接下来我要做的是制作一种方法,可以更高分辨率地显示温度,即有超过14个色块。然后在面板上的GUI底部绘制新的色块,检查我是否可以在视觉上区分300K到30000K范围内不同温度的颜色。

我不确定如何执行这最后一部分。我认为这与将RGB值转换为HSL有关,但我不知道这会给我说28个色块。

任何帮助都将不胜感激。

由于

2 个答案:

答案 0 :(得分:2)

从RGB转换为HSV是一个奇特的步骤,您可以稍后尝试。我想你想渲染看起来像连续颜色渐变的东西:

enter image description here

我说错了吗?如果您需要渲染数百种颜色,但手边只有14种颜色,则需要在相邻颜色之间进行混合,这称为“插值”。

我们将尝试“线性插值”,因为它很简单。您可以稍后尝试“双三次插值”。

假设你要在上面的渐变中渲染一条单色垂直线。首先,您需要确定它应该是什么颜色。假设垂直线的水平位置可以在0到99之间。

然后,您需要找到要混合的14种颜色中的哪两种颜色:

float x = horizontal_position * 13.f / 99.f;
int a = floorf(x);
int b = std::min( 13, a + 1 );

现在您需要在两种颜色之间进行混合以找到垂直线的颜色:

float blend = x - a;
color result = palette[a] * (1-blend) + palette[b] * blend;

上面的伪代码中的“颜色”可以是RGB,YUV,HSV等。这部分取决于您。请注意,HSV是一个“非线性色彩空间”,因此线性混合两种HSV颜色可能会产生意想不到的结果。

答案 1 :(得分:1)

我不确定我到底知道你想做什么,但听起来有点像你正在寻找插值算法来基本上放大你的图像,用原来的14种颜色以外的值填补空白

有许多这样的算法,但简单的bicubic interpolation就足够了。