【问题标题】:Converting RGB to HSL for higher resolution C++将 RGB 转换为 HSL 以获得更高分辨率的 C++
【发布时间】:2011-05-05 23:15:14
【问题描述】:

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

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

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

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 如果您涉及 HSL,则更多的是改善您可能使用的 lerp 的效果(确切地说,它不会自己这样做)。

标签: c++ colors


【解决方案1】:

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

我说的对吗?如果您需要渲染数百种颜色,但手头只有 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 颜色可能会产生意想不到的结果。

【讨论】:

  • 是我自己还是引号感觉有点“居高临下”? =)
  • 当你写给混合的读者时,这是一个艰难的决定。没有引号,行话对于那些还不理解的人来说就像 gobbledygook 一样。引用太多,对于已经了解的人来说,你听起来像邪恶博士:youtube.com/watch?v=tqos3j07jzc
【解决方案2】:

我不确定我是否完全理解您想要做什么,但听起来您正在寻找一种插值算法来基本上放大您的图像,用原始 14 种颜色之外的值填充空白.

有无数这样的算法,但一个简单的bicubic interpolation 就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    相关资源
    最近更新 更多