Этот алгоритм Вам может понадобиться когда например нужно перекодировать картинку с одной палитры на другую. Для решения рассмотрим более простую задачу - нужно найти в некоторой палитре из 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); }
8 8 8
| |