在c#中比较RGB颜色
我正在尝试找到一种方法来比较两种颜色以找出它们的相似程度。我似乎找不到有关该主题的任何资源,因此我希望在这里得到一些指示。
理想情况下,我希望得到一个分数来表明它们有多相似。例如,0 到 100,其中 100 相等,0 完全不同。
谢谢!
编辑:
从答案中更多地了解颜色我知道我的问题有点模糊。我将尝试解释我需要这个的目的。
我有 800x600 大小的应用程序窗口的像素数据(位置和颜色),因此我可以通过检查每个 x 间隔来查明某个窗口是否打开。
但是,一旦调整应用程序大小(内容被缩放,而不是移动),此方法就会失败。我可以计算像素移动的位置,但由于舍入和抗锯齿,颜色可能会略有不同。
在这种情况下,彼得的解决方案对我来说已经足够好了,尽管所有其他回复也都非常有帮助,所以我只是对每个人都投了赞成票。从专业的角度来看,我确实认为ColorEye的答案是最准确的,所以我将其标记为答案。
I'm trying to find a way to compare two colors to find out how much they are alike. I can't seem to find any resources about the subject so I'm hoping to get some pointers here.
Idealy, I would like to get a score that tells how much they are alike. For example, 0 to 100, where 100 would be equal and 0 would be totally different.
Thanks!
Edit:
Getting to know a bit more about colors from the answers I understand my question was a bit vague. I will try to explain what I needed this for.
I have pixeldata (location and color) of an application window at 800x600 size so I can find out if a certain window is open or not by checking every x-interval.
However, this method fails as soon as the application is resized (the contents are scaled, not moved). I can calculate where the pixels move, but because of rounding and antialising the color can be slightly different.
Pieter's solution was good enough for me in this case, although all other responses were extremely helpfull as well, so I just upvoted everyone. I do think that ColorEye's answer is the most accurate when looking at this from a professional way, so I marked it as the answer.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
您正在寻找的东西称为
Delta-E
。http://www.colorwiki.com/wiki/Delta_E:_The_Color_Difference
这是距离LAB 色彩空间中的两种颜色之间。据说人眼无法区分1 DeltaE以下的颜色(我发现我的眼睛可以发现1 DeltaE以下的颜色差异,每个人都不同。)
“色差”有4种公式。
检查此网站上的数学链接:
所以正确的答案是使用给定的公式将 RGB 转换为 LAB,然后使用 DeltaE 1976 来确定颜色的“差异”。结果为 0 表示颜色相同。任何大于 0 的值都可以通过“Δ e 等于或小于 1 时大多数人无法区分”的规则来判断。
What you are looking for is called
Delta-E
.http://www.colorwiki.com/wiki/Delta_E:_The_Color_Difference
It is the distance between two colors in LAB color space. It is said that the human eye cannot distinguish colors below 1 DeltaE (I find that my eyes can find differences in colors below 1 DeltaE, each person is different.)
There are 4 formulas for 'color difference'.
Check the math link on this site:
So the proper answer is to convert your RGB to LAB using the formula given, then use DeltaE 1976 to determine the 'difference' in your colors. A result of 0 would indicate identical colors. Any value higher than 0 could be judged by the rule 'A delta e of 1 or less is indistinguishable by most people'.
有一个开源 .net 库可以让您轻松完成此操作:https://github.com/hvalidi/ColorMine< /a>
比较颜色的最常见方法是 CIE76:
There's an open-source .net library that lets you do this easily: https://github.com/hvalidi/ColorMine
The most common method for comparing colors is CIE76:
颜色对人眼的影响有不同的权重。
因此,使用计算出的权重将颜色转换为灰度:
灰色 =
.11*B+
.59*G+
.30 * R
您的差异将是
差异 = (GrayColor1 - GrayColor2) * 100.0 / 255.0
,差异范围为 0-100。
这实际上是图像处理中计算图像差异的常用且非常简单的方法。
-编辑
这是一个非常简单且仍然可用的公式 - 即使在商业应用中也是如此。
如果您想深入了解,您应该查看色差方法:CIE1976、CIE1994、CIE2000 和 CMC
在这里您可以找到一些更详细的信息:
http://en.wikipedia.org/wiki/Color_difference
Colors have different weights affecting human eye.
So convert the colors to grayscale using their calculated weights:
Gray Color =
.11 * B +
.59 * G +
.30 * R
And your difference will be
difference = (GrayColor1 - GrayColor2) * 100.0 / 255.0
with difference ranging from 0-100.
This is actually commonly used and very simple approach thats used calculating image differences in image procesing.
-edit
this is the very simple and still usable formula - even in commercial applications.
If you want to go deep you should check out the color difference methods called: CIE1976, CIE1994, CIE2000 and CMC
Here you can find some more detailed info:
http://en.wikipedia.org/wiki/Color_difference
像这样的事情:
Something like this:
将 RGB 颜色转换到 HSL 颜色空间通常会产生良好的结果。检查维基百科的转换公式。您可以为 H(颜色)、S(颜色有多“深”)和 L(颜色有多亮)的差异分配权重。
Converting the RGB color to the HSL color space often produces good results. Check wikipedia for the conversion formula. It is up to you to assign weights to the differences in H, the color, S, how 'deep' the color is and L, how bright it is.
我发现一种有趣的方法,称为颜色度量,并将其改编为 C#
I found a interesting approach called Colour metric and adapted it to C#
颜色感知取决于许多因素,并且可以通过多种方式测量相似性。仅仅比较 R、G 和 B 分量的相似程度通常会得出人类不会同意的结果。
维基百科中有一些有关颜色比较的一般材料以及使用自然色彩空间 C# 中 这个问题。
Colour perception depends on many factors and similarity can be measured in many ways. Just comparing how similar the R, G and B components are generally gives results humans won't agree with.
There's some general material on colour comparisons in wikipedia, and on working with natural colour spaces in C# in this question.
我已经将 Bruce Lindbloom 页面上的 DeltaE2000 代码翻译成 C 语言
。这里:
I've translated the code for DeltaE2000 on Bruce Lindbloom's page into C.
Here: