簡體   English   中英

如何確定一種顏色是否接近另一種顏色

[英]How to determine if a color is close to another 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()函數應該如何看?

這樣的事情怎么樣?

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;
}

(我只是猜到了默認閾值,但您應該將其設置為您想要的。)

基本上,這只是平均計算三個顏色通道在兩種顏色之間是否足夠接近。

一個簡單的方法,測量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;

}

閾值是一個常數,具有您要考慮關閉的最大偏差。

您可以將 3-D 色彩空間距離計算為

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());

更深入的討論可以在這里找到。

這有點主觀且不科學,我曾經在一個項目中使用了以下程序。

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;
}

如果只談論色調,您可以分別比較 RGB 值的差異,如果總差異低於您設置的設定數量,那么您可以將它們稱為接近。

你可以開始:

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

有關色調的更多信息,請參閱: http : //en.wikipedia.org/wiki/Hue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM