我正在寻找一种算法或代码来在客户端找到相似的像素(具有相似颜色的像素)并仅更改这些像素的颜色。我搜索了很多,但找不到任何找到相似像素的公式。我想做的东西就像 Photoshop 中的魔术棒工具。因此,使用此工具,我们可以对产品的某些部分进行着色以制作自定义颜色。此外,我们在生产中有一些颜色限制,我们可以只使用一些颜色。我试图用一些公式找到一个逻辑,比如:用画布和java脚本找到每个像素的欧几里得距离与其相邻像素的比较,并比较数量。但它运作不佳。缺点是每张图片都有颜色相似但颜色深浅不同的像素。这个算法在寻找不同的色调方面不是很聪明。
2 回答
您的解决方案可能是让您的用户挥动魔杖!
因此,与其通过单击魔棒来选择一种颜色,不如让用户将魔棒拖过多个像素。
累积用户拖过的任何唯一颜色。
然后根据累积的一组颜色而不是一种颜色进行颜色更改。
是的,它不像 Photoshop 的魔杖容差设置那样自动,但用人眼/大脑代替也不是件坏事!
@Austin 关于色彩理论与人眼协调不佳的观点是正确的。欧几里得方法将进行数学颜色匹配……但人眼对颜色的感知方式非常挑剔。
你提到“不同的色调”......
您可能会考虑以 HSL 颜色格式呈现您的图像,以使颜色比较更容易。
HSL 不是颜色混合(像 rgb 那样),而是将颜色分解为色调(颜色)、饱和度(深度)和亮度(嗯,亮度)。
在 HSL 中,所有色调(颜色)在算术上分组在一起,因此您可以从指定的蓝色加上 10 个最接近的蓝色色调中请求所有蓝色。
到目前为止你有什么?如果您共享迄今为止编写的相关代码(即用于搜索像素、比较像素颜色...),将会很有帮助
如果您还没有,您可能想熟悉一下Floodfill 算法。这将是您的遍历算法的基础。
据我了解,颜色比较并不是一个完全可以解决的问题。三维欧几里德距离测量不是一个坏主意,是一个简单的解决方案。这篇文章建议“[计算]所选颜色中每个组件与当前颜色之间的绝对差异。我们说两种颜色之间的差异是单个颜色组件之间的最大差异。”
然而,人类不会将颜色差异视为红色、绿色和蓝色特征的差异。
您有兴趣阅读的另一页:如何比较两种颜色的相似性/差异。该问题的一个答案建议计算颜色的 HSL 值,然后使用公式:avghue = (color1.hue + color2.hue)/2 distance = abs(color1.hue-avghue)
如果您想了解一些色彩理论,Delta-E可以让您深入了解颜色差异。