2013-06-24 3 views
2

Я пытаюсь создать метод, который принимает случайное значение цвета, а затем проверьте, к каким основным цветам он ближе всего.Категоризировать случайный цвет в один из основных цветов Windows Phone

enter image description here

Я полагаю, я должен сравнить его RGB-значения и увидеть, где он находится в пределах этих основных цветов, а затем установить его как красный, желтый или синий и т.д.

Что такое лучший способ сделать это? Благодаря

EDIT Этот вопрос помечен как дубликат, но я проверил другой ответ указанного дубликата вопроса, но она не дает ответа я после.

используя формулу

d = sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2) 
иногда производит

то же значение для различных цветов. Например, введите цвет ввода R170 : G0 : B255. Расстояния от белого R255 : G255 : B255 и красного R255 : G0 : B0 производят (int) 269 по формуле. Итак, какой цвет ближе, красный или белый? Я удалил черный и белый из списка, но проблема по-прежнему возникает для некоторых других цветов.

Я сравниваю с несколькими цветами i.e: черный, белый, красный, известь. синий, желтый, голубой. пурпурный и серый, как указано в таблице цветов RGB здесь. quicktables.com/web/color/RGB_Color.htm

+1

Я бы рассматривал его как вектор и находил величину от каждой полярности (0,1,0), (1,0,0), (0,0,1), (см. [Ссылка] (http: /farside.ph.utexas.edu/teaching/301/lectures/node28.html)) – Sayse

+0

(Выше должно быть 255, а не 1) – Sayse

+0

хорошее предложение .. позволяет посмотреть, могу ли я что-то кодировать по этой идее. – PutraKg

ответ

2

У меня нет IDE infront, но вот мой комментарий в псевдо (может обновить позже, если необходимо)

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 

Update

Я сделал быстрый пример 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(); 
+0

Протестировано, но я обнаружил, что, поскольку он основан на среднем расстоянии, два разных цвета могут дать аналогичную «близость». Например, цвет ввода: «R170: G0: B255», расстояние от белого: «R255: G255: B255» и красный «R 255: G0: B0' произвести (int) 269, используя формулу – PutraKg

+0

, а не после расстояния от белого, после расстояния от твердого красного/синего/зеленого цвета – Sayse

+0

Вправо. Но что, если я хочу сравнить с другими «базовыми» цветами? В моем списке содержится черный, белый, красный, лайм. синий, желтый, голубой. пурпурный и серый, как указано в таблице цветов RGB здесь http://www.rapidtables.com/web/color/RGB_Color.htm – PutraKg

0

Если вы хотите реальное сравнение будет двух цветов, вы не должны использовать цветовое пространство RGB. Он не подходит для цветовых расчетов.

Ваш лучший выбор - преобразовать его в цветовое пространство LAB. LAB space

Для этого вам необходимо преобразовать значения RGB в XYZ и затем преобразовать их в LAB. Вы можете найти расчеты для этого на этом сайте: Bruce Lindbloom

Когда у вас есть цвета LAB, вы можете выбрать формулу разницы. Самый простой из них - CIE74, но если вам нужны самые точные результаты, вам нужно использовать CIEDE2000. Difference Formulas

Я использовал эти формулы за последние 5 месяцев в проекте, над которым я работал, поэтому, если вам нужна помощь, просто дайте мне знать.