我已经做了一个函数来查找图像中的颜色,并返回x,y。现在我需要添加一个新功能,在这里我可以找到具有给定容差的颜色。应该很容易?Python - 查找类似的颜色,最好的方法
代码找到图像色彩,并返回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。这里也是如此。
在大多数情况下,我已经为每个通道的公差添加了“单独参数”(使用1个全局公差和替代“修饰符”HueTol := Tolerance * hueMod
或LightTol := Tolerance * LightMod
)。
在XYZ(LAB,LCH)之上构建的颜色似乎在我的许多场景中表现得最好。 HSL在某些情况下可以产生非常好的效果,而从RGB转换成便宜得多,RGB也非常棒,并且满足了我的大部分需求。
如果在图像中找不到颜色,应该返回一些内容。即错误代码。 – 2012-01-14 17:17:02
你如何定义容差? 'r','g'和'b'单独的范围? – 2012-01-14 17:17:44
我与约翰:你已经尝试过什么?您可以查看[余弦相似度](https://en.wikipedia.org/wiki/Cosine_similarity)并搜索Python实现。 – 2012-01-14 17:20:11