2011-12-10 133 views
6

如果我得到浅灰色的颜色(例如R = G = B = 200)和暗的一个(例如R = 46,G = 41,B = 35),我想两者分类到简单的灰色颜色组(想象一张桌子)。如何将某些颜色分类为颜色范围?

所以,我怎么能组织颜色,颜色组?

+0

你是什么颜色的组织呢? –

+0

你有什么样的颜色组合? – Magnus

+0

我还没有决定。首先,我想创建算法。 (但你可以用50-60组计算) – laszlokiss88

回答

12

对于颜色视觉的分类,它往往是比较容易的颜色转换先到HSL or HSV。要检测灰色,请检查饱和度是否低于某个阈值。要检测其他颜色,请检查色调。

public string Classify(Color c) 
{ 
    float hue = c.GetHue(); 
    float sat = c.GetSaturation(); 
    float lgt = c.GetLightness(); 

    if (lgt < 0.2) return "Blacks"; 
    if (lgt > 0.8) return "Whites"; 

    if (sat < 0.25) return "Grays"; 

    if (hue < 30) return "Reds"; 
    if (hue < 90) return "Yellows"; 
    if (hue < 150) return "Greens"; 
    if (hue < 210) return "Cyans"; 
    if (hue < 270) return "Blues"; 
    if (hue < 330) return "Magentas"; 
    return "Reds"; 
} 

你当然可以使用其他部门。

我做了一个简单的JavaScript应用程序来测试这一点:Color classification

+0

嗯,泰克,我立即尝试。 – laszlokiss88

1

有分类颜色的几种方法。一种方法是将rgb视为一个三维坐标,然后所有可能的颜色都可以在一个盒子或立方体中呈现,其中原色中的黑色和位于(255,255,255)处的对角的白色。所有的灰色将接近对角线。 靠近轴的是红色,绿色和蓝色。 这样分类问题已经转化为找到三维空间中一个点(颜色)和一条线(灰色对角线)之间的最近距离。如果距离低于给定的阈值,颜色将被分类为灰色。

+0

这可以工作,但有点复杂... – laszlokiss88

+0

是的。它与使用HSL/HSV表示法基本上是相同的,但是它已经被转换为圆柱体而不是立方体。 – danca

-1

如何下面颜色表的实现:

​​

而下面的代码编写生成/获得色彩组:

//Generating Color Group Table 
List<ColorTable> MyColorTable = new List<ColorTable>(); 
MyColorTable.Add(new ColorTable { GroupName = "Gray", ColorName = Color.Gray }); 
MyColorTable.Add(new ColorTable { GroupName = "Gray", ColorName = Color.LightGray }); 
MyColorTable.Add(new ColorTable { GroupName = "Green", ColorName = Color.Green }); 
MyColorTable.Add(new ColorTable { GroupName = "Green", ColorName = Color.LightGreen }); 

//Getting required Color Group, say "Gray" 
List<ColorTable> GreenColor = MyColorTable.Where(c => c.GroupName == "Gray").ToList(); 
+0

我刚刚已通过色彩的名字,你可以用范围发送彩色的名字,感谢 –

+0

谢谢,但这不是我的问题的答案。 假设你有一个颜色,用下面的RGB值: 55,83,70(很暗绿色,几乎灰色)
所以,问题是,这组将包含这种颜色?绿色还是灰色? (所以我没有任何预定义的颜色,分类到组,只有几个群名称(与rgb值),例如绿色和灰色。)

但是RGB不是必需的,它可以如果CMYK或者hexa或者任何东西更容易。 – laszlokiss88