我正在寻找一种比较两种RGB颜色并生成其相似性值的算法(其中相似性意味着"与人类平均感知相似").
有任何想法吗?
编辑:
由于我不能回答,我决定将我的"解决方案"作为问题的编辑.
我决定在我的应用程序中使用(非常)小的真彩色子集,以便我可以自己处理颜色的比较.我使用大约30种颜色,并使用它们之间的硬编码距离.
由于它是一个iPhone应用程序,我使用Objective-C,实现或多或少是一个表示下表的矩阵,它显示了颜色之间的距离.
我已经创建了一个函数来查找图像中的颜色,并返回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
Run Code Online (Sandbox Code Playgroud)
结果:
从答案中得出,比较两种颜色的常规方法是欧几里德距离或切比雪夫距离.
我决定大多使用(平方)欧几里德距离和多个不同的颜色空间.LAB,deltaE(LCH),XYZ,HSL和RGB.在我的代码中,大多数颜色空间使用平方的欧氏距离来计算差异.
例如,LAB,RGB和XYZ是一个简单的平方euc.距离的诀窍是:
if ((X-X1)^2 + (Y-Y1)^2 + (Z-Z1)^2) <= (Tol^2) then
...
Run Code Online (Sandbox Code Playgroud)
LCH和HSL稍微复杂一点,因为它们都有圆柱形色调,但是有些数学解决了这个问题,那么它就是使用平方的eucl.这里也是.
在大多数情况下,我为每个通道添加了"单独的参数"(使用1个全局容差和替代"修饰符" HueTol := Tolerance * hueMod或LightTol := …
我为图像构建了一个像素分类器,对于图像中的每个像素,我想定义它属于哪个预定义的颜色簇。它有效,但每张图像大约 5 分钟,我想我正在做一些肯定可以优化的非 Pythonic 的事情。
我们如何将函数直接映射到列表列表上?
#First I convert my image to a list
#Below list represents a true image size
list1=[[255, 114, 70],
[120, 89, 15],
[247, 190, 6],
[41, 38, 37],
[102, 102, 10],
[255,255,255]]*3583180
Run Code Online (Sandbox Code Playgroud)
然后我们定义了将颜色映射到的集群以及执行此操作的函数(取自PIL 库)
#Define colors of interest
#Colors of interest
RED=[255, 114, 70]
DARK_YELLOW=[120, 89, 15]
LIGHT_YELLOW=[247, 190, 6]
BLACK=[41, 38, 37]
GREY=[102, 102, 10]
WHITE=[255,255,255]
Colors=[RED, DARK_YELLOW, LIGHT_YELLOW, GREY, BLACK, WHITE]
#Function to find closes cluster by root and squareroot distance …Run Code Online (Sandbox Code Playgroud) 我有一个包含 20 种颜色的列表,每种颜色都是这样的 (0,0,0)(rgb) 但具有不同的值,我需要找到最接近我给出的颜色,例如 (200, 191, 231) . 问题是我不确定我应该如何检查收盘价是什么颜色,以及我应该如何在列表中设置所有这些颜色值?在数组中?
我一直在想也许添加所有的颜色,例如 (1,2,3) = 4 然后找到最接近的,但我不确定这是否是个好主意..
这是颜色列表:
#(0, 0, 0) - Black
#(127, 127, 127) - Gray
#(136, 0, 21) - Bordeaux
#(237, 28, 36) - red
#(255, 127, 39) - orange
#(255, 242, 0) - yellow
#(34, 177, 76) - green
#(203, 228, 253) - blue
#(0, 162, 232) - dark blue
#(63, 72, 204) - purple
#(255, 255, 255) - white
#(195, 195, 195) - light gray
#(185, 122, …Run Code Online (Sandbox Code Playgroud) python ×4
colors ×2
list ×2
rgb ×2
algorithm ×1
comparison ×1
dictionary ×1
find ×1
numpy ×1
optimization ×1
performance ×1
tuples ×1