2011-12-10 28 views
6

Nếu tôi nhận được màu ánh sáng (ví dụ: R = G = B = 200) và màu tối (ví dụ R = 46, G = 41, B = 35), tôi muốn phân loại cả hai màu nhóm màu xám đơn giản (hãy tưởng tượng một bảng).Làm cách nào để phân loại một số màu thành dải màu?

Vì vậy, làm cách nào để sắp xếp màu sắc cho các nhóm màu?

+0

bạn có ý nghĩa gì khi tổ chức màu? –

+0

Bạn có các nhóm màu nào? – Magnus

+0

Tôi chưa quyết định điều đó. Trước hết, tôi muốn tạo thuật toán. (Nhưng bạn có thể tính toán với nhóm 50-60.) – laszlokiss88

Trả lời

12

Đối với phân loại hình ảnh của màu sắc, nó thường là dễ dàng hơn để chuyển đổi màu trước tiên là HSL or HSV. Để phát hiện màu xám, bạn kiểm tra xem Saturation có nằm dưới ngưỡng nào đó không. Để phát hiện bất kỳ màu nào khác, bạn kiểm tra Huế.

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"; 
} 

Tất nhiên, bạn có thể sử dụng một số bộ phận khác.

Tôi đã tạo một ứng dụng JavaScript đơn giản để kiểm tra điều này: Color classification

+0

Hmm, Thaks, tôi thử ngay lập tức. – laszlokiss88

1

Có một vài cách để phân loại màu. Một cách sẽ xem xét rgb là một tọa độ 3d và tất cả các màu sắc có thể sau đó được thể hiện bên trong một hộp hoặc khối lập phương có màu đen trong origo và trắng ở góc đối diện nằm ở (255,255,255). Tất cả các màu xám sẽ được đặt gần đường chéo. Và màu đỏ, xanh lục và xanh lam gần trục. Cách này vấn đề phân loại đã được chuyển đổi để tìm khoảng cách gần nhất giữa một điểm (màu) và một đường (đường chéo màu xám) trong không gian 3d. Nếu khoảng cách dưới một mức độ nhất định, màu sắc sẽ được phân loại là màu xám.

+0

Điều này có thể hoạt động, nhưng hơi phức tạp một chút ... – laszlokiss88

+0

Có. Về cơ bản nó giống như việc sử dụng biểu diễn HSL/HSV nhưng thay vì một khối lập phương nó đã được chuyển thành một hình trụ. – danca

-1

Làm thế nào về phía dưới bảng màu thực hiện:

public class ColorTable 
{ 
    public Color ColorName { get; set; } //can set color code too 
    public string GroupName { get; set; } 

} 

Và viết dưới mã để tạo/nhận nhóm màu:

//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

Tôi vừa chuyển tên màu, bạn có thể gửi tên màu với các phạm vi, cảm ơn –

+0

Cảm ơn, nhưng đây không phải là câu trả lời cho câu hỏi của tôi. Hãy tưởng tượng rằng bạn có màu, với các giá trị RGB sau: 55,83,70 (rất xanh đậm, gần như xám)
Vì vậy, câu hỏi đặt ra là nhóm nào sẽ chứa màu này? Màu xanh lá cây hoặc màu xám? (Vì vậy, tôi không có bất kỳ màu nào được xác định trước, được phân loại theo nhóm, chỉ một vài tên nhóm (với giá trị rgb), ví dụ: xanh và xám.)

Nhưng RGB không cần thiết, nó có thể là CMYK hoặc hexa hoặc bất cứ thứ gì, nếu nó dễ dàng hơn. – laszlokiss88

Các vấn đề liên quan