判断两个RGB颜色是否接近

方法一:
转换到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);


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部