比较c#中的RGB颜色

Sap*_*huA 22 c# rgb compare colors

我正试图找到一种比较两种颜色的方法,以找出它们的相似之处.我似乎无法找到关于这个主题的任何资源,所以我希望在这里得到一些指示.

理想情况下,我想得到一个分数,告诉他们有多相似.例如,0到100,其中100将相等,0将完全不同.

谢谢!

编辑:

从答案中了解更多关于颜色的知识我理解我的问题有点模糊.我会尝试解释我需要的东西.

我有一个800x600大小的应用程序窗口的pixeldata(位置和颜色),所以我可以通过检查每个x间隔来查明某个窗口是否打开.

但是,一旦调整应用程序的大小(内容被缩放,而不是移动),此方法就会失败.我可以计算出像素移动的位置,但是由于四舍五入和防眩化,颜色可能略有不同.

在这种情况下,彼得的解决方案对我来说已经足够好了,尽管所有其他回复也非常有帮助,所以我只是向所有人投了赞成票.我确实认为ColorEye的答案是最专业的,从专业的角度来看,所以我把它标记为答案.

小智 20

您正在寻找的是什么Delta-E.

http://www.colorwiki.com/wiki/Delta_E:_The_Color_Difference

它是LAB颜色空间中两种颜色之间的距离.据说人眼无法区分1 DeltaE以下的颜色(我发现我的眼睛可以找到低于1 DeltaE的颜色差异,每个人都不同.)

"色差"有4种公式.

  • Delta E(CIE 1976)
  • Delta E(CIE 1994)
  • Delta E(CIE 2000)
  • Delta E(CMC)

检查本网站上的数学链接:

所以正确的答案是使用给定的公式将RGB转换为LAB,然后使用DeltaE 1976来确定颜色的"差异".结果为0表示相同的颜色.任何高于0的值都可以通过以下规则判断:"大多数人无法区分1或更小的delta e".

  • 谢谢你的回复,我担心这会像这样复杂.我会标记你的答案,因为它是最准确的,虽然可能会像Pieter那样找到解决方案. (2认同)

Joe*_*ack 12

有一个开源的.net库,可以让你轻松完成:https://github.com/THEjoezack/ColorMine

比较颜色最常用的方法是CIE76:

var a = new Rgb { R = 149, G = 13, B = 12 }
var b = new Rgb { R = 255, G = 13, B = 12 }

var deltaE = a.Compare(b,new Cie1976Comparison());
Run Code Online (Sandbox Code Playgroud)


hon*_*bis 11

颜色有不同的重量影响人眼.因此,使用计算出的权重将颜色转换为灰度:

灰色= .11*B + .59*G + .30*R.

你的差异将是(GrayColor1 - GrayColor2)*100.0/256.0

这实际上是常用的,非常简单的方法,用于计算图像处理中的图像差异.

- 这是一个非常简单且仍然可用的公式 - 即使在商业应用中也是如此.如果你想要深入,你应该看看名为CIE1976,CIE1994,CIE2000和CMC的色差方法.在这里你可以找到更详细的信息:http: //en.wikipedia.org/wiki/Color_difference

  • 是的,没错。但它是基本的,它在现实世界中有效。用更多信息编辑了答案。 (2认同)

Han*_*ant 11

将RGB颜色转换为HSL颜色空间通常会产生良好的结果.检查维基百科的转换公式.你可以根据H,颜色,S,颜色的"深度"和L的差异来分配权重,它是多么明亮.

  • 重量L肯定比其他重.我们的眼睛对亮度的变化比对颜色的变化更敏感. (2认同)

Pie*_*kel 9

像这样的东西:

    public static int CompareColors(Color a, Color b)
    {
        return 100 * (int)(
            1.0 - ((double)(
                Math.Abs(a.R - b.R) +
                Math.Abs(a.G - b.G) +
                Math.Abs(a.B - b.B)
            ) / (256.0 * 3))
        );
    }
Run Code Online (Sandbox Code Playgroud)

  • @SaphuA:在某些情况下它可能是"正确的",但它仍然是非常错误的.举一个简单的例子,颜色0x7f0000和0x007f00将产生(大致)与比较0xb2b2b2和0xffffff相同的结果.换句话说:鲜红色和亮绿色被认为与白色和浅灰色一样接近.这不太可能是你想要的结果. (3认同)
  • 虽然在数学上听起来不是一个好主意,因为它没有考虑颜色的感知方式.您可以轻松找到相似但会产生低分的颜色对,颜色不同但会产生高分. (2认同)

fub*_*ubo 7

发现了一种有趣的方法,称为Color metric并将其调整为 C#

public static double ColourDistance(Color e1, Color e2)
{
    long rmean = ((long)e1.R + (long)e2.R) / 2;
    long r = (long)e1.R - (long)e2.R;
    long g = (long)e1.G - (long)e2.G;
    long b = (long)e1.B - (long)e2.B;
    return Math.Sqrt((((512 + rmean) * r * r) >> 8) + 4 * g * g + (((767 - rmean) * b * b) >> 8));
}
Run Code Online (Sandbox Code Playgroud)


Pon*_*gge 6

颜色感知取决于许多因素,并且可以以多种方式测量相似性.只是比较R,G和B组分的相似程度通常会得出人们不同意的结果.

在维基百科中有一些关于颜色比较的一般材料,以及在这个问题中使用C#中的自然颜色空间.