我在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值有更复杂的方法.
HSL是一个糟糕的举动.L*a*b是一个颜色空间,用于表示颜色实际上是如何被实现的,并且基于数百个实验的数据,这些实验涉及真实眼睛看不同颜色的人,并说"我可以分辨出这两者之间的区别.但是不是那两个".
L*a*b空间中的距离表示根据这些实验得出的预测的实际距离.
转换为L*a*b后,您只需要测量3D空间中的线性距离.
如果您打算使用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非常有用,你只需要知道它描述的是什么类型的色彩空间.你不能只是将它们打成一个欧几里德函数,并从中得到一些连贯的东西.