如何确定颜色是否接近其他颜色

时间:2014-08-06 19:19:19

标签: c# system.drawing.color

我正在创建一种颜色工具,这个工具应该告诉我颜色是否接近其他颜色, 例如:

Color[] colors = new colors[] { Color.FromArgb(0,0,255), Color.FromArgb(0,109,251)};
//colors[0] IS BLUE
//colors[1] IS BRIGHTER BLUE (#006DFB)
bool TheyClose = ColorsAreClose(colors[0],colors[1]); //TRUE BLUE IS CLOSE
//TheyColse Should Be = TURE

ColorsAreClose()函数应该如何看?

6 个答案:

答案 0 :(得分:5)

这样的事情怎么样?

bool ColorsAreClose(Color a, Color z, int threshold = 50)
{
    int r = (int)a.R - z.R,
        g = (int)a.G - z.G,
        b = (int)a.B - z.B;
    return (r*r + g*g + b*b) <= threshold*threshold;
}

(我只是猜测默认阈值,但你应该把它设置为你想要的。)

基本上,这只是计算三种颜色通道在两种颜色之间是否足够接近。

答案 1 :(得分:5)

一种简单的方法,测量RGB距离:

public bool ColorsAreClose(Color[] colors)
{

    var rDist = Math.Abs(colors[0].R - colors[1].R);
    var gDist = Math.Abs(colors[0].G - colors[1].G);
    var bDist = Math.Abs(colors[0].B - colors[1].B);

    if(rDist + gDist + bDist > Threshold)
        return false;

    return true;

}

阈值是一个常数,您想要考虑的最大偏差接近。

答案 2 :(得分:2)

您可以将三维色彩空间距离计算为

Math.Sqrt(Math.Pow(c1.R-c2.R,2)+Math.Pow(c1.G-c2.g,2)+Math.Pow(c1.B-c2.b,2))); 

或者您可以将色调差异计算为

Math.Abs(c1.GetHue() - c2.GetHue());

可以找到更全面的讨论here

答案 3 :(得分:0)

这有些主观而且不科学,我曾在项目上使用过以下程序。

public bool IsMatch(Color colorA, Color colorB)
{
    return IsMatch(colorA.Red, colorB.Red)
        && IsMatch(colorA.Green, colorB.Green)
        && IsMatch(colorA.Blue, colorB.Blue);
}

public bool IsMatch(double colorA, double colorB)
{
    var difference = colorA - colorB;
    return -5 < difference
        || difference < 5;
}

答案 4 :(得分:0)

如果只是谈论色调,你可以分别比较RGB值的差异,如果总差异低于你设定的设定数量,那么你可以将它们称为关闭。

答案 5 :(得分:0)

您可以从:

开始
double delta = Math.Abs(c1.GetHue() - c2.GetHue());
if(delta > 180)
  delta = 360 - delta;
return delta <= threshold 

有关色调的详细信息,请参阅:http://en.wikipedia.org/wiki/Hue