2015-08-07 3 views
3

Этот вопрос может быть больше связан с человеческой психологиейМетоды количественного определения сходства между двумя цветами?

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

Есть ли у кого-нибудь предложения альтернативных методов сравнения, которые я мог бы использовать?

int squaredDistance(colour a, colour b) 
{ 
    return (a.r - b.r)*(a.r - b.r) + (a.g - b.g)*(a.g - b.g) + (a.b - b.b)*(a.r - b.b); 
} 

int findClosestColour(colour a) //Returns id of colour that most closely matches 
{ 
    int smallestColourDistance = 195075; 
    int colourId = -1; 
    for(int i=0; i<NUMOFCOLOURS; i++) 
    { 
     if(squaredDistance(a, coloursById[i]) < smallestColourDistance) 
     { 
      smallestColourDistance = squaredDistance(a, coloursById[i]); 
      colourId = i; 
      if(smallestColourDistance == 0) 
       break; 
     } 
    } 
    return colourId; 
} 
+1

Вы посмотрели: http://stackoverflow.com/questions/5392061/algorithm-to-check-similarity-of-colors-based-on-rgb-values-or-maybe-hsv? – NathanOliver

+0

К сожалению, извините, спасибо :), похоже, что это поможет выделить. –

+0

Во-первых, я бы предостерег от работы в цветовом пространстве RGB, так как с человеческой точки зрения ужасно работать - я бы предположил, что HSV/HSL или YUV являются более подходящими. Я также рекомендовал бы следующую статью: http://www.iquilezles.org/www/articles/wavelet/wavelet.htm. Пока он использует вейвлет-сжатие на изображениях, в нем есть интересный раздел о том, как мы воспринимаем изображения и цвета. В частности, он демонстрирует, насколько мы более чувствительны к свету/темноте, чем к фактическому оттенку. Хорошее чтение - попробуйте начать с «Цветных изображений» – enhzflep

ответ

1

Это называется colour difference в науке о цвете и существует несколько алгоритмов для вычисления его, вот некоторые из них:

  • Delta E CIE 1976
  • Delta E CIE 1994
  • Delta E CIE 2000
  • Delta E CMC

Брюс Lindbloom имеет calculator и Colour обеспечивает vectorised Python implementation. Вам необходимо будет преобразовать RGB в CIE Lab перед тем, как использовать любой Delta E.

Есть также colour difference расчеты, осуществляемые на вершине CIECAM02 цвета внешний вид модели, и особенно CAM02-UCS colourspace, что является более равномерная версия CIECAM02, лежащей в основе colourspace.

Смежные вопросы