Image 图像选择颜色

Image 图像选择颜色,image,colors,Image,Colors,我有超过一周的时间阅读关于图像选择性颜色变化的书籍。这意味着从颜色选择器中选择一种颜色,然后选择图像中我想要更改颜色的部分,并将颜色的更改从原始颜色应用到颜色选择器的颜色 例如,如果我在颜色选择器中选择了蓝色,并且在图像中选择了红色部分,那么我应该能够将所有图像中的红色更改为蓝色 另一个例子。如果我有一个有红苹果和橘子的图像,如果我在图像上选择了一个苹果,在颜色纠察中选择了一个蓝色,那么所有的苹果都应该将颜色从红色改为蓝色 我有一些想法,但当然我需要一些更具体的关于如何做到这一点 感谢您阅读给定

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

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

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

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


感谢您阅读

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

处理的第一步:创建一个遮罩图像,它是灰度的,从0.0到1.0不等(或者从0到我们将视为1.0的某个最大值),大小与输入图像相同。对于每个输入像素,测试其颜色是否足够接近所选颜色。如果是“相同”或“足够接近”,则在掩码中放入1.0。如果不一样,请输入0.0。如果是sorta边界,则在中间添加一个值。具体如何操作取决于图像的细节

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

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

最后,使用遮罩将原始图像与颜色变换后的图像混合。将此应用于每个通道-红色、绿色、蓝色:

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

如果在字节数组中执行所有操作,则0是0.0,255是1.0,并且要小心溢出和有符号/无符号问题

>作为一个起点,考虑聚类你的图像的颜色。如果您不知道需要多少集群,那么您将需要方法来确定是否合并两个给定集群。现在,让我们假设我们知道这个数字。例如,给定左边的下面的图像,我将其颜色映射到3个群集,它们具有中间显示的平均颜色,并用其平均颜色表示每个簇,使其在右边。

输出在右边,现在您需要的是替换颜色的方法。假设用户单击图像中的某个位置(单个点),则您知道需要修改的原始图像中的位置。对于下一个图像,用户(me)单击了“橙色”集群包含的一个点。然后他点了点蓝色。由此,您可以制作一个表示“橙色”簇中的点的遮罩,并使用该遮罩进行游戏。我考虑了一个简单的高斯滤波器,然后是一个平坦的放大3x5。然后根据生成的遮罩替换原始图像中的色调(在低通滤波后,其上的值也被视为合成图像的alpha值)


一点也不完美,但是你可以有一个比我更好的聚类,也可以有一个更原始的颜色替换方法。我故意跳过了有关聚类方法、颜色空间和其他方面的细节,因为我在RGB上只使用了基本的k均值,没有对输入进行任何预处理。所以,你可以把上面的结果看作是你能做的任何事情的基线。

除了只想应用到某些区域,你想做的事情是多么相似(如果你不介意Python),这是关于改变色调W/O改变亮度的。除了一个是iPHONTAL。这并不是很简单,它需要适当的颜色聚类。使用的颜色空间可能也会有帮助。谢谢你的回答。嗯,关于这个范围,你是对的。使用选定颜色(图像的选定部分)色调的最小值和最大值,然后使用[min,max]作为范围,怎么样。此范围内的所有内容都将为1.0,如果不同,则将为0.0。我不理解“中间值”。我怎么知道在这种情况下应该输入什么值呢?我还有一些关于这一部分的未解决的问题“并将S乘以所选的常数,以便将与所选颜色对应的HSV坐标移动到目标颜色的HSV坐标”。应该为每个像素计算该常数,以便将值从“旧S”移动到与目标颜色HSV相对应的“新S”?这是另一回事。S在C中介于0和1之间#您可以通过H、S、V、R、G、B、L、A、B或任何数学组合来选择颜色。您可以有一个范围-如果颜色介于一些最小和最大阈值之间,则颜色为“in”。或者,您可以定义某个特定值的最大绝对差值。我描述了一个基本的、简单的例子,但在我的职业生涯中,我不得不编造一些非常混乱的配色面具。“中间值”意味着你不应该对某些范围之外的颜色的0和内部的1.0进行严格区分。您可能会在对象周围获得难看的边缘,并且只有光不均匀的平滑对象的一部分会受到影响(这几乎无处不在)