我已經做了一個函數來查找圖像中的顏色,並返回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