将随机颜色分类为一种原色 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的主要内容,如果未能解决你的问题,请参考以下文章

利用Adaboost提高分类性能

有没有一种机器学习算法将分类和回归合二为一

RGBCMYHSVHSL颜色空间

三原色配色表

每个人都逃脱不了「认知三原色」

RGB的光的三原色品红黄青颜料的三原色