给定图像、选定的颜色和目标新颜色 - 你不能做很多不丑陋的事情。您还需要一个范围,一些颜色的变化,因此您可以说一个像素的颜色“足够接近”,而另一个像素的颜色显然“不同”。
处理的第一步:创建一个蒙版图像,它是灰度的,从 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,并小心溢出和有符号/无符号问题。