Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Obliczanie kolorowej powierzchni w pliku graficznym
Grzeniu
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.10.2017

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


Cześć,

nie potrafiłem znaleźć podobnego tematu w Google, więc za wczasu spytam, czy realizacja poniższego pomysłu w PHP ma sens, o ile jest w ogóle wykonalna.

Załóżmy, że mam JPG 200x200px z białym tłem i czerwonym trójkątem na środku. Chciałbym wiedzieć, jaką powierzchnię ma ten trójkąt - może to być przykładowo % całego obrazu. Jedyny pomysł jaki przyszedł mi do głowy, to przelatywanie piksel po pikselu i odczytywanie wartości koloru, później zliczanie.

Docelowo chciałbym znać jaki % (lub powierzchnia) w obrazku jest zajęta przez kolory inne niż tło - kolor tła mogę wziąć z piksela 0x0y.

Czy ktoś ma pomysł jak się do tego zabrać? Czy nie PHP-ędy droga?

Miłęgo,
Grzegorz
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Tomplus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Nie ma innego sposobu.
Chyba że poszukujesz skomplikowane algorytmy które dokładnie wizualizują co jest na obrazie.

Jednakże jeżeli wiesz że tło będzie zawsze jednolite np. białe, to możesz wyszukać parametry 3 prostych i w ten sposób stworzyć trójkąt.
Go to the top of the page
+Quote Post
trueblue
post
Post #3





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


W Imagick jest gotowa funkcja do tego: http://php.net/manual/en/imagick.getimagehistogram.php


--------------------
Go to the top of the page
+Quote Post
Grzeniu
post
Post #4





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.10.2017

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


Cytat(trueblue @ 24.10.2017, 21:16:21 ) *
W Imagick jest gotowa funkcja do tego: http://php.net/manual/en/imagick.getimagehistogram.php


Dzięki, dokładnie tego szukałem. Poniżej wstępny kod, który bierze kolor piksela 0x0y i oblicza %, jaki ten kolor zajmuje w obrazku. W moim przypadku dużo rzeczy jeszcze w kodzie pozmieniam, ale wrzucam, jeżeli w przyszłości ktoś będzie miał podobny pomysł.

  1. <?php
  2. $image = new Imagick("imagick/test.jpg");
  3.  
  4. // okreslenie koloru tla na podstawie piksela x0 y0
  5. $pierwszy_piksel = $image->getImagePixelColor(0, 0) -> getColor();
  6. $kolor_tla = $pierwszy_piksel['r'].$pierwszy_piksel['g'].$pierwszy_piksel['b'];
  7.  
  8. // okreslenie powierzchni calego obrazka
  9. $d = $image->getImageGeometry();
  10. $w = $d['width'];
  11. $h = $d['height'];
  12. $area = $d['width']*$d['height'];
  13.  
  14. echo "rozmiar: ".$d['width']."px × ".$d['height']."px — ".$area;
  15. echo "<br><br>";
  16.  
  17. // <a href="http://php.net/manual/en/imagick.getimagehistogram.php" target="_blank">http://php.net/manual/en/imagick.getimagehistogram.php</a>
  18. $pixels=$image->getImageHistogram();
  19.  
  20. foreach($pixels as $p){
  21. if ($p->getColorCount() > 10){ // pozbywa się pikseli antyaliasingu i artefaktów powstałych przy kompresji PHP
  22. $kolor = $p->getColor()['r'].$p->getColor()['g'].$p->getColor()['b'];
  23. if ($kolor == $kolor_tla){ // znajdz dane koloru tla
  24. echo $kolor." - ".$p->getColorCount()." - ".(100*$p->getColorCount()/$area)."%"; // oblicz % znalazionego koloru
  25. break;
  26. }
  27. }
  28. }
Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


A czy wstępna posteryzacja obrazu nie uwolni Cię od sprawdzania czy dany piksel jest artefaktem czy też pochodzi z antialiasingu?
http://php.net/manual/en/imagick.posterizeimage.php


--------------------
Go to the top of the page
+Quote Post
Grzeniu
post
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 24.10.2017

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


Cytat(trueblue @ 26.10.2017, 09:21:39 ) *
A czy wstępna posteryzacja obrazu nie uwolni Cię od sprawdzania czy dany piksel jest artefaktem czy też pochodzi z antialiasingu?
http://php.net/manual/en/imagick.posterizeimage.php


Świetna rzecz. Muszę przejrzeć możliwości imagick, bo rzeczywiście przydatnych funkcji multum. Dziękuję za cynk.
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: 22.08.2025 - 00:37