Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP][grafika] Detekcja barwy zdjęcia (kolor czy monochromatyczne?).
Forum PHP.pl > Forum > Przedszkole
suny79
Witam,

szukam i szukam i nie mogę się doszukać, postanowiłem więc zasięgnąć tu pomocy. Otóż potrzebuję szybko sprawdzić w php i javascript czy zdjecie wgrywane na serwer jest czarnobiałe czy kolorowe. Próbowałem kilku funkcji z rodziny image..
- imagecolorexact
- imagecolorstotal itp.

Nic nie udało mi się osiągnąć. Czy macie jakieś doświadczenie w tym temacie?

Z góry dziękuję za pomoc.
Włodek.
ayeo
Witam!

Nie wiem czy to najlepsze rozwiązanie (w zasadzie wiem, że nie), ale... Możesz lecieć po kolei po wszystkich pikselach i sprawdzać czy R == G == B. Jeśli nie to zdjęcie jest kolorowe biggrin.gif

Pozdrawiam!
suny79
To ciekawe, nie wiem na ile wydajne, ale jeśli nie ma innej szybszej metody to przetestuję tą. Ew. może by szybko z resizować obrazek do np. 100x100 i wykonać te czynności na miniaturce? Jeśli obrazek ma np. rozdz. 800x600 to już się robi prawie pół miliona operacji....

Na pewno musi istnieć jakaś szybka metoda smile.gif

Pozdrawiam,
Włodek.
thek
Co masz na myśli pod pojęciem "czarno-białe"? Że faktycznie ma ono tylko te dwa kolory, czy może jeszcze odcienie szarości? Jeśli to pierwsze to Masz tylko 2 kolory w całym obrazie. Jeśli to drugie to maksymalnie 256, przy czym ich rozkład jako RGB jest taki jak wspomniany przez ayeo. Skala szarości charakteryzuje się bowiem tym, że wszystkie składowe koloru mają tę samą wartość. Możesz więc nawet, jeśli chcesz, na podstawie analizy kolorów obrazu łatwo zbudować histogram dzięki temu.
woodzu
Powinienieś zainteresować się funkcjami Imagick::getImageColorspace ( ewentualnie Imagick::getImageDepth)

  1. Imagick::getImageColorspace

może zwrócić:

  • 0 - UndefinedColorspace
  • 1 - RGBColorspace
  • 2 - GRAYColorspace
  • 3 - TransparentColorspace
  • 4 - OHTAColorspace
  • 5 - LABColorspace
  • 6 - XYZColorspace
  • 7 - YCbCrColorspace
  • 8 - YCCColorspace
  • 9 - YIQColorspace
  • 10 - YPbPrColorspace
  • 11 - YUVColorspace
  • 12 - CMYKColorspace
  • 13 - sRGBColorspace
  • 14 - HSBColorspace
  • 15 - HSLColorspace
  • 16 - HWBColorspace


ciebie interesuje nr.2
thek
Woodzu, jest tylko jedno ALE. Nawet jeśli obraz będzie w skali szarości, ale zapisany jako RGBColorspace to i tak pokaże mu w wyniku 1, a nie 2 zapewne winksmiley.jpg A my tu mówimy chyba o rozpoznaniu już niezależnym od colorspace wpisanym do pliku. Nie zaś wynikającym tego, że paleta kolorów jest zapisana w pliku jako określony rodzaj. A przynajmniej ja tam mniemam.
woodzu
ok racja, w sumie można tego użyć tylko na wstępie żeby niepotrzebnie nie wywołać iteracji po pikselach kiedy zdjęcie jest i tak monochromem, odciążymy tym trochę CPU, jesli zwróci fase wtedy np. sprawdzania ok 20 losowych pikseli

co wy na to?

przykład na:
http://www.php.net/manual/en/function.imagecolorat.php#71444
thek
Można robić losowe piksele, ale ich liczba musi być większa niż 20, bo a nuż będziesz miał pecha i trafisz dokładnie w 20 o skali szarości. W każdym razie sprawdzenie monochroma na starcie głupim pomysłem nie jest, o ile ma się magika jako rozszerzenie zainstalowane smile.gif
woodzu
widziałem kiedyś funkcje w C++, która robi dokładnie to o co kolega pytał... bede miał troche czasu to poszperam jeszcze

edit.

znajdę ją jeżeli ktoś będzie zainteresowany żeby sobie napisać taki program w C++

na razie znalazłem gotowe rozwiązanie które używa GDLib http://www.roseindia.net/tutorial/php/phpg...sgrayscale.html
suny79
Witam i dziękuję wszystkim za pomoc.

Potestowałem ten skrypt http://www.roseindia.net/tutorial/php/phpg...sgrayscale.html

i działa bardzo dobrze. Wykrywa zdjęcia kolorowe i czarnobiałe tj. w skali szarości.

Zbyt duże pliki (nie wiem, dokładnie gdzie jest granica, ale dostałem błąd dla pliku 300KB) nie są procesowane ze względu na brak pamięci dla usera serwera php. Poradziłem sobie tak, że robię resize w locie i wykonuje skrypt dla zdjęć pomniejszonych. Działa pięknie. Przykład dla zdjęcia 2,8MB:

The image is grayscale.
Executed in 0.550637960434 seconds

Taki performance mi jak najbardziej odpowiada smile.gif


Pozdrawiam,
Włodek.
thek
No przecież to dokładnie to co jest w jednym z pierwszych postów smile.gif Sprawdzenie wszystkich pikseli obrazu pod kątem równości R, G i B. Konkretnie to sprawdza ile jest takich co mają równe pary R = G i R = B i w takim wypadku inkrementuje licznik. Jeśli na końcu licznik będzie równy wysokość razy szerokość to jest to skala szarości. Tak więc nic więcej niż już proponowaliśmy smile.gif
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.