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

时间:2009-11-12 21:23:12

标签: java colors

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

我该怎么办?当我从缓冲的Image像素中获取RGB时,它返回一个负整数,我不知道如何用它来实现它。

12 个答案:

答案 0 :(得分:21)

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

获得RGB值后,您可以尝试

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

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

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

答案 1 :(得分:9)

我建议你从这里开始阅读

Color difference formulas如果你想这样做的话。它解释了用于计算色差的ΔE*abΔE*94ΔE*00ΔE*CMC公式。

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:5)

如果您要使用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))

费用为2 Cos,2 Sin和平方根。

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

C² = A² + B² + 2*A*B*Cos(Theta)

其中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);

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

答案 4 :(得分:2)

最简单的方法是将两种颜色转换为HSV值并找出H值的差异。最小的变化意味着颜色相似。您可以自行定义阈值。

答案 5 :(得分:2)

你可能在每个像素上调用getRGB(),它返回的颜色为4 8位字节,高字节alpha,下一个字节为红色,下一个字节为绿色,下一个字节为蓝色。您需要将频道分开。即使这样,RGB空间中的颜色相似性也不是很大 - 使用HSL或HSV空间可能会获得更好的结果。有关转换代码,请参阅here

换句话说:

int a = (argb >> 24) & 0xff;
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = argb & 0xff;

我不知道java缓冲图像中的特定字节顺序,但我认为这是正确的。

答案 6 :(得分:2)

您可以按如下方式获取单独的字节:

int rgb = bufferedImage.getRGB(x, y); // Returns by default ARGB.
int alpha = (rgb >>> 24) & 0xFF;
int red = (rgb >>> 16) & 0xFF;
int green = (rgb >>> 8) & 0xFF;
int blue = (rgb >>> 0) & 0xFF;

答案 7 :(得分:1)

我发现HSL值更容易理解。 HSL Color解释了它们的工作原理并提供了转换例程。与其他答案一样,您需要确定与您类似的方法。

答案 8 :(得分:1)

有一篇关于这个问题的有趣文章:

基于内容的图像和视频检索的相关颜色相似性测量的新感知均匀颜色空间 M. Sarifuddin和Rokia Missaoui的

您可以使用Google或特别是[Google学术搜索。] [1]

轻松找到此信息

总而言之,一些色彩空间(例如RGB,HSV,Lab)和距离测量(例如几何平均和欧几里德距离)是人类对颜色相似性的感知的更好表示。本文讨论了一种新的色彩空间,它比其他色彩空间更好,但它也提供了对常见的色彩空间和距离测量的良好比较。定性*,似乎使用常用颜色空间的感知距离的最佳度量是:HSV颜色空间和圆柱距离测量。

*至少,根据参考文献中的图15。

圆柱距离度量(以Latex表示法):

D_ {cyl} = \ sqrt {\ Delta V ^ {2} + S_1 ^ {2} + S_2 ^ {2} -2S_1S_2cos(\ Delta H)}

答案 9 :(得分:0)

这是与#1634206类似的问题。

如果您正在寻找RGB空间中的距离,假设您将红色,绿色和蓝色值均等地处理,则欧几里德距离将起作用。

如果您想要对它们进行不同的加权,就像将颜色/ RGB转换为灰度时通常所做的那样,您需要将每个组件加权不同的量。例如,使用从RGB到灰度30%红色+ 59%绿色+ 11%蓝色的流行转换:

d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2;

d2的值越小,颜色(r1,g1,b1)(r2,g2,b2)越接近。

但是还有其他颜色空间可供选择,而不仅仅是RGB,这可能更适合您的问题。

答案 10 :(得分:0)

答案 11 :(得分:-2)