gpt4 book ai didi

Python - 找到相似的颜色,最好的方法

转载 作者:太空狗 更新时间:2023-10-29 17:24:34 28 4
gpt4 key购买 nike

我创建了一个函数来查找图像中的颜色,并返回 x、y。现在我需要添加一个新功能,我可以在其中找到具有给定公差的颜色。应该很容易吧?

在图像中查找颜色并返回 x, y 的代码:

def FindColorIn(r,g,b, xmin, xmax, ymin, ymax):
image = ImageGrab.grab()
for x in range(xmin, xmax):
for y in range(ymin,ymax):
px = image.getpixel((x, y))
if px[0] == r and px[1] == g and px[2] == b:
return x, y

def FindColor(r,g,b):
image = ImageGrab.grab()
size = image.size
pos = FindColorIn(r,g,b, 1, size[0], 1, size[1])
return pos

结果:

从答案中可以看出,比较两种颜色的常规方法是欧氏距离或切比雪夫距离。

我决定主要使用(平方)欧氏距离和多个不同的颜色空间。 LAB、deltaE (LCH)、XYZ、HSL 和 RGB。在我的代码中,大多数颜色空间使用平方欧氏距离来计算差异。

例如,对于 LAB、RGB 和 XYZ,一个简单的平方 euc。距离很重要:

if ((X-X1)^2 + (Y-Y1)^2 + (Z-Z1)^2) <= (Tol^2) then
...

LCH 和 HSL 稍微复杂一些,因为它们都有圆柱形色调,但一些数学解决了这个问题,然后开始使用平方 eucl。这里也是。

在大多数情况下,我为每个 channel 的公差添加了“单独的参数”(使用 1 个全局公差和替代的“修饰符”HueTol := Tolerance * hueModLightTol : = 公差 * LightMod).


似乎在 XYZ(LAB、LCH)之上构建的色彩空间在我的许多场景中确实表现最佳。虽然 HSL 在某些情况下会产生非常好的结果,并且从 RGB 转换为便宜得多,但 RGB 也很棒,可以满足我的大部分需求。

最佳答案

以对眼睛有意义的方式计算 RGB 颜色之间的距离并不像仅采用两个 RGB 向量之间的欧几里得距离那么容易。

这里有一篇有趣的文章:http://www.compuphase.com/cmetric.htm

C 中的示例实现是这样的:

typedef struct {
unsigned char r, g, b;
} RGB;

double ColourDistance(RGB e1, RGB e2)
{
long rmean = ( (long)e1.r + (long)e2.r ) / 2;
long r = (long)e1.r - (long)e2.r;
long g = (long)e1.g - (long)e2.g;
long b = (long)e1.b - (long)e2.b;
return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}

移植到 Python 应该不会太困难。

编辑:

或者,按照 this answer 中的建议, 你可以使用 HLS and HSV . colorsys模块似乎具有从 RGB 进行转换的功能。它的文档还链接到这些页面,这些页面值得阅读以理解为什么 RGB 欧几里德距离实际上不起作用:

编辑 2:

根据 this answer ,这个库应该有用:http://code.google.com/p/python-colormath/

关于Python - 找到相似的颜色,最好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8863810/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com