【问题标题】:Is it possible to programmatically colorize an image? [closed]是否可以以编程方式为图像着色? [关闭]
【发布时间】:2014-04-01 19:34:30
【问题描述】:

在我“最疯狂的梦想”中,我想将图像传递给这样的方法(伪 C#):

string pathToOriginalImg = @"http://commons.wikimedia.org/wiki/File:Mark_Twain_by_AF_Bradley.jpg";
Image colorizedImg = new ColorizeImage(pathToOriginalImg, [array of colors]);

IOW,将要着色的图像的路径以及要在着色中使用的颜色数组传递给方法。例如,如果我想“西班牙化”马克吐温的这张照片,我可能想将西班牙和墨西哥国旗的颜色传递给它,例如:森林绿、白色、墨西哥红;西班牙红、黄。

这可能吗,还是说我还差一个小木屋,甚至希望这样?

【问题讨论】:

  • 您可以轻松更改图像每个像素的颜色。一个完全不同的故事是,这些变化对你来说是“有意义的”,也就是说:最终的图像看起来就像你想要的那样。将图片视为一堆连续的正方形(数百万个):执行或多或少复杂/同步的修改可能成为一项非常困难的任务。
  • 嗯 - 之前/之后的例子?
  • hmm,有趣的是,我想您可以使用标准的“posterize”函数将图像转换为多种颜色,然后使用另一个函数将这些颜色中的每一种替换为目标颜色。不知道它是否看起来不错......
  • 用西班牙语教马克吐温图片的功能怎么样?如果有用,试试这个:Image TeachSpanish(Image img) { return img; } ...不要问我它是如何工作的,它就是这样
  • 我怀疑您总是可以使用具有预定颜色集的抖动算法。结果不会很好,但这是一个开始。对于一个非常粗略的版本,迭代图像中的像素并将它们的距离(您可以使用通常的公式sqrt(r^2 + g^2 + b^2))与每种颜色进行比较。替换最接近原始像素的颜色。更复杂的算法可以使用抖动来混合颜色以创建更多的渐变效果。

标签: c# image image-processing graphics colorize


【解决方案1】:

您的描述类似于pseudocoloring,您可以根据映射模式将源颜色映射到新颜色。当然,您将如何映射完全取决于您,并且以一种有意义的方式(以某种方式)为每张图像自动化它充其量几乎是不可能的。但是,您可以定义一些一般规则,例如始终尝试将绿色映射到其中一个(如果可用):黄色,然后是蓝色,然后是 58% 的灰度。 阅读here 可能会给你更多的想法。 作为 256 色 RGB 图像作为源图像和 6 色作为目标图像的示例模式,您可以将 256 除以 6,并且对于每个“颜色区域”,您可以从目标颜色数组中提供一种新颜色。生成的图像将只有 6 种颜色,并且几乎肯定会丢失细节。

【讨论】:

    【解决方案2】:

    这是可能的,但相当复杂......

    首先,您需要将图像的颜色转换为另一个颜色空间。如果我可以说,RGB 不具备人类感知颜色的特征。所以如果你想要一个好看的结果,你需要使用另一个(比如 HSL)。

    查看这里了解不同的色彩空间:http://en.wikipedia.org/wiki/Color_space

    使用 HSL,您可以将某些颜色“移动”到另一个值,但保留亮度和饱和度参数。

    这里最大的问题是知道何时移动颜色以及何时将其保持在原位,我认为第一次尝试的结果可能看起来很奇怪。

    在决定图像中的哪些像素应该修改其色调分量之前,您可能需要运行某种颜色分析。 例如,您可以使用精明的边缘检测算法来检测图像中颜色非常均匀的部分,并在检测到的边缘上使用插值而不是颜色替换。这只是一个想法,可能还有很多其他方法。

    这是对如何实现这一目标的广泛解释。

    我认为此链接可以为您提供有关图像颜色处理的一些有用信息,这可能是一个开始: How to harmonize a color image

    关于Color harmonization 的谷歌搜索也可以为您提供一些线索。

    我前段时间尝试过这样的事情,如果我有时间我会挖掘它并发布使用的代码。在我的代码中有一些有用的颜色空间转换工具和类似的东西,它根本没有优化,但是当你试图弄清楚如何继续时它会很有帮助。

    【讨论】:

      【解决方案3】:

      如果您的图像使用索引颜色和颜色查找表 (LUT),那么您只需更改 LUT 即可让使用该索引的每个像素都发生变化。

      您的图像可能不使用 LUT,但您可以使用实用程序使其使用 LUT。 ImageMagick 之类的东西(使用“-colors”命令)可以进行颜色减少,然后编写一个托盘化的图像。首先使用来自不同图像的 LUT,然后您就可以更改颜色(使用 ImageMagick “-clut” 命令来执行此操作)。

      【讨论】:

        【解决方案4】:

        this 帖子上的答案可能会对您有所帮助,它用于在图像上创建叠加层,该叠加层可以是您的标志或您想要的任何东西

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-18
          • 1970-01-01
          • 1970-01-01
          • 2020-06-19
          • 2015-07-09
          • 2015-03-11
          相关资源
          最近更新 更多