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)