在我的“最疯狂的梦想”中,我想将图像传递给类似的方法(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,黄色。
这是可能的吗,或者我甚至想要这样的一个小木屋?
答案 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”命令执行此操作)。