Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP/GD] Znajdowanie dominujących kolorów obrazka, żeby było łatwiej z predefiniowaną paletą
c2h5oh
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
zimi
post
Post #2





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Cosi*
post
Post #3





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 9.07.2007
Skąd: Dąbrowa Górnicza

Ostrzeżenie: (0%)
-----


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.


--------------------
http://cosi.com.pl
<? $kate or die ?>
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 08:59