:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте ::
Путь: Графика » Поиск ближайшего цвета
  Поиск ближайшего цвета в палитре



Этот алгоритм Вам может понадобиться когда например нужно перекодировать картинку с одной палитры на другую. Для решения рассмотрим более простую задачу - нужно найти в некоторой палитре из n цветов, цвет максимально похожий на некоторый заданный цвет.

Введем обозначения:

(R0,G0,B0) - цвет, аналог которого нужно найти в палитре.
(Ri,Gi,Bi) - i-тый цвет в палитре.

Различие цветов будем оценивать с помощью следующей функции:

fi = 30*(Ri-R0)2+59*(Gi-G0)2+11*(Bi-B0)2.

Множители 30;59;11 - отражают различную чувствительность человеческого глаза к красному,зеленому и синему цветам соответственно. Далее мы поочереди перебираем все цвета палитры и ищем цвет, для которого fi принимает минимальное значение. Это и будет искомый цвет.

 // структуры
 typedef struct RGB_type
 {
 char r,g,b;
 } RGB;

 typedef struct Pal_type
 {
 int n;   // число цветов в палитре
 RGB* C;
 } Pal;

 // это подпрограмма поиска
 // P - палитра
 // С - цвет, который требуется найти
 // Возвращаемое значение - индекс цвета в палитре
 int FindColor(Pal *P,RGB *C)
 {
    int i, fi, best_color, f_min=1000000;
    for(i=0;i<P->n,i++)
       {
       fi=30*(P->C.r-C->r)*(P->C.r-C->r)+
          59*(P->C.g-C->g)*(P->C.g-C->g)+
          11*(P->C.b-C->b)*(P->C.b-C->b);
       if(fi<f_min){best_color=i,f_min=fi;}
       }
    return(best_color); }