【问题标题】:Colorize grayscale image为灰度图像着色
【发布时间】:2011-11-23 04:16:44
【问题描述】:

我有一个灰度图像和一些颜色,以 RGB 三元组表示。我需要使用这个三元组对灰度图像进行着色。

左图代表我们拥有的,右图代表我需要拥有的。 现在在程序中我有一些函数,其中输入是源图像的 R、G 和 B 值,以及应该用作着色值的 RGB 值颜色。 而且我无法决定如何使用颜色 RGB 增加或减少源 RGB 以获得正确的调色板。

语言是 C++,但不是那么重要。 提前致谢。

【问题讨论】:

  • 将三倍乘以灰度值,或者你想要什么花哨的东西?
  • 着色值是否总是纯色分量,例如 0、255、0 - 所以将其着色为绿色?或者它可以接受混合颜色谎言 255、127、0,所以把它涂成橙色?
  • 您用于示例图像的 RGB 三元组是什么?

标签: c++ image graphics image-processing colors


【解决方案1】:

从概念上讲,您可以获取原始图像中每个像素的灰度值,并将其用作绿色值的百分比。所以如果一个像素的灰度值为 87,那么彩色图像中的等效像素将是:

colorized_red = (87 / 255) * red_component(green_shade);
colorized_green = (87 / 255) * green_component(green_shade);
colorized_blue = (87 / 255) * blue_component(green_shade);

【讨论】:

  • 假设“灰度”源图像实际上是一个看起来灰色的RGB三元组,如何计算87
  • 灰度只是三个三元组相同(或极其相似)的颜色。理论上,选择任何一个 r/g/b 值都会得到 87,因为其他两个应该相同或接近(例如 86/88)。
  • 示例图像中显示的效果与这个简单的公式不太匹配。请注意,白色映射到白色,而不是绿色。
  • 是的,马克很聪明。图像应该具有像白纸上的彩色图像一样的效果。
  • 87/255 == 0。这里一切都将是零
【解决方案2】:

其他答案建议将灰度值乘以目标 RGB 颜色。这没关系,但问题是它会改变图片的整体亮度。例如,如果您选择深绿色,则整个图像会变暗。

我认为 RGB 颜色模型不适合这种情况。另一种方法是单独选择颜色,没有关联的亮度,然后对图像进行着色,同时保留每个像素的原始亮度。

算法是这样的:

  • 根据色调和饱和度这两个值选择目标颜色。色调决定颜色的色调(绿色、红色等),饱和度决定颜色的纯度(纯度越低,颜色越变灰)。
  • 现在,对于灰度图像中的每个像素,计算 HLS 颜色模型中的新像素,其中 H 和 S 是您的目标色调和饱和度,L 是像素的灰度值。
  • 将此 HLS 颜色转换为 RGB 并保存到新图片。

有关将 HLS 转换为 RGB 的算法,请参阅 this pagethis page

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 2017-07-31
    • 2010-12-22
    • 2023-02-22
    • 2023-03-26
    • 2012-12-12
    • 2015-07-01
    相关资源
    最近更新 更多