Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/GD2] porównywanie kolorów
Forum PHP.pl > Forum > PHP
DooBLER
Witam.

Chciał bym zapytać, czy ktoś wie jakiego algorytmu powinno się używać żeby jak najdokładniej porównać kolory?

Chodzi mi o sytuację, w której mam jeden kolor (nazwijmy go podstawowy) i muszę wybrać spośród kilku innych kolorów najbardziej podobny do tego podstawowego.

W internecie znalazłem coś o geometrii Euklidesowej.
Czyli potraktować kolor ( r,g,b ) jako punkt znajdujący się w sześcianie i obliczać po prostu odległość punktów w przestrzeni 3D za pomocą wzoru:
  1. sqrt( pow(r1-r2,2) + pow(g1-g2,2) + pow(b1-b2,2))

dla zmniejszenia ilości obliczeń można pominąć pierwiastek bo nie wpływa on na wartość porównania.

Jednak rozwiązanie takie nie do końca się sprawdza.
Poniższy przykład zaczerpnąłem z forum EP z tematu, który niestety umarł w 2006 roku:


według wzoru podanego wyżej bardziej podobny do podstawowego jest kolor 1, jednak "na oko" widać, że kolor 2 bardziej pasuje.

Nie bardzo wiem co z tym zrobić...
Piro
Widzę przynajmniej 2 sposoby:

1) Porównujesz tylko 2 barwy i liczysz najmniejsze odchylenia od koloru podstawowego (nie jest to idealne rozwiązanie)
Pytanie 1 - którą barwę wybrać jako podstawową:
Oczywiście barwę która ma największą wartość.
Pytanie 2 - jak to porównać:
W pierwszej kolejności sprawdzasz czy istnieje barwa o takiej samej wartości koloru głównego. Jeżeli istnieje kilka takich barw porównujesz kolory 'poboczne' tych barw. Jeżeli nie istnieje taka barwa to szukasz najmniejszego odchylenia od wartości podstawowej.

2) Można oczywiście zrobić dużą bazę/tabelę z przedziałami kolorów podobnych (nie opłaca się rozpisywać całego RGB). Konieczne jest dodanie 'skali' podobieństwa. Po wybraniu kilku kolorów można porównać twoim sposobem. To wyeliminuje widoczne gołym okiem błędy w porównaniu.



PS. Twój sposób jest dobry ponieważ praktycznie kolor nr1 jest bardziej podobny niż kolor nr2 (wg. komputer) jeżeli chodzi o człowieka to człowiek wyłapuje kolor główny tak jak to napisałem w sposobie pierwszym.

Pozdrawiam,
Piro
DooBLER
Witam i dzięki za odpowiedź.

Zacznę od tego, że sposób 2 czyli z bazą podobnych kolorów odpada na pweno.

Muszę wykombinować jakiś w miarę skuteczny algorytm.


Bawiłem się wczoraj z tym "moim" tyle, że przed sprawdzeniem przeliczyłem kolory do palety hsv/hsb i kolory z poprzedniego przykładu zostały wtedy wybrane tak jak oko podpowiada.
Nie jestem tylko pewny czy w tym wariancie przy jakichś innych kolorach nie będzie dziwnych wyników.

Prawdopodobnie przy palecie hsv/hsb trzeba by też użyć jakichś wag do poszczególnych składowych ponieważ h może mieć wartości od 0 - 359, s 0 - 100 i v/b 0 - 100

Może ktoś ma na to jakiś sprawdzony sposób?
aio
Zależy jak bardzo jesteś zawzięty winksmiley.jpg
Bo te same wartości B w HSB mają różną jasność odczuwalną dla R,G,B. Więc jeśli Ci zależy na porównaniu w systemie HSP (P - Perceived Brightness) to ja kiedyś posiłkowałem się tym: http://alienryderflex.com/hsp.html
aczkolwiek później wyciągnąłem wg mnie lepsze wagi do obliczania P z Photoshopa:
Kod
//Photoshop extruded
$PERCEIVE = array (
    RGB => array (
        RED => 0.341607834,
        GREEN => 0.544522888,
        BLUE => 0.113869278
    ),
    RYB => array (
        RED => 0.281081081,
        YELLOW => 0.524324324,
        BLUE => 0.194594595
    )
);

RGB, RYB - to modele mapowania hue
Potrzebne to jest wtedy gdy porównujesz kolory o podobnym oddaleniu H i S wtedy porównanie wg B może być wadliwe.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.