图像的选择性颜色

时间:2012-12-12 18:09:52

标签: image colors

我有超过1周的时间阅读图像的选择性颜色变化。它选择颜色选择器中的颜色,然后选择我想要更改颜色的图像部分,并将颜色从原始颜色更改为颜色选择器的颜色。

E.g。如果我在颜色选择器中选择蓝色并且我还在图像中选择了红色部分,我应该能够在所有图像中将红色变为蓝色。

另一个例子。如果我有一个红苹果和橙子的图像,如果我在图像上选择一个苹果,在颜色检测中选择蓝色,那么所有苹果应该将颜色从红色变为蓝色。

我有一些想法但当然我需要更具体的一些方法来实现这个目标

感谢您阅读

2 个答案:

答案 0 :(得分:1)

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

enter image description here enter image description here enter image description here

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

enter image description here

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

答案 1 :(得分:0)

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

处理的第一步:创建一个灰度级的掩模图像,从0.0到1.0(或从0到某个最大值,我们将其视为1.0),以及与输入图像相同的大小。对于每个输入像素,测试其颜色是否足够接近所选颜色。如果它是“相同”或“足够接近”,则在面具中放置1.0。如果不同,则输入0.0。如果是sorta borderline,则设置一个中间值。究竟如何做到这一点取决于图像的细节。

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

一旦你戴上面膜,就把它放在一边。现在对整个图像进行颜色转换。这可能最好在HSV空间中完成。请勿触摸V声道。向S添加常数,模数为360度(或者,如果S存储为字节,则为模256),并将S乘以选定的常数,以使HSV中与所选颜色对应的坐标移动到目标颜色的HSV坐标。将转换后的S和H(未更改的L)转换回RGB。

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

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

如果你在字节数组中完成所有操作,则0为0.0且255为1.0,并注意溢出和有符号/无符号问题。