1

我有超过 1 周的时间阅读有关图像的选择性颜色变化的信息。这意味着从颜色选择器中选择一种颜色,然后选择我想要更改颜色的图像的一部分,并将颜色从原始颜色的变化应用于颜色选择器的颜色。

例如,如果我在颜色选择器中选择了蓝色并且我还选择了图像中的红色部分,我应该能够在所有图像中将红色更改为蓝色。

另一个例子。如果我有一个带有红色苹果和橘子的图像,并且如果我在图像上选择了一个苹果,并且在颜色纠察队中选择了一个蓝色,那么所有苹果都应该将颜色从红色变为蓝色。

我有一些想法,但当然我需要更具体的关于如何做到这一点

感谢您阅读

4

2 回答 2

1

作为起点,请考虑对图像的颜色进行聚类。如果您不知道想要多少个集群,那么您将需要确定是否合并两个给定集群的方法。目前,让我们假设我们知道这个数字。例如,给定下图左侧,我将它的颜色映射到 3 个簇,它们的平均颜色如中间所示,并用平均颜色表示每个簇,得到右图。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

有了右边的输出,现在你需要的是一种替换颜色的方法。假设用户单击图像中的某个位置(单个点),那么您知道原始图像中需要修改的位置。对于下一张图片,用户(我)点击了包含在“橙色”集群中的一个点。然后他点击了一些蓝色调。从那开始,您制作一个代表“橙色”集群中的点的蒙版并使用它。我考虑了一个简单的高斯滤波器,然后是一个 3x5 的扁平膨胀。然后根据生成的蒙版替换原始图像中的色调(经过低通滤波后,其上的值也被视为合成图像的 alpha 值)。

在此处输入图像描述

一点也不完美,但你可以有比我更好的聚类,还有一种不那么原始的颜色替换方法。我故意跳过了关于聚类方法、颜色空间等的细节,因为我只在 RGB 上使用了基本的 k-means,没有对输入进行任何预处理。因此,您可以将上述结果视为您可以做的任何其他事情的基准。

于 2013-01-13T19:00:05.477 回答
0

给定图像、选定的颜色和目标新颜色 - 你不能做很多不丑陋的事情。您还需要一个范围,一些颜色的变化,因此您可以说一个像素的颜色“足够接近”,而另一个像素的颜色显然“不同”。

处理的第一步:创建一个蒙版图像,它是灰度的,从 0.0 到 1.0(或从零到某个最大值,我们将视为 1.0)变化,并且与输入图像的大小相同。对于每个输入像素,测试其颜色是否足够接近所选颜色。如果它“相同”或“足够接近”,则将 1.0 放入掩码中。如果不同,则输入 0.0。如果是分界线,则放置一个中间值。究竟如何做到这一点取决于图像的细节。

这可能在 LAB 空间中效果最好,并根据 A、B 坐标相对于其原点的角度测试相同性。

拿到口罩后,把它放在一边。现在对整个图像进行颜色转换。这可能最好在 HSV 空间中完成。请勿触摸 V 通道。向 S 添加一个常数,模 360 度(或模 256,如果 S 存储为字节)并将 S 乘以选择的常数,以便与所选颜色对应的 HSV 中的坐标移动到目标颜色的 HSV 坐标。将 L 不变的变换后的 S 和 H 转换回 RGB。

最后,使用蒙版将原始图像与经过颜色转换的图像混合。将此应用于每个通道 - 红色、绿色、蓝色:

output = (1-mask)*original + mask*transformed

如果你在字节数组中做这一切,0 是 0.0 和 255 是 1.0,并小心溢出和有符号/无符号问题。

于 2012-11-11T02:52:37.223 回答