Re: findcolor

From
Sergey Andrianov (2:5020/1507.400)
To
Yury Benesh
Date
2002-10-09T19:38:06Z
Area
RU.ALGORITHMS
Здравствуй, Yury!

Однажды 08-Oct-02  в 16:06   Yury Benesh (2:454/21.43)
написал       All    по поводу
-=-   findcolor  -=-

YB> дан массiв iз 256 элементов (палiтpа), каждый элемент опiсывает цвет:
YB> record
YB> case LongInt of
YB> 0: b,g,r,align:byte;
YB> 1: longw:longint;
YB> end;

YB> пользователь задает r,g,b компоненты цвета, iз данного массiва находiтся
YB> наiболее блiжнiй цвет i возвpаўается его iндекс.

YB> каков будет алгоpiтм?
YB> пpобовал такой алгоpiтм, котоpый сpабатывает не всегда, не соблюдается
YB> соотношенiе цветовых составляюўiх (т.е. вместо кpасноватого оттенка 
YB> выбipается сiневатый i т.д.):

YB> pattern:longint; // aling,r,g,b для поiска, запакованные в dword
YB> newmatch,lastmatch:longint;
YB> lastcolor:byte;

YB> lastcolor:=0;
YB> lastmatch:=$0FFFFFFF;

YB> for n:=0 to 255 do
YB> begin
YB> newmatch:=abs(pal[n].longw-pattern);
YB> if newmatch<lastmatch then begin lastmatch:=newmatch;lastcolor:=n;end;
YB> end;

	В общем случае минимизировать надо функцию
	Kr*(R'-R)^N + Kg*(G'-G)^N + Kb*(B'-B)^N
	Обычно принимают, что Kr = 0.3, Kg = 0.59, Kb = 0.11, N = 1, но можно выбрать
и свои.
	Твоя формула также подпадает под это определение, только коэффициенты очень
неудачно подобраны: Kb = 1, Kg = 256, Kr = 65536, в результате чего подбирается
цвет максимально близкий по интенсивности красного, а остальными составляющими
по существу пренебрегается. 

                  До свидания,  в  20:30 MSK
                                 Sergey

---
 * Origin: Sergiev Posad (2:5020/1507.400)