Java 彩色逻辑算法
我们正在构建一个体育应用程序,并希望在应用程序的各个部分加入团队颜色 现在,每个团队都可以使用几种不同的颜色来表示 我想做的是执行一项检查,以验证两种团队颜色是否在彼此的特定范围内,这样我就不会显示两种相似的颜色 因此,如果团队1的主要团队颜色的值为rgb(255,0,0)(或#FF0000),而团队2的主要颜色类似,例如rgb(250,0,0),那么我们将为其中一个团队选择不同的颜色 如果可能,我可以采取什么方法来执行检查Java 彩色逻辑算法,java,javascript,algorithm,colors,Java,Javascript,Algorithm,Colors,我们正在构建一个体育应用程序,并希望在应用程序的各个部分加入团队颜色 现在,每个团队都可以使用几种不同的颜色来表示 我想做的是执行一项检查,以验证两种团队颜色是否在彼此的特定范围内,这样我就不会显示两种相似的颜色 因此,如果团队1的主要团队颜色的值为rgb(255,0,0)(或#FF0000),而团队2的主要颜色类似,例如rgb(250,0,0),那么我们将为其中一个团队选择不同的颜色 如果可能,我可以采取什么方法来执行检查 谢谢我会使用两种颜色之间的3d距离,其中x、y、z是R、G、B值 看看
谢谢我会使用两种颜色之间的3d距离,其中x、y、z是R、G、B值 看看这个Perl库: 这很容易自己实现 只需确保(R1-R2)^2+(G1-G2)^2+(B1-B2)^2>=阈值^2>具有可用于此的许多算法的详细信息 还有前面的StackOverflow问题:这里是一个 C语言中的算法:
typedef struct {
unsigned char r, g, b;
} RGB;
double ColourDistance(RGB e1, RGB e2)
{
long rmean = ( (long)e1.r + (long)e2.r ) / 2;
long r = (long)e1.r - (long)e2.r;
long g = (long)e1.g - (long)e2.g;
long b = (long)e1.b - (long)e2.b;
return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
从算法的角度来看,这相当简单。每种颜色表示三维空间中的一个点,颜色之间的差异是这些点之间的距离 这里的要点大概是确保颜色明显不同。如果是这样的话,确定最小距离可能会相当困难。问题是(至少对视力正常的人来说)有些差异比其他差异更容易看到。例如,大多数人对绿色色调的细微差异比对红色或蓝色色调的细微变化更敏感。有一些算法可以考虑到这一点,但它们是基于人类的平均视觉,因此没有一种算法可以保证对任何人都准确无误
为了好玩,您可能想看一看。这个问题的大多数答案都建议在将RGB值映射到3D空间时计算两种颜色之间的距离。这项技术的问题在于,在3D RGB空间中,具有相似色调但饱和度或亮度水平不同的两种颜色可能比具有不同色调但饱和度和亮度水平非常相似的两种颜色映射得更远。换句话说,在3D RGB空间中,蓝色和绿色可能比红色的两个阴影更接近。在这个应用程序中,确保团队颜色不同,色调差异应该比亮度和饱和度更重要 因此,我会将颜色映射从RGB转换为色调、饱和度和亮度级别,然后只检查色调值以获得足够的距离
以下是pgras的Java算法:
public double ColourDistance(Color c1, Color c2)
{
double rmean = ( c1.getRed() + c2.getRed() )/2;
int r = c1.getRed() - c2.getRed();
int g = c1.getGreen() - c2.getGreen();
int b = c1.getBlue() - c2.getBlue();
double weightR = 2 + rmean/256;
double weightG = 4.0;
double weightB = 2 + (255-rmean)/256;
return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
}
我使用了第一次回复中给出的算法,尽管在找到DeltaE库之前,结果并没有达到预期,DeltaE库可以更好地计算颜色之间的距离
这是针对Node.js的,请检查。我必须承认,这对计算机视觉非常有效,但我在回答这个问题时并没有真正考虑解剖学。是的,我想说的是两种颜色看起来有多相似(而不是它们有多相似),我会使用pgras算法。人眼远非完美:我们对绿色比红色或蓝色更敏感,我们的亮度感知是对数的,等等。根据您的应用,您可以使用不同的算法。这个是最简单的。您还可以将RGB因子缩放22,43,35,以获得更好的结果。尽管由蒂亚德默·里默斯玛(Thiadmer Riemersma)编写,但这里称为pgras的红色均值公式是一个进步。然后你进入CIEdE2000,它开始拉伸颜色空间,使眼睛的颜色空间越来越均匀。这还取决于XYZ这样的东西,它可以让你更容易地解释色盲。那页几乎让我恶心。3D空间中的一个点是一个简单的观点,我不同意,但我给颜色视觉测试链接+1,我在第一次阅读时错过了Java标记。java.awt.Color类有一个RGBtoHSB方法用于转换;但是如果有20或30+,那么他必须考虑饱和度和亮度。link-pgras声称,他们的算法比HSV-distance提供更好的结果(这当然是主观的)。正如OP所说,目标是一次只比较两种颜色。我建议,如果RGB距离方法给出的结果不充分,可以尝试使用此方法。正如我在这方面想得更多,当比较饱和度和亮度值较高的颜色时,仅比较色调值会得到很好的结果,而当比较低亮度或低饱和度的颜色时,则会失败。该方法的一个改进是,在检查色调差异之前,检查至少一种颜色是否具有足够高的饱和度和亮度值。rgb值是标准化为0..1的间隔还是0..255范围内的常规值?最好添加一个注释,说明该算法与中描述的技术的比较Wikipedia的文章,例如CIEDE2000。这个算法能在预定义的颜色中找到最接近的颜色吗?@Thariama它们是0-255,由无符号字符(1字节)表示。几年前我写了一篇博客文章。()写这篇文章的人做得很好。实际上,与CIEdE2k相比,它的尺寸非常小。它基本上可以很好地捕获颜色空间和权重的最大最重要的修复。您没有应用“>>8”@sam_k:
>8
是一种糟糕的书写方式。为什么它不好?你能解释一下我的学习目的吗?@sam_k:代码应该写得易于阅读。当你的意思是“除以256”时,写>8
并不能清楚地说明意图,这使它更难理解。有些人这样做的原因是他们(错误地)认为这样做可以加快代码的速度。它没有,甚至没有