pgr*_*ras 42
这是一个理论上的解释
和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));
}
Run Code Online (Sandbox Code Playgroud)
Blu*_*eft 27
这是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);
}
Run Code Online (Sandbox Code Playgroud)
我将使用两种颜色之间的3d距离,其中x,y,z是R,G,B值.
看看这个Perl库:
http://metacpan.org/pod/Color::Similarity::RGB
这很容易实现.
只要确保(R1-R2)^ 2 +(G1-G2)^ 2 +(B1-B2)^ 2> =阈值^ 2
此问题的大多数答案将建议在将RGB值映射到3D空间时计算两种颜色之间的距离.该技术的问题在于具有相似色调但不同饱和度或亮度水平的两种颜色可以在3D RGB空间中比具有不同色调但具有非常相似的饱和度和亮度水平的两种颜色更远地彼此映射.换句话说,蓝色和绿色在3D RGB空间中可能比红色的两个阴影更接近.在此应用中,确保团队颜色不同,色调差异的重量应远大于亮度和饱和度.
因此,我将颜色映射从RGB转换为色调,饱和度和亮度级别,然后仅检查色调值是否有足够的距离.
维基百科有一个将RGB转换为HSV的解释. LiteratePrograms有一些示例代码.