判断两个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);
在Python中计算两个颜色接近程度,通常会用到颜色空间转换和距离计算。一种常用的方法是将颜色RGB颜色空间转换到CIELAB颜色空间,然后计算两个颜色点之间的欧氏距离。CIELAB颜色空间是一个感知均匀的颜色空间,它能够较好地反映出人眼感知到的颜色差异。 具体步骤如下: 1. 将RGB颜色值转换为CIELAB颜色空间。这通常需要先将RGB值标准化到0-1之间,然后进行一系列的数学转换,包括从RGB到XYZ颜色空间的转换,再从XYZ到CIELAB颜色空间的转换。 2. 计算两个颜色点在CIELAB空间中的欧氏距离。欧氏距离是指在n维空间中两个点之间的真实距离,计算公式为:d = sqrt((x1-x2)² + (y1-y2)² + (z1-z2)²)。在这里,x、y、z分别代表颜色在CIELAB空间中的L(亮度)、a(从绿到红的色度)、b(从蓝到黄的色度)坐标值。 3. 根据计算出的距离值判断颜色接近程度。距离越小,表示颜色接近;反之,颜色差异越大。 下面是一个简单的示例代码,展示如何在Python中使用这种方法计算两个RGB颜色接近程度: ```python from colour import Color import numpy as np def rgb_to_cielab(rgb_color): # 将RGB值转换为CIELAB值 c = Color(rgb_color) cielab_color = c.convert('lab') return cielab_color.lab def calculate_color_difference(rgb1, rgb2): lab1 = rgb_to_cielab(rgb1) lab2 = rgb_to_cielab(rgb2) # 计算欧氏距离 delta_E = np.sqrt((lab1[0]-lab2[0])**2 + (lab1[1]-lab2[1])**2 + (lab1[2]-lab2[2])**2) return delta_E # 示例:计算两个RGB颜色接近程度 color1 = (255, 0, 0) # 红色 color2 = (255, 100, 100) # 稍微偏亮的红色 difference = calculate_color_difference(color1, color2) print("两个颜色接近程度(距离)为:", difference) ``` 请注意,这段代码使用了`colour`库来进行颜色空间的转换,您可能需要先通过pip安装这个库。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值