是否可以以编程方式为图像着色?

时间:2014-02-28 16:58:12

标签: c# image image-processing graphics colorize

在我的“最疯狂的梦想”中,我想将图像传递给类似的方法(pseudoC#):

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

IOW,将要着色的图像的路径传递给方法,以及要在着色中使用的颜色数组。例如,如果我想要将马克吐温的这张图片“西班牙化”,我可能想要传递西班牙和墨西哥旗帜的颜色,例如:Forest Green,White,MexicanRed; SpanishRed,黄色。

这是可能的吗,或者我甚至想要这样的一个小木屋?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

这可能但非常复杂......

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

请参阅此处了解不同的颜色空间:http://en.wikipedia.org/wiki/Color_space

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

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

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

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

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

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

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

答案 2 :(得分:1)

this帖子上的答案可以帮助您,它可以帮助您创建覆盖图像,覆盖可能是您的旗帜或任何您想要的

答案 3 :(得分:1)

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

您的图片可能不使用LUT,但您可以使用实用程序来使用它。像ImageMagick(使用“-colors”命令)之类的东西可以做减色,然后写一个托盘化的图像。在第一个图像中使用来自不同图像的LUT,并且您已经进行了颜色更改(使用ImageMagick“-clut”命令执行此操作)。