方法一:
转换到HSV色彩空间,根据hue通道提取
private static double R = 100;
private static double angle = 30;
private static double h = R * Math.Cos(angle / 180 * Math.PI);
private static double r = R * Math.Sin(angle / 180 * Math.PI);
/// 返回两个颜色在HSV颜色空间的距离
public static double DistanceOf(HSV hsv1, HSV hsv2)
{
double x1 = r * hsv1.V * hsv1.S * Math.Cos(hsv1.H / 180 * Math.PI);
double y1 = r * hsv1.V * hsv1.S * Math.Sin(hsv1.H / 180 * Math.PI);
double z1 = h * (1 - hsv1.V);
double x2 = r * hsv2.V * hsv2.S * Math.Cos(hsv2.H / 180 * Math.PI);
double y2 = r * hsv2.V * hsv2.S * Math.Sin(hsv2.H / 180 * Math.PI);
double z2 = h * (1 - hsv2.V);
double dx = x1 - x2;
double dy = y1 - y2;
double dz = z1 - z2;
return Math.Sqrt(dx * dx + dy * dy + dz * dz);
}
/// RGB转换HSV
public static void RGB2HSV(int red, int green, int blue, out double hue, out double sat, out double bri)
{
double r = ((double)red / 255.0);
double g = ((double)green / 255.0);
double b = ((double)blue / 255.0);
double max = Math.Max(r, Math.Max(g, b));
double min = Math.Min(r, Math.Min(g, b));
hue = 0.0;
if (max == r && g >= b)
{
if (max - min == 0) hue = 0.0;
else hue = 60 * (g - b) / (max - min);
}
else if (max == r && g < b)
{
hue = 60 * (g - b) / (max - min) + 360;
}
else if (max == g)
{
hue = 60 * (b - r) / (max - min) + 120;
}
else if (max == b)
{
hue = 60 * (r - g) / (max - min) + 240;
}
sat = (max == 0) ? 0.0 : (1.0 - ((double)min / (double)max));
bri = max;
}
方法二:
计算两个三维向量的距离,距离越近,颜色越接近
(R1-R2)^2 + (G1-G2)^2 + (B1-B2)^2 的值的平方根,即颜色空间的距离
方法三:
计算两个三维向量的夹角,夹角越小,颜色越接近
l1=sqrt(r1*r1+g1*g1+b1*b1);
l2=sqrt(r2*r2+g2*g2+b2*b2);
cos(a)=(r1*r2+g1*g2+b1*b2)/(l1*l2);