更好的图像着色逻辑/algorithm

我正在开发一个iOS应用程序,用户可以通过触摸它来改变图像颜色的一部分,例如茶杯。 我正在使用Floodfillalgorithm来填充颜色,以便用户不得不点击茶杯来改变颜色。 这工作正常。 但是,最终的颜色看起来与replace颜色不同。 我有一些问题find一个更好的逻辑来转换对象的(茶杯)颜色为选定的颜色考虑其饱和度和亮度。

我正在使用以下逻辑来获取结​​果颜色。 我将颜色表示为(色调,饱和度,值)

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; 

绘画之前的杯子(用红色圈起来)。

在这里输入图像说明

所select的replace颜色。

在这里输入图像说明

杯子涂上替代颜色(用红色圈起来)。

在这里输入图像说明

看到上面的最后一张图片。 由于我仅更改色相和饱和度 ,而不是pixelColor ,因此所应用的颜色与所选replace颜色看起来不相似。 图像的亮度保持不变。

如果我像这样改变色调和饱和度

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

然后杯子变成平坦的颜色,错过了这样的灯光和阴影,

在这里输入图像说明

我想要一些想法来调整上面的逻辑,将像素颜色更改为匹配的replace颜色。 可能是一些公式来推导饱和度和价值

在你的例子中,让我们把粉红色称为“replace颜色”,让我们把棕色称为“replace颜色”。 对于目标中的每个像素,find源中相应的像素。 看看它是如何从“颜色replace”。 现在对“Replacement Color”进行类似的调整,并将其用作当前输出像素的颜色。

例如,如果当前源像素比用5“v”单位replace的颜色更暗,则将输出像素设置为以5“v”单位变暗的replace颜色。 (而且,你也想在色调和饱和度上进行相同的调整。)

您可能需要限制您调整的颜色范围,以免使其他对象变成其他颜色。