【问题标题】:Gray scale image to color灰度图像到彩色
【发布时间】:2026-02-12 22:50:02
【问题描述】:

有没有办法将灰度图像转换为彩色图像?

这里有几个 JPG 示例

  1. Photo 1
  2. Photo 2
  3. Photo 3

ImageMagick 功能强大,但似乎无法转换为彩色版本。

【问题讨论】:

  • 你想用参数 CV_GRAY2BGR 转换成 cvtColor 这样的 3 通道吗?还是“恢复”原来的颜色?
  • 没错!图像曾经是彩色的,现在是灰色的。至少在某种程度上可以恢复颜色。

标签: opencv image-processing imagemagick image-manipulation imagemagick-convert


【解决方案1】:

您无法准确地重新创建在转换为彩色时通过将三个通道聚合在一起而丢失的信息。但是,您可以生成 false 颜色,并且您还可以做出一些对一些/许多图片可能相当合理的假设。

通常,在执行这些类型的操作时,您会创建一个 LUT(查找表)并使用每个像素位置的灰度值来查找替换颜色。因此,如果我们制作一个从红色到绿色再到蓝色的 LUT,图像中的暗色调将映射到红色,中间色调映射到绿色,高光映射到蓝色。让我们试试吧:

convert -size 1x1! xc:red xc:lime xc:blue +append -resize 255x1! rainbowCLUT.png

如果我们现在将其应用于您的图像:

convert yourImage.jpg rainbowCLUT.png -clut result.png

好的,我们现在有了颜色,但这不是很现实。所以,为了做得更好,我们需要开始做一些假设。一个假设可能是图片中有一些很黑的东西(即领带、夹克、一些深色头发或某处的深阴影),另一个假设可能是图像中某处可能有白色高光(即白色背景,眼白),最后我们假设中间某处有一些肉色。所以,让我们制作一个看起来像这样的 CLUT,即从纯黑色到中间的肉色到白色高光:

convert -size 128x1! gradient:black-"rgb(210,160,140)" gradient:"rgb(210,160,140)"-white +append clut.png

(我在它周围放置了一个 1 像素宽的红色边框,以便您可以在 * 的白色背景上看到它)

现在我们可以将它应用到您的图像上:

convert yourImage.jpg -normalize clut.png -clut result.png

注意我还如何使用-normalize 来尝试使图像符合我的假设,即图像中有纯黑色调和纯白色高光。

这种技术只是尝试重新创建图像中不再存在的东西,因此它并不总是有效。当然,如果您知道关于主题、照明等的额外信息,您可以将其构建到 LUT 中。

【讨论】:

    【解决方案2】:

    很遗憾,这是不可能的。灰度图像不包含足够的信息来创建彩色图像。在您看到黑白/灰度图像转换为彩色的情况下,这是在 Photoshop 等应用程序中手动完成的。

    您可以使用 imagemagick 来应用滤镜,但不能重新引入颜色。 http://www.imagemagick.org/Usage/color_mods/#level-colors

    【讨论】:

      【解决方案3】:

      要将图像转换为灰度,您只需取每个像素中 r g b 值的平均值,并将 r g 和 b 设置为该值。因此,几乎不可能将其转换回颜色。关键词非常多,我相信最终会有人发明一些复杂的算法,它会查看周围的像素,查看它们的平均值,并可能得出该区域周围颜色的结论,我不知道。但就目前而言,我认为不幸的是不可能做这样的事情。对不起。

      【讨论】:

        【解决方案4】:

        看看siggraph2016_colorization 我没有尝试过,但看起来很有趣。

        他们提出了一种结合全局先验和局部图像特征自动为灰度图像着色的新技术。

        着色架构:

        他们的模型由四个主要组件组成:低级特征网络、中级特征网络、全局特征网络和着色网络。这些组件都是紧密耦合的,并以端到端的方式进行训练。我们模型的输出是图像的色度,与亮度融合形成输出图像。

        这里是一个示例

        【讨论】: