将随机颜色分类为一种原色 Windows Phone
Posted
技术标签:
【中文标题】将随机颜色分类为一种原色 Windows Phone【英文标题】:Categorize a random color into one of the primary colors Windows Phone 【发布时间】:2013-06-24 06:50:00 【问题描述】:我正在尝试创建一个接受随机颜色值的方法,然后检查它最接近哪些原色。
我想我必须比较它的 RGB 值并查看它在这些原色范围内的位置,然后将其设置为红色、黄色或蓝色等。
这样做的最佳方法是什么?谢谢
编辑 这个问题被标记为重复,但我检查了上述重复问题的另一个答案,但它没有提供我想要的答案。
使用公式
d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)
有时会为不同的颜色产生相同的值。例如,输入颜色为R170 : G0 : B255
。使用公式,与白色 R255 : G255 : B255
和红色 R255 : G0 : B0
的距离产生 (int)269。那么哪个颜色更接近,红色还是白色?我从列表中删除了黑白,但对于其他一些颜色,问题仍然存在。
我正在比较几种颜色,即:黑色、白色、红色、石灰。蓝色,黄色,青色。此处的 RGB 颜色表中列出的洋红色和灰色 rapidtables.com/web/color/RGB_Color.htm
【问题讨论】:
我会将其视为一个向量,并从每个极坐标 (0,1,0)、(1,0,0)、(0,0,1) 中找到大小,(参见 @987654321 @) (以上应该是 255 而不是 1) 好建议..让我们看看我是否可以按照这个想法编写一些代码。 如果有帮助,我已经添加了伪 【参考方案1】:我面前没有 IDE,但这是我的伪评论(如有必要,可以稍后更新)
var closestColor
Get vector magnitude of( myR + 255, myG, myB)
set closestColor to Red
Get vector magnitude of( myR , myG+ 255, myB)
If(Green is closer than red)
set closestColor to Green
Get vector magnitude of( myR , myG, myB + 255)
If(Blue is closer than closestColor)
set closestColor to Blue
Return closest color
更新
我做了一个带有扩展名的快速 linq 示例
public static double VectorMagnitude(this Color c, Color otherC)
return Math.Sqrt(((int)(c.R + otherC.R))^2 +
((int)(c.G + otherC.G))^2 +
((int)(c.B + otherC.B))^2);
private static List<Color> Colors()
return new List<Color>()
Color.Red,
Color.Blue,
Color.FromArgb(0,255,0)
;
var l = Colors().OrderBy(x => x.VectorMagnitude(
Color.FromArgb(255, R, G, B))).FirstOrDefault();
【讨论】:
对此进行了测试,但我发现由于它基于平均距离,因此两种不同的颜色可能会给出相似的“接近度”。例如输入颜色R170 : G0 : B255
与白色`R255:G255:B255`和红色R 255 : G0 : B0
的距离使用公式产生(int)269
你不追求与白色的距离,你追求与纯红色/蓝色/绿色的距离
对。但是,如果我也想与其他“基本”颜色进行比较怎么办?我的清单包含黑色、白色、红色、石灰。蓝色,黄色,青色。此处的 RGB 颜色表中列出的洋红色和灰色 rapidtables.com/web/color/RGB_Color.htm
Putra,在您的示例中,它应该返回最接近蓝色
我认为你是对的,我面临的问题是将距离值添加为字典键时,有时会产生相似的值。但我想知道如果两种颜色的距离最近怎么办?就像在我的示例中一样,如果除了两者之外没有最接近的值怎么办?【参考方案2】:
如果您想在两种颜色之间进行真正的比较,则不应使用 RGB 颜色空间。 它不适合颜色计算。
最好的办法是将其转换为 LAB 色彩空间。 LAB space
要实现这一点,您需要将 RGB 转换为 XYZ 值,然后将这些值转换为 LAB。你可以在这个网站上找到计算方法:Bruce Lindbloom
当您拥有 LAB 颜色时,您可以选择差异公式。最简单的是 CIE74,但如果您想要最准确的结果,您需要使用 CIEDE2000。 Difference Formulas
在过去的 5 个月里,我在我从事的一个项目中使用了这些公式,所以如果您需要任何帮助,请告诉我。
【讨论】:
以上是关于将随机颜色分类为一种原色 Windows Phone的主要内容,如果未能解决你的问题,请参考以下文章