![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 764 Pomógł: 3 Dołączył: 30.04.2003 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
chciałbym przygotować mechanizm, który automatycznie poddajcie analizie określone zdjęcia i następnie generuje dla niego 5-6 podstawowych kolorów które najtrafniej określają kolorystykę dane zdjęcia. Coś podobne załóżmy jak tutaj (http://freszki.pl) np http://freszki.pl/freszka/548,videoegg czy http://www.dreamstime.com/royalty-free-sto...rs-image9781689 (dominant colors) czyli dla zdjęcia określone są podstawowe kolory i na bazie przypisanych tych wszystkich kolorów możliwe jest przygotowanie wyszukiwarki która znajdzie określone zdjęcia w podobnej kolorystyce. Spotkał się ktoś z Was z takimi mechanizmami (jakimiś gotowymi bibliotekami) i ma pomysł jak "szybko" i sprawnie coś takiego przygotować? Pozdrawiam, mhs. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ja właśnie walczę z identycznym zagadnieniem
![]() Kolor można określać na 2 sposoby - albo jako RGB (lub CMYK) albo jako wartość jasności, odcienia i nasycenia. Myślę, że najskuteczniej będzie zbadać przy dodawaniu odcień i nasycenie; przy wybieraniu zakres +/- 30 dla odcienia (wartości możliwe od -180 do +180) oraz doświadczalnie jasność. Wybieranie tego po RGB czy CMYK jest strasznie karkołomne - tam trudno zobaczyć które kolory są podobne. Jeśli chcesz się pobawić i zobaczyć jak te wartości wpływają na kolor ściągnij GIMP`a (http://gimp.org), zrób nowy obrazek i kliknij w górnej belce Color > Hue-saturation a następnie baw sie suwakami. Jak implementować to w php? Na razie nie wiem ![]() -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
Określić "odległość" koloru od środka zakresu kolorów, a potem posortować i wziąć najmniejszą?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Określić "odległość" koloru od środka zakresu kolorów, a potem posortować i wziąć najmniejszą? Moglbys dokladniej opisac metode znalezienia podobnych? Zauwaz ze biorac odleglosc od srodka uwzgledniasz chyba tylko zmiane jasnosci ale nie juz odcienia wiec rozowy tym sposobem nie bedzie podobny do czerwonego, hmmmmm EDIT: Napisałem taką klasę:
Przykład użycia:
Klasa ładnie wygciąga najczęściej występujący kolor ale dla tapety 1280x1024 jest dość wolna gdy analizuje się każdy pixel ($pixProbX oraz $pixProbY na 1), jeśli natomiast zmniejszy się dokładność o 10x to działa szybko no ale.... ![]() Ma ktoś inny pomysł? Dodatkowo pozostaje kwestia porównania. EDIT2: Wracam z nowym kodem ![]() ![]()
Ten post edytował kiler129 14.12.2010, 09:48:13 -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 200 Pomógł: 38 Dołączył: 1.12.2010 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Ja bym mimo wszystko liczył dla RGB, najpierw policzył wszystkie pixele, następnie zaniedbał 10% podobnych, posortował i wydrukował wynik. Jasność wydaje mi się tutaj trochę uszkadzaniem takiego algorytmu np. dla zdjęć szarych. Operując na RGB i procentach w odchyleniu standardowym zawsze będzie działać - przynajmniej w teorii. Zagadnienie na tyle Ciekawe, że chyba spróbuje sam coś takiego napisać i zamieszczę oczywiście rozwiązanie tutaj. Pomysł jest jeszcze jeden. Przeskalować obrazek na 10-30 razy mniejszy i dla takiego sprawdzić bez zaniedbywania. Możliwości spajania kolorów przez funkcje zmniejszające obrazki wydają mi się na tyle dobre, żeby można było je wykorzystywać również do takich celów.
-------------------- Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
. Pomysł jest jeszcze jeden. Przeskalować obrazek na 10-30 razy mniejszy i dla takiego sprawdzić bez zaniedbywania. Możliwości spajania kolorów przez funkcje zmniejszające obrazki wydają mi się na tyle dobre, żeby można było je wykorzystywać również do takich celów. Też o tym słyszałem tyle i myślałem lecz w kontekście zmniejszenia do 1x1px. Jest jednak jeden problem - różne subwersje GD generują różne wyniki dla takiej operacji przez co można sobie zrobić niezły bałagan po aktualizacji php ![]() Co do rozwiązania to gdyby moją klasę zmodyfikować tak aby najpierw skalowała np. do 200x200px [gdzie obrazek wtedy jest już analizowany szybko] można zastosować metodę mostUsedColor(10) a następnie wyciągać średnią z tych 10 najczęściej użytych. Wtedy będzie to chyba najsensowniejsze. -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 200 Pomógł: 38 Dołączył: 1.12.2010 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Pierwsza wersja mojego pomysłu z zmniejszaniem zdjęć i zaniedbywaniem kolorów poniżej. Dużo się można jeszcze przyczepić, w każdym razie obrazek 2048x1536 przerobiła w niecałe 5 sekund.
Dostaje w zamian trochę większy czas obliczen dla małych zdjęć, ale krótszy dla większych zdjęć - porównywanie wykonałem testując twoją klasę moim testem na tych samych 3 obrazkach.
EDIT: zauważylem, że mamy różne kolory dla największych ostatnich obrazków - zaraz sprawdzę dlaczego tak się stało, ale wydaje mi się, że jest to wynik uproszczenia, które ja stosuje i wiążącego się z nim błędu ostatniego koloru w tablicy $identmap. Ten post edytował Quadina 14.12.2010, 13:52:46 -------------------- Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
No ja obecnie zrobiłem to chyba prościej:
I obrazek 12Mpx robi w 15ms. Pokaż obrazek abyśmy testowali na tym samym ![]() -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 200 Pomógł: 38 Dołączył: 1.12.2010 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Przygotuje paczkę jak wrócę do domu, teraz wychodzę akurat z roboty ;-) Może odezwij się do mnie na GG to spokojnie przedyskutujemy sprawę optymalizacji - ja strasznie lubię takie tematy ;-)
-------------------- Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Hmmm... Imagick::getImageHistogram()?
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
Hmmm... Imagick::getImageHistogram()? Brak dokumentacji oraz niedostępność imagemagic na sporej ilości serwerów raczej ją dyskwalifikuje ![]() @Quadina - napisz na moje gg: 6388911 [niewidok] -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 200 Pomógł: 38 Dołączył: 1.12.2010 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Histogram Imagicka jest wolny, dla mojego zdjęcia tego 100x100 generował całą sekundę dalej nie sprawdzałem, bo się przeraziłem użyciem pamięci. Przy czym mój skrypt użył 1/10 z tego, więc używanie magicka chyba nie jest optymalne. Po za tym link do bardzo dobrej dokumentacji funkcji, ale w pierwszym przykładzie widzę pewien błąd ;-) Bez urazy, ale lista posortowanych pixeli nas raczej nie interesuje, bo to jesteśmy sobie w stanie zrobić sami - patrząc po czasach nawet znacznie szybciej.
-------------------- Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Brak dokumentacji oraz niedostępność imagemagic na sporej ilości serwerów raczej ją dyskwalifikuje Dokumentacji szukaj na stronach samego ImageMagicka (w końcu te PHPowe obiekty to tylko interfejs dla zewnętrznego programu). Co do dostępności - niedostępny będzie na większości serwerów współdzielonych, czyli takich na których za używanie powyższych skryptów za po krótkim okresie czasu konto zostanie zawieszone. ![]() Cytat Histogram Imagicka jest wolny, dla mojego zdjęcia tego 100x100 generował całą sekundę dalej nie sprawdzałem JPEG, 1152x864, 218 KiB - około 0.1 sekundy.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 200 Pomógł: 38 Dołączył: 1.12.2010 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Spoko, sprawdzimy wszystko, sprawdzimy ;-) Własnie instalujemy środowisko testowe, żeby sprawdzić wszystko na większych paczkach danych.
-------------------- Warsztat: NetBeans 7.2 Beta, PHP, MySQL, PostgreSQL, Symfony (<=1.4), Diem, Java, Sieci neuronowe
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 566 Pomógł: 35 Dołączył: 21.06.2006 Ostrzeżenie: (0%) ![]() ![]() |
/** JESLI SZUKASZ ROZWIAZANIA UZYJ KODU Z KONCA TEGO POSTU **/
Problem (chyba) rozwiązany. Godzinę wikipedii później i pisania na stackoverflow mam taki oto kod:
Obliczy różnicę między dwoma kolorami w przestrzeni L A B - inaczej się ponoć tego dobrze nie da zrobić. Teraz tylko spiąć to z kolorami pixeli zdjęć i gotowe. Edit Post jest za dlugi bla bla bla: http://wklej.org/id/438798/ - poddaje sie Edit Ok, udało się porównać kolory, dodanie tego do fotek to już nie problem. Kod klasy:
Kod testowy [+ dane testowe]: http://wklej.org/id/439719/ Ten post edytował kiler129 17.12.2010, 16:34:02 -------------------- flexiCMS v2 [|||||||+--] 75% done
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.06.2025 - 12:42 |