![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 7.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
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:
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ć... Ten post edytował DooBLER 6.04.2010, 15:53:33 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 56 Pomógł: 0 Dołączył: 5.07.2008 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 7.08.2006 Ostrzeżenie: (0%) ![]() ![]() |
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? |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 4 Dołączył: 13.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Zależy jak bardzo jesteś zawzięty
![]() 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. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 10:59 |