Java 比较RGB颜色,使色差比强度和更显著

Java 比较RGB颜色,使色差比强度和更显著,java,algorithm,image-processing,colors,Java,Algorithm,Image Processing,Colors,当在图像分析过程中比较颜色时,您很快就会发现您可以只使用灰度图像。为什么?因为通常你会这样做: double average = (color.r+color.g+color.b)/3; 基于grascale平均颜色,我制定了一个算法,当在屏幕上查找对象时,该算法实际上非常令人满意(我使用了整个桌面,但这已经足够了): 按平均颜色搜索耗时67毫秒,按精确像素匹配(蓝色边框)搜索耗时1.255秒!(前者在找到第一个匹配后立即终止,而平均颜色算法循环整个图像) 但我想提高GUI的精确度。在GUI

当在图像分析过程中比较颜色时,您很快就会发现您可以只使用灰度图像。为什么?因为通常你会这样做:

double average = (color.r+color.g+color.b)/3;
基于grascale平均颜色,我制定了一个算法,当在屏幕上查找对象时,该算法实际上非常令人满意(我使用了整个桌面,但这已经足够了):

按平均颜色搜索耗时67毫秒,按精确像素匹配(蓝色边框)搜索耗时1.255秒!(前者在找到第一个匹配后立即终止,而平均颜色算法循环整个图像)

但我想提高GUI的精确度。在GUI中,红色按钮看起来就像蓝色按钮,可能匹配错误。这就是我实现颜色敏感积分图像的原因。现在我发现我不知道如何正确地比较颜色和来得到一些真正的色差

假设你有两个由3个元素组成的数组

//Summed colors on the image you're looking for
double sumOnSearchedImage[3];
//Summed colors on currently checked rectangle (in some loop we'll not bother with here)
double sumOnBigImage[3];

数组中的每个数字分别表示红色、蓝色和绿色总和(非平均值)。您如何比较它们,使
rgb(0255255)
rgb(255255255)
之间的差异大于
rgb(170170170)
rgb(255255255)
之间的差异?

使用点积

dc=cos(ang)=dot(col1,col2);
dc=r1*r2+g1*g2+b1*b2
对于标准化的RGB颜色(单位向量),这将为您提供范围
dc=
中的系数,其中
0
表示颜色之间的90度角(最大可能差异),
1
表示相同的颜色(非强度)

性能

每个频道使用8比特。。。所以范围是
,以避免FPU的使用。您可以通过以下方法避免
sqrt
使用非标准化颜色:

dc=(r1*r2+g1*g2+b1*b2)^2/(|col1|^2*|col2|^2)
|col|^2=r*r+g*g+b*b
[edit1]其他信息

标准化颜色是单位3D向量

如果将其转换为8位范围,如
255*(r,g,b)
,则得到每个通道的8位范围,以便可以将每个颜色通道处理为整数或定点小数。对于固定点,您只需更改乘法和除法,其余所有操作都是相同的:

add=a+b
sub=a-b
mul=(a*b)>>8
div=((a<<8)/b)>>8
add=a+b
sub=a-b
mul=(a*b)>>8
div=((a8
当您使用标准化颜色时,则
| col |=1
,因此您不需要
sqrt
或除法。对于固定点,只需右移8位即可…对于整数
而言,
| col |=255
,这也是通过~shift right by 8位来完成的。对于非标准化颜色,您需要除以
| col |
sqr>t和除法,但
dc
系数在范围内
因此,如果使用
dc^2
只需更改系数的线性,这对您和
col^2
来说并不重要
sqrt
用法已过时,因为
col^2=sqrt(r*r+g*g+b*b)^2=(r*r+g+b*b)

为了提高速度,您应该在执行任务之前将整个图像转换为标准化颜色。如果编码正确,对于普通桌面分辨率,它应该大约为
10+ms

[Notes]


还有其他更适合您使用的颜色空间,如度量空间中的HSVrgb(0、255、255)和rgb(255255255)之间的距离已经远远大于rgb(170170170)和rgb(255255)之间的距离

速度不是用距离本身,而是用它们的方块

|(0, 255, 255), (255,255,255)|^2 = 255^2 = 9*85^2
|(170,170,170), (255,255,255)|^2 = 3*85^2

顺便说一句,不要惊讶地发现灰度视觉往往就足够了。好的设计让设计师让事物a)清晰可见,b)至少对18%的人可见,因为只有这么多人在颜色视觉上有问题

假设颜色存在于三维空间中,r、g和b构成三个轴,你有没有考虑过从一种颜色到另一种颜色计算一个向量,然后比较向量的长度/方向,而不是每个轴上差异的总和?我想也许使用像小波这样的变换可以大大提高速度和精度,为什么你要使用简单的rgb格式@我是一个简单的学习者。你必须从某件事开始。所以基本上我所做的就是将结果平方(最初是
abs(color1-color2)
)?是的。简单地用它们自己乘以它。计算距离非常昂贵。但是比较它们非常便宜,因为您不需要使用sqrt()。好的。有趣的是,我一直在考虑同样的方法,但从未意识到这是在比较距离。你知道,当我需要对结果进行非线性分析时,我会使用
sqrt
(结果越小越显著)或
^2
(结果越大越显著)。但在这种情况下,我害怕在计算中抛出一些随机函数。谢谢你的解释。谢谢你的回答!请您详细解释一下您的绩效记录,特别是第一个绩效记录,好吗?