在我的"最疯狂的梦"中,我想将图像传递给这样的方法(伪C#):
string pathToOriginalImg = @"http://commons.wikimedia.org/wiki/File:Mark_Twain_by_AF_Bradley.jpg";
Image colorizedImg = new ColorizeImage(pathToOriginalImg, [array of colors]);
IOW,将要着色的图像的路径与要在着色中使用的颜色数组一起传递给方法。例如,如果我想"西班牙化"马克·吐温的形象,我可能想把西班牙和墨西哥国旗的颜色传给它,比如:森林绿、白色、墨西哥红;西班牙红,黄色。
这可能吗,或者我甚至还差一间小屋就希望这样吗?
您的描述类似于伪彩色,根据映射模式将源颜色映射到新颜色。当然,你将如何绘制地图完全取决于你自己,而以一种有意义的方式(不知何故)为每张图像自动绘制地图充其量几乎是不可能的。然而,您可以定义一些通用规则,例如,如果可用,请始终尝试将绿色映射到其中一个:黄色,然后是蓝色,然后是灰度58%。阅读这里可能会给你更多的想法。作为源图像的256色RGB图像和目标图像的6色RGB图像的示例图案,您可以将256除以6,对于每个"颜色区域",您可以从目标颜色阵列中提供一种新的颜色。生成的图像将只有6种颜色,并且几乎肯定会丢失细节。
这是可能的,但相当复杂。。。
首先,你需要将图像的颜色转换到另一个颜色空间。如果我可以说,RGB不具备人类对颜色感知的特征。所以,如果你想要一个好看的结果,你需要使用另一个(比如HSL)。
有关不同的颜色空间,请参见此处:http://en.wikipedia.org/wiki/Color_space
使用HSL,你可以将一些颜色"移动"到另一个值,但保持亮度和饱和度参数。
这里最大的问题是知道什么时候移动颜色,什么时候保持它,我认为第一次尝试的结果可能看起来很奇怪。
此外,在决定图像中的哪些像素应该修改其色调分量之前,您可能需要运行某种颜色分析。例如,您可以使用精明的边缘检测算法来检测图像中颜色非常均匀的部分,并在检测到的边缘上使用插值而不是颜色替换。这只是一个想法,可能还有很多其他的方法。
这是对如何实现这一目标的广泛解释。
我认为这个链接可以为您提供一些关于图像中颜色操作的有用信息,这可能是一个开始:如何协调彩色图像
此外,在谷歌上搜索Color harmonization
可能会给你一些线索。
我前段时间尝试过这样的东西,如果有时间,我会把它挖出来,然后可以发布所用的代码。在我的代码中,有一些用于颜色空间转换的有用工具等等,它根本没有优化,但当你试图弄清楚如何进行时,它会很有帮助。
如果您的图像使用索引颜色和颜色查找表(LUT),那么您只需要更改LUT即可更改使用该索引的每个像素。
您的图像可能不使用LUT,但您可以使用实用程序使其使用LUT。像ImageMagick这样的东西(使用"-colors"命令)可以减少颜色,然后写一个托盘化的图像。使用第一张不同图像的LUT,您就可以更改颜色(使用ImageMagick"-clust"命令来执行此操作)。
这篇文章的答案可能会对你有所帮助,它用于在图像上创建覆盖,该覆盖可以是你的标志或你想要的任何