如果我有一个灰色(例如R=G=B=200)和一个深色(例如R=46,G=41,B=35),我想将它们归类为简单的灰色组(想象一张表)。
那么,我如何将颜色组织到颜色组中?
为了对颜色进行视觉分类,通常最好先将颜色转换为HSL或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应用程序来测试这个: 颜色分类
对颜色进行分类的方式有几种。其中一种方式是将rgb视为三维坐标,所有可能的颜色可以在一个盒子或立方体中表示,其中黑色位于原点,白色位于相反角落,位于(255,255,255)处。所有灰色的颜色都靠近对角线,红、绿和蓝色的颜色靠近轴线。使用这种方法,分类问题已转化为在3D空间中找到点(颜色)与线(灰色对角线)之间的最近距离。如果距离低于给定阈值,则将该颜色分类为灰色。
public class ColorTable
{
public Color ColorName { get; set; } //can set color code too
public string GroupName { get; set; }
}
并编写以下代码以生成/获取颜色组:
//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();