以编程方式查找相似的颜色

ano*_*non 13 java colors

我在java中有一个缓冲的图像,我想根据颜色值记录每个像素与另一个像素的相似程度.所以具有"相似"颜色的像素将具有更高的相似度值.例如,红色和粉红色的相似度值为1000,但红色和蓝色的相似值为300或更小.

我怎样才能做到这一点.当我从缓冲的Image像素中获取RGB时,它返回一个负整数,我不知道如何用它来实现它.

lav*_*nio 21

首先,你是如何获得整数值的?

获得RGB值后,您可以尝试

((r2-r1)2 +(g2-g1)2 +(b2-b1)2)1/2

这将为您提供距离两个点的3D空间距离,每个点由(r1,g1,b1)和(r2,g2,b2)指定.

或者使用颜色的HSV值有更复杂的方法.

  • 他正在拿立方根,这是不正确的; 它应该是平方根.但是根本不需要扎根,因为你可以像距离本身那样轻松地比较距离的平方,并节省取根的时间. (7认同)

jit*_*ter 9

我建议你从这里开始阅读

色差公式,如果你想这样做.它解释了?E*ab,?E*94,?E*00?E*CMC计算色差公式.


Bre*_*ton 8

HSL是一个糟糕的举动.L*a*b是一个颜色空间,用于表示颜色实际上是如何被实现的,并且基于数百个实验的数据,这些实验涉及真实眼睛看不同颜色的人,并说"我可以分辨出这两者之间的区别.但是不是那两个".

L*a*b空间中的距离表示根据这些实验得出的预测的实际距离.

转换为L*a*b后,您只需要测量3D空间中的线性距离.


Tat*_*ize 6

如果您打算使用HSV,您需要意识到HSV不是三维空间中的点,而是锥体的角度,大小和距离顶部的距离.要计算HSV值的距离,您需要通过变换确定3d空间中的点.

X = Cos(H)*S*V.

Y = Sin(H)*S*V.

Z = V.

对于这两个点,然后取它们之间的欧几里德距离:

Sqrt((X0 - X1)*(X0 - X1) + (Y0 - Y1)*(Y0 - Y1) + (Z0 - Z1)*(Z0 - Z1))
Run Code Online (Sandbox Code Playgroud)

代价为2 Cos,2 Sin和平方根.

或者,你可以实际计算距离,如果你很容易意识到,当平面化到2D空间时,你只需要从原点得到两个向量,并应用cosign定律来找到XY空间中的距离:

C² = A² + B² + 2*A*B*Cos(Theta)
Run Code Online (Sandbox Code Playgroud)

其中A = S*V的第一个值,B = S*V的第二个和cosign是差值theta或H0-H1

然后,您将Z因子考虑在内,将2D空间扩展为3D空间.

A = S0*V0
B = S1*V1
dTheta = H1-H0
dZ = V0-V1
distance = sqrt(dZ*dZ + A*A + B*B + 2*A*B*Cos(dTheta);
Run Code Online (Sandbox Code Playgroud)

请注意,因为cosigns定律给我们C²,我们只需将其插入Z中即可.它的成本为1 Cos和1 Sqrt.HSV非常有用,你只需要知道它描述的是什么类型的色彩空间.你不能只是将它们打成一个欧几里德函数,并从中得到一些连贯的东西.