我们正在构建一个体育应用程序,并希望在应用程序的各个部分中加入球队颜色。
现在每个团队都可以使用几种不同的颜色来表示。
我想要做的是做一个检查,验证两个团队的颜色是否在一定范围内,这样我就不会显示两个相似的颜色。
因此,如果团队 1 的主要团队颜色值为 rgb(255,0,0)(或 #FF0000),而团队 2 的主要颜色相似,例如 rgb(250,0,0),那么我们将选择不同的其中一支球队的颜色。
如果可能,我可以采取什么方法进行检查?
谢谢
我们正在构建一个体育应用程序,并希望在应用程序的各个部分中加入球队颜色。
现在每个团队都可以使用几种不同的颜色来表示。
我想要做的是做一个检查,验证两个团队的颜色是否在一定范围内,这样我就不会显示两个相似的颜色。
因此,如果团队 1 的主要团队颜色值为 rgb(255,0,0)(或 #FF0000),而团队 2 的主要颜色相似,例如 rgb(250,0,0),那么我们将选择不同的其中一支球队的颜色。
如果可能,我可以采取什么方法进行检查?
谢谢
这是一个理论解释
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));
}
这是 Java 中的 pgras 算法:
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);
}
这个问题的大多数答案都会建议在将 RGB 值映射到 3D 空间时计算两种颜色之间的距离。这种技术的问题在于,与具有不同色调但饱和度和亮度级别非常相似的两种颜色相比,具有相似色调但不同饱和度或亮度级别的两种颜色在 3D RGB 空间中可能映射得更远。换句话说,在 3D RGB 空间中,蓝色和绿色可能比红色的两种色调更接近。在这个应用程序中,确保团队颜色不同,色调差异应该比亮度和饱和度更重要。
因此,我会将颜色映射从 RGB 转换为色调、饱和度和亮度级别,然后仅检查色调值是否有足够的距离。
我会使用两种颜色之间的 3d 距离,其中 x、y、z 是 R、G、B 值。
看看这个 Perl 库:
http://metacpan.org/pod/Color::Similarity::RGB
这很容易自己实现。
只要确保 (R1-R2)^2 + (G1-G2)^2 + (B1-B2)^2 >= threshold^2
维基百科有许多可用于此的算法的详细信息。
还有这个以前的 StackOverflow 问题:寻找颜色之间的准确“距离”