更好的图像着色逻辑/算法

8
我正在开发一个iOS应用程序,用户可以通过触摸图像的一部分(比如茶杯)来改变其颜色。我使用洪水填充算法来填充颜色,这样用户就必须点击茶杯才能改变它的颜色,这个功能正常工作。但是,最终的颜色看起来与替换颜色有些不同。我遇到了一些问题,无法找到更好的逻辑来将对象(茶杯)的颜色转换为所选颜色,考虑到饱和度和亮度。
我使用以下逻辑来获取结果颜色。我将颜色表示为(色调,饱和度,价值)的形式。
touchedColor = (tchd_h, tchd_s, tchd_v); // I am not using this now 

pixelColor = (old_h, old_s, old_v); 
replacementColor = (new_h, new_s, new_v);
resultColor = (new_h, new_s, old_v);
pixelColor = resultColor;

涂漆前的杯子(用红色圈出)。

enter image description here

所选的替换颜色。

enter image description here

涂漆后的杯子(用红色圈出)。

enter image description here

请看上面的最终图像。由于我只改变了色相和饱和度,而没有改变像素颜色明度,因此应用的颜色看起来与所选的替换颜色不太相似。图像的亮度保持不变。

如果我像这样同时改变明度、色相和饱和度

resultColor = (new_h, new_s, new_v);
pixelColor = resultColor;

然后,杯子变成了平面的颜色,失去了光影效果,就像这样:

enter image description here

我想得到一些想法来调整上述逻辑,使像素颜色变成匹配的替代颜色。也许有一些公式可以得出饱和度和明度


也许您可以给我们展示一个您认为有问题的例子?我并没有看到基本前提存在任何问题。 - Mark Ransom
@Mark Ransom,是的,我已经更新了我的问题并附上了图片。 - EmptyStack
1个回答

3
在你的例子中,我们把粉色称作“要替换的颜色”,而把棕色称为“替换颜色”。对于目标中的每个像素,在源图像中找到相应的像素。查看它与“要替换的颜色”的差异。现在,对“替换颜色”进行类似的调整,并将其用作当前输出像素的颜色。
例如,如果当前源像素比要替换的颜色暗5个“v”单位,则将输出像素设置为由替换颜色调暗5个“v”单位得到的颜色。(您还需要进行同样的色调和饱和度调整。)
您可能需要限制您所调整的颜色范围,以免将其他对象变成不同的颜色。

谢谢您的回复。我理解您的意思,但我不知道如何实时实现它。您能给我展示一些伪代码或类似的东西吗?我已经努力尝试了一个多月,但仍然无法实现。 - EmptyStack
要实时完成它,您可以尝试使用glsl编写OpenGL着色器。一个基本的伪代码算法可能是这样的:pixelColor = (old_h, old_s, old_v); pixelDiff = (touched_h - old_h, touched_s - old_s, touched_v - old_v); resultColor = (new_h - pixelDiff.h, new_s - pixelDiff.s, new_v - pixelDiff.v); - user1118321
根据所选颜色计算resultColor并不能得到均匀的输出,因为汽车颜色不是纯色。例如,如果我选择了汽车上的深色,则会产生一种变体的输出,而如果我选择了浅色,则输出会有所不同。 - EmptyStack
你可以随时取得触摸的颜色,并将v分量设置为50%或类似的值。这完全取决于您想要实现的效果。您可以执行更复杂的操作,例如搜索触摸点周围的区域并对其进行平均,或查找在颜色范围内的连接像素并对其进行平均。 - user1118321
我会使用矢量图像来解决这种问题。 - Claudio Ferraro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接