Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/GD] Znajdowanie dominujących kolorów obrazka
Forum PHP.pl > Forum > PHP
c2h5oh
Mam predefiniowaną paletę kilkudziesięciu kolorów (40-50) i obrazki. Dla każdego z nich muszę znaleźć 3-4 dominujące w nim kolory z tej palety (nie jest wymagana 100% zgodność kolor piksela-kolor z palety).

Zastanawiam się jak to sensownie zrobić, póki co wymyśliłem, że:
1. Nie ma sensu pracować na dużym obrazku - miniatura 100x100px, którą i tak generuje, wystarczy w zupełności
2. Najprościej (i najdokładniej) byłoby zrzutować tą miniaturę na zadaną paletę i zrobić histogram. Miałoby to również tę zaletę, iż mógłbym bardzo prosto odrzucić kolor tła - wystarczyłoby ignorować kolor zajmujący np ponad 30%. Problem polega na tym, że nie mam pomysłu jak to sensownie zrobić.
Potraktować barwy składowe jako współrzędne w przestrzeni trójwymiarowej i szukać najbliższego punktu? Wymagałoby to liczenia odległości każdego piksela od wszystkich kolorów w palecie i wyboru najmniejszej - czyli dla 40 kolorów i miniatury 100x100px byłoby to 100x100x40 = 400 000 sqrt((x1-x2)^+(y1-y2)^2+(z1-z2)^2) i tyle samo porównań, czyli delikatnie mówiąc paskudnie wydajnościowo.
Co prawda takich operacji nie będzie wiele (max 100-200 na dobę, co będzie stanowić <0,05%), ale i tak wolałbym tego uniknąć.

Ma ktoś jakiś lepszy pomysł? Może być kosztem dokładności, pod warunkiem, że błędne rzutowanie będzie w granicach kilku procent.
zimi
Cytat
Mam predefiniowaną paletę kilkudziesięciu kolorów (40-50) i obrazki. Dla każdego z nich muszę znaleźć 3-4 dominujące w nim kolory

albo coś kombinujesz albo Ciebie nie rozumiem
musisz znaleźć kilka dominujących kolorów
których masz 50, te kolory zamieniasz na hex i wpisujesz jako klucz tablicy
przelatujesz po obrazku sprawdzając kolor każdego piksela za pomocą imagecolorat" title="Zobacz w manualu PHP" target="_manual, zamieniasz to na stringa w hex i zwiększasz wartość tablicy o kluczu który masz w tym stringu, sortujesz wg wartości tablicy z zachowaniem przyporządkowania kluczy wybierasz 4 od góry i czytasz ich klucze i masz swoje 4 kolory
Cosi*
Możesz ewentualnie zrobić tak, z tym że byłoby to raczej mało optymalne:
Dla każdego piksela pobierasz jego składowe, a następnie lecisz przez paletę (for/break) sprawdzając "odległość" poszczególnych składowych od składowych kolorów z palety. Żeby przyspieszyć operację, możesz sortować paletę tak, żeby kolory dominujące wychodziły na początek (dzięki temu dla następnych pikseli wystarczy mniej iteracji).
Ot, tak sobie wymyśliłem, ale obawiam się, że to może być dość wooolne. Zawsze można zrobić tak jak napisał zimi, czyli histogram, a potem porównanie dominantów do palety.
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.